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.
- universal_mcp/__init__.py +0 -2
- universal_mcp/analytics.py +75 -0
- universal_mcp/applications/application.py +27 -5
- universal_mcp/applications/calendly/app.py +413 -160
- universal_mcp/applications/coda/README.md +133 -0
- universal_mcp/applications/coda/__init__.py +0 -0
- universal_mcp/applications/coda/app.py +3704 -0
- universal_mcp/applications/e2b/app.py +6 -7
- universal_mcp/applications/firecrawl/app.py +1 -1
- universal_mcp/applications/github/app.py +41 -42
- universal_mcp/applications/google_calendar/app.py +20 -20
- universal_mcp/applications/google_docs/app.py +22 -29
- universal_mcp/applications/google_drive/app.py +53 -59
- universal_mcp/applications/google_mail/app.py +40 -40
- universal_mcp/applications/google_sheet/app.py +44 -51
- universal_mcp/applications/markitdown/app.py +4 -4
- universal_mcp/applications/notion/app.py +93 -83
- universal_mcp/applications/perplexity/app.py +5 -5
- universal_mcp/applications/reddit/app.py +32 -32
- universal_mcp/applications/resend/app.py +4 -4
- universal_mcp/applications/serpapi/app.py +4 -4
- universal_mcp/applications/tavily/app.py +4 -4
- universal_mcp/applications/wrike/app.py +566 -226
- universal_mcp/applications/youtube/app.py +626 -166
- universal_mcp/applications/zenquotes/app.py +3 -3
- universal_mcp/exceptions.py +1 -0
- universal_mcp/integrations/__init__.py +11 -2
- universal_mcp/integrations/integration.py +2 -2
- universal_mcp/logger.py +3 -56
- universal_mcp/servers/__init__.py +2 -1
- universal_mcp/servers/server.py +76 -77
- universal_mcp/stores/store.py +5 -3
- universal_mcp/tools/__init__.py +1 -1
- universal_mcp/tools/adapters.py +4 -1
- universal_mcp/tools/func_metadata.py +5 -6
- universal_mcp/tools/tools.py +108 -51
- universal_mcp/utils/docgen.py +121 -69
- universal_mcp/utils/docstring_parser.py +44 -21
- universal_mcp/utils/dump_app_tools.py +33 -23
- universal_mcp/utils/openapi.py +121 -47
- {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/METADATA +2 -2
- universal_mcp-0.1.8rc3.dist-info/RECORD +75 -0
- universal_mcp-0.1.8rc2.dist-info/RECORD +0 -71
- {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/WHEEL +0 -0
- {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/entry_points.txt +0 -0
universal_mcp/utils/openapi.py
CHANGED
@@ -73,27 +73,27 @@ def determine_return_type(operation: dict[str, Any]) -> str:
|
|
73
73
|
def resolve_schema_reference(reference, schema):
|
74
74
|
"""
|
75
75
|
Resolve a JSON schema reference to its target schema.
|
76
|
-
|
76
|
+
|
77
77
|
Args:
|
78
78
|
reference (str): The reference string (e.g., '#/components/schemas/User')
|
79
79
|
schema (dict): The complete OpenAPI schema that contains the reference
|
80
|
-
|
80
|
+
|
81
81
|
Returns:
|
82
82
|
dict: The resolved schema, or None if not found
|
83
83
|
"""
|
84
|
-
if not reference.startswith(
|
84
|
+
if not reference.startswith("#/"):
|
85
85
|
return None
|
86
|
-
|
86
|
+
|
87
87
|
# Split the reference path and navigate through the schema
|
88
|
-
parts = reference[2:].split(
|
88
|
+
parts = reference[2:].split("/")
|
89
89
|
current = schema
|
90
|
-
|
90
|
+
|
91
91
|
for part in parts:
|
92
92
|
if part in current:
|
93
93
|
current = current[part]
|
94
94
|
else:
|
95
95
|
return None
|
96
|
-
|
96
|
+
|
97
97
|
return current
|
98
98
|
|
99
99
|
|
@@ -206,8 +206,8 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
206
206
|
tuple: (method_code, func_name) - The Python code for the method and its name.
|
207
207
|
"""
|
208
208
|
# Extract path parameters from the URL path
|
209
|
-
path_params_in_url = re.findall(r
|
210
|
-
|
209
|
+
path_params_in_url = re.findall(r"{([^}]+)}", path)
|
210
|
+
|
211
211
|
# Determine function name
|
212
212
|
if "operationId" in operation:
|
213
213
|
raw_name = operation["operationId"]
|
@@ -223,16 +223,40 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
223
223
|
else:
|
224
224
|
name_parts.append(part)
|
225
225
|
func_name = "_".join(name_parts).replace("-", "_").lower()
|
226
|
-
|
226
|
+
|
227
227
|
# Only fix isolated 'a' and 'an' as articles, not when they're part of words
|
228
|
-
func_name = re.sub(
|
229
|
-
|
230
|
-
|
231
|
-
func_name = re.sub(
|
228
|
+
func_name = re.sub(
|
229
|
+
r"_a([^_a-z])", r"_a_\1", func_name
|
230
|
+
) # Fix for patterns like retrieve_ablock -> retrieve_a_block
|
231
|
+
func_name = re.sub(
|
232
|
+
r"_a$", r"_a", func_name
|
233
|
+
) # Don't change if 'a' is at the end of the name
|
234
|
+
func_name = re.sub(
|
235
|
+
r"_an([^_a-z])", r"_an_\1", func_name
|
236
|
+
) # Fix for patterns like create_anitem -> create_an_item
|
237
|
+
func_name = re.sub(
|
238
|
+
r"_an$", r"_an", func_name
|
239
|
+
) # Don't change if 'an' is at the end of the name
|
232
240
|
|
233
241
|
# Get parameters and request body
|
234
|
-
#
|
235
|
-
|
242
|
+
# Resolve parameter references before processing
|
243
|
+
resolved_parameters = []
|
244
|
+
for param in operation.get("parameters", []):
|
245
|
+
if "$ref" in param:
|
246
|
+
# Resolve reference to actual parameter object
|
247
|
+
ref_param = resolve_schema_reference(param["$ref"], full_schema)
|
248
|
+
if ref_param:
|
249
|
+
resolved_parameters.append(ref_param)
|
250
|
+
else:
|
251
|
+
print(
|
252
|
+
f"Warning: Could not resolve parameter reference: {param['$ref']}"
|
253
|
+
)
|
254
|
+
else:
|
255
|
+
resolved_parameters.append(param)
|
256
|
+
|
257
|
+
# Filter out header parameters from the resolved parameters
|
258
|
+
parameters = [param for param in resolved_parameters if param.get("in") != "header"]
|
259
|
+
|
236
260
|
has_body = "requestBody" in operation
|
237
261
|
body_required = has_body and operation["requestBody"].get("required", False)
|
238
262
|
|
@@ -240,34 +264,61 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
240
264
|
has_empty_body = False
|
241
265
|
if has_body:
|
242
266
|
request_body_content = operation["requestBody"].get("content", {})
|
243
|
-
if not request_body_content or all(
|
267
|
+
if not request_body_content or all(
|
268
|
+
not content for content_type, content in request_body_content.items()
|
269
|
+
):
|
244
270
|
has_empty_body = True
|
245
|
-
|
271
|
+
else:
|
272
|
+
# Handle empty properties with additionalProperties:true
|
273
|
+
for content_type, content in request_body_content.items():
|
274
|
+
if content_type.startswith("application/json") and "schema" in content:
|
275
|
+
schema = content["schema"]
|
276
|
+
|
277
|
+
# Resolve schema reference if present
|
278
|
+
if "$ref" in schema:
|
279
|
+
ref_schema = resolve_schema_reference(
|
280
|
+
schema["$ref"], full_schema
|
281
|
+
)
|
282
|
+
if ref_schema:
|
283
|
+
schema = ref_schema
|
284
|
+
|
285
|
+
# Check if properties is empty and additionalProperties is true
|
286
|
+
if (
|
287
|
+
schema.get("type") == "object"
|
288
|
+
and schema.get("additionalProperties", False) is True
|
289
|
+
):
|
290
|
+
properties = schema.get("properties", {})
|
291
|
+
if not properties or len(properties) == 0:
|
292
|
+
has_empty_body = True
|
246
293
|
|
247
294
|
# Extract request body schema properties and required fields
|
248
295
|
required_fields = []
|
249
296
|
request_body_properties = {}
|
250
297
|
is_array_body = False
|
251
298
|
array_items_schema = None
|
252
|
-
|
299
|
+
|
253
300
|
if has_body:
|
254
|
-
for content_type, content in
|
301
|
+
for content_type, content in (
|
302
|
+
operation["requestBody"].get("content", {}).items()
|
303
|
+
):
|
255
304
|
if content_type.startswith("application/json") and "schema" in content:
|
256
305
|
schema = content["schema"]
|
257
|
-
|
306
|
+
|
258
307
|
# Resolve schema reference if present
|
259
308
|
if "$ref" in schema:
|
260
309
|
ref_schema = resolve_schema_reference(schema["$ref"], full_schema)
|
261
310
|
if ref_schema:
|
262
311
|
schema = ref_schema
|
263
|
-
|
312
|
+
|
264
313
|
# Check if the schema is an array type
|
265
314
|
if schema.get("type") == "array":
|
266
315
|
is_array_body = True
|
267
316
|
array_items_schema = schema.get("items", {})
|
268
317
|
# Try to resolve any reference in items
|
269
318
|
if "$ref" in array_items_schema:
|
270
|
-
array_items_schema = resolve_schema_reference(
|
319
|
+
array_items_schema = resolve_schema_reference(
|
320
|
+
array_items_schema["$ref"], full_schema
|
321
|
+
)
|
271
322
|
else:
|
272
323
|
# Extract required fields from schema
|
273
324
|
if "required" in schema:
|
@@ -275,19 +326,27 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
275
326
|
# Extract properties from schema
|
276
327
|
if "properties" in schema:
|
277
328
|
request_body_properties = schema["properties"]
|
278
|
-
|
329
|
+
|
279
330
|
# Check for nested references in properties
|
280
331
|
for prop_name, prop_schema in request_body_properties.items():
|
281
332
|
if "$ref" in prop_schema:
|
282
|
-
ref_prop_schema = resolve_schema_reference(
|
333
|
+
ref_prop_schema = resolve_schema_reference(
|
334
|
+
prop_schema["$ref"], full_schema
|
335
|
+
)
|
283
336
|
if ref_prop_schema:
|
284
337
|
request_body_properties[prop_name] = ref_prop_schema
|
285
|
-
|
338
|
+
|
339
|
+
# Handle schemas with empty properties but additionalProperties: true
|
340
|
+
# by treating them similar to empty bodies
|
341
|
+
if (
|
342
|
+
not request_body_properties or len(request_body_properties) == 0
|
343
|
+
) and schema.get("additionalProperties") is True:
|
344
|
+
has_empty_body = True
|
286
345
|
|
287
346
|
# Build function arguments
|
288
347
|
required_args = []
|
289
348
|
optional_args = []
|
290
|
-
|
349
|
+
|
291
350
|
# Add path parameters
|
292
351
|
for param_name in path_params_in_url:
|
293
352
|
if param_name not in required_args:
|
@@ -296,12 +355,12 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
296
355
|
# Add query parameters
|
297
356
|
for param in parameters:
|
298
357
|
param_name = param["name"]
|
299
|
-
if param_name not in required_args:
|
358
|
+
if param_name not in required_args:
|
300
359
|
if param.get("required", False):
|
301
360
|
required_args.append(param_name)
|
302
361
|
else:
|
303
362
|
optional_args.append(f"{param_name}=None")
|
304
|
-
|
363
|
+
|
305
364
|
# Handle array type request body differently
|
306
365
|
request_body_params = []
|
307
366
|
if has_body:
|
@@ -313,13 +372,13 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
313
372
|
array_param_name = func_name.replace("_list_input", "")
|
314
373
|
elif "List" in func_name:
|
315
374
|
array_param_name = func_name.split("List")[0].lower() + "_list"
|
316
|
-
|
375
|
+
|
317
376
|
# Make the array parameter required if the request body is required
|
318
377
|
if body_required:
|
319
378
|
required_args.append(array_param_name)
|
320
379
|
else:
|
321
380
|
optional_args.append(f"{array_param_name}=None")
|
322
|
-
|
381
|
+
|
323
382
|
# Remember this is an array param
|
324
383
|
request_body_params = [array_param_name]
|
325
384
|
elif request_body_properties:
|
@@ -333,9 +392,9 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
333
392
|
request_body_params.append(prop_name)
|
334
393
|
if f"{prop_name}=None" not in optional_args:
|
335
394
|
optional_args.append(f"{prop_name}=None")
|
336
|
-
|
395
|
+
|
337
396
|
# If request body is present but empty (content: {}), add a generic request_body parameter
|
338
|
-
if has_empty_body:
|
397
|
+
if has_empty_body and "request_body=None" not in optional_args:
|
339
398
|
optional_args.append("request_body=None")
|
340
399
|
|
341
400
|
# Combine required and optional arguments
|
@@ -364,18 +423,19 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
364
423
|
body_lines.append(f" request_body = {request_body_params[0]}")
|
365
424
|
elif request_body_properties:
|
366
425
|
# For object request bodies, build the request body from individual parameters
|
367
|
-
|
426
|
+
|
368
427
|
body_lines.append(" request_body = {")
|
369
|
-
|
428
|
+
|
370
429
|
for prop_name in request_body_params:
|
371
430
|
# Only include non-None values in the request body
|
372
431
|
body_lines.append(f" '{prop_name}': {prop_name},")
|
373
|
-
|
432
|
+
|
374
433
|
body_lines.append(" }")
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
434
|
+
|
435
|
+
body_lines.append(
|
436
|
+
" request_body = {k: v for k, v in request_body.items() if v is not None}"
|
437
|
+
)
|
438
|
+
|
379
439
|
# Format URL directly with path parameters
|
380
440
|
url_line = f' url = f"{{self.base_url}}{path}"'
|
381
441
|
body_lines.append(url_line)
|
@@ -394,21 +454,35 @@ def generate_method_code(path, method, operation, full_schema, tool_name=None):
|
|
394
454
|
|
395
455
|
# Make HTTP request using the proper method
|
396
456
|
method_lower = method.lower()
|
397
|
-
|
398
|
-
|
399
|
-
|
457
|
+
|
458
|
+
# Determine what to use as the request body argument
|
459
|
+
if has_empty_body:
|
460
|
+
request_body_arg = "request_body"
|
461
|
+
elif not has_body:
|
462
|
+
request_body_arg = "{}"
|
463
|
+
else:
|
464
|
+
request_body_arg = "request_body"
|
465
|
+
|
400
466
|
if method_lower == "get":
|
401
467
|
body_lines.append(" response = self._get(url, params=query_params)")
|
402
468
|
elif method_lower == "post":
|
403
|
-
body_lines.append(
|
469
|
+
body_lines.append(
|
470
|
+
f" response = self._post(url, data={request_body_arg}, params=query_params)"
|
471
|
+
)
|
404
472
|
elif method_lower == "put":
|
405
|
-
body_lines.append(
|
473
|
+
body_lines.append(
|
474
|
+
f" response = self._put(url, data={request_body_arg}, params=query_params)"
|
475
|
+
)
|
406
476
|
elif method_lower == "patch":
|
407
|
-
body_lines.append(
|
477
|
+
body_lines.append(
|
478
|
+
f" response = self._patch(url, data={request_body_arg}, params=query_params)"
|
479
|
+
)
|
408
480
|
elif method_lower == "delete":
|
409
481
|
body_lines.append(" response = self._delete(url, params=query_params)")
|
410
482
|
else:
|
411
|
-
body_lines.append(
|
483
|
+
body_lines.append(
|
484
|
+
f" response = self._{method_lower}(url, data={request_body_arg}, params=query_params)"
|
485
|
+
)
|
412
486
|
|
413
487
|
# Handle response
|
414
488
|
body_lines.append(" response.raise_for_status()")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: universal-mcp
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.8rc3
|
4
4
|
Summary: Universal MCP acts as a middle ware for your API applications. It can store your credentials, authorize, enable disable apps on the fly and much more.
|
5
5
|
Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
|
6
6
|
Requires-Python: >=3.11
|
@@ -28,13 +28,13 @@ Provides-Extra: markitdown
|
|
28
28
|
Requires-Dist: markitdown[all]>=0.1.1; extra == 'markitdown'
|
29
29
|
Provides-Extra: playground
|
30
30
|
Requires-Dist: fastapi[standard]>=0.115.12; extra == 'playground'
|
31
|
-
Requires-Dist: langchain-anthropic>=0.3.10; extra == 'playground'
|
32
31
|
Requires-Dist: langchain-mcp-adapters>=0.0.3; extra == 'playground'
|
33
32
|
Requires-Dist: langchain-openai>=0.3.12; extra == 'playground'
|
34
33
|
Requires-Dist: langgraph-checkpoint-sqlite>=2.0.6; extra == 'playground'
|
35
34
|
Requires-Dist: langgraph>=0.3.24; extra == 'playground'
|
36
35
|
Requires-Dist: python-dotenv>=1.0.1; extra == 'playground'
|
37
36
|
Requires-Dist: streamlit>=1.44.1; extra == 'playground'
|
37
|
+
Requires-Dist: watchdog>=6.0.0; extra == 'playground'
|
38
38
|
Provides-Extra: serpapi
|
39
39
|
Requires-Dist: google-search-results>=2.4.2; extra == 'serpapi'
|
40
40
|
Description-Content-Type: text/markdown
|
@@ -0,0 +1,75 @@
|
|
1
|
+
universal_mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
universal_mcp/analytics.py,sha256=aGCg0Okpcy06W70qCA9I8_ySOiCgAtzJAIWAdhBsOeA,2212
|
3
|
+
universal_mcp/cli.py,sha256=DG-Qxc5vQIdbhAIQuU7bKKJuRGzwyOigjfCKSWBRhBI,5258
|
4
|
+
universal_mcp/config.py,sha256=sJaPI4q51CDPPG0z32rMJiE7a64eaa9nxbjJgYnaFA4,838
|
5
|
+
universal_mcp/exceptions.py,sha256=WApedvzArNujD0gZfUofYBxjQo97ZDJLqDibtLWZoRk,373
|
6
|
+
universal_mcp/logger.py,sha256=D947u1roUf6WqlcEsPpvmWDqGc8L41qF3MO1suK5O1Q,308
|
7
|
+
universal_mcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
+
universal_mcp/applications/__init__.py,sha256=qeWnbdIudyMR7ST4XTc0gpEM9o6TsM1ZnZ92dMAPSBA,754
|
9
|
+
universal_mcp/applications/application.py,sha256=lH5aIb0pip2Pa3vXm8_IbEPNfgehKxkV0OJ0O6f4NWE,3928
|
10
|
+
universal_mcp/applications/calendly/README.md,sha256=85m3XXLPhQ99oghl8SeazCZ2fjBR81-f1y_mjjhx2B0,5911
|
11
|
+
universal_mcp/applications/calendly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
+
universal_mcp/applications/calendly/app.py,sha256=5IoPc-1kkPsAoWk2jwy-oM5iw9dEtkL4wfpupUZ0pf4,50293
|
13
|
+
universal_mcp/applications/coda/README.md,sha256=4i6o_R-qtTuxfS1A7VoIb8_85FHAj-WVb8YG5fNvwL4,11411
|
14
|
+
universal_mcp/applications/coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
+
universal_mcp/applications/coda/app.py,sha256=NJpIqKH_eTsMkS73dJX9azdtSiX8UTlUjRU-k_Kf2AE,156924
|
16
|
+
universal_mcp/applications/e2b/README.md,sha256=S4lTp-vEZ8VTCKPXqjUXu5nYlUMAF8lw8CQyBGPgxjs,700
|
17
|
+
universal_mcp/applications/e2b/app.py,sha256=wjmPa2FKYXORmGiKCE1hSjO0D9T6ZiizFeNq8Y4vgrk,3156
|
18
|
+
universal_mcp/applications/firecrawl/README.md,sha256=KAWe_TQbrc9eA6bSyde5dapMP1CNvarVItV_YJH3d_0,1430
|
19
|
+
universal_mcp/applications/firecrawl/app.py,sha256=3-dguTgYkfpR7DpyXqeHYB5f-Pm-y5NRT2SXPVsmdAw,10063
|
20
|
+
universal_mcp/applications/github/README.md,sha256=6ID-__gUJ5ZxzAS_OjzmoUAag1LamSvEB75DHcj3m-g,1294
|
21
|
+
universal_mcp/applications/github/app.py,sha256=73Y5ceM2BGRcLUO__xO0RO1NNf6Gf3ROtqTlFI5k0Fg,18162
|
22
|
+
universal_mcp/applications/google_calendar/app.py,sha256=mKzbCdijwvuHJDJxmRF6f_BGocK0cwrzIJok93aSknc,19760
|
23
|
+
universal_mcp/applications/google_docs/README.md,sha256=SyOgJG-XU0FXhrVukvg9mxwin73mpqaCOT6rDJ64Klk,909
|
24
|
+
universal_mcp/applications/google_docs/app.py,sha256=tQVHBtb9PSPepsmXn0ISB1fSy75B3H9iUhDrOU4cRKo,4137
|
25
|
+
universal_mcp/applications/google_drive/README.md,sha256=YlN8IT12oO8zVMib1MlTYRBGNP7rzW_KyVAZyyxKvME,1192
|
26
|
+
universal_mcp/applications/google_drive/app.py,sha256=Gf_beIWZUiJ_HcRP_g992GnfxVdfhq2P5r1jVgEfQoU,11935
|
27
|
+
universal_mcp/applications/google_mail/README.md,sha256=LL6TjjmwEqyuRVvIfCh-I_PlWp9ciCZOdJC0LafGZYc,1185
|
28
|
+
universal_mcp/applications/google_mail/app.py,sha256=3KwvyOwoAIhebFFsDPybKmSF9-mUhqPNGf5Gk9s28LM,27899
|
29
|
+
universal_mcp/applications/google_sheet/README.md,sha256=yW1b_qlb_pbIJzCxZc58581kKzC5vyP8Mj4iwXgidtQ,1108
|
30
|
+
universal_mcp/applications/google_sheet/app.py,sha256=jfTjDtN9hLwHcCmfYc2XMVbF05E_syvoYmiiFjDHGTA,7013
|
31
|
+
universal_mcp/applications/markitdown/app.py,sha256=j1AidXGmDwEV4sBw0A-mEe8O4V4Yln4Atrqnk29AHiI,1836
|
32
|
+
universal_mcp/applications/notion/README.md,sha256=45NmPOmSQv99qBvWdwmnV5vbaYc9_8vq8I-FA7veVAA,2600
|
33
|
+
universal_mcp/applications/notion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
+
universal_mcp/applications/notion/app.py,sha256=nc-p531L-L6gMFqOOkYu5Irn9SReWAYRmJ8ZOIv5LrQ,20834
|
35
|
+
universal_mcp/applications/perplexity/README.md,sha256=QGV1iReH5p-Np7vvkZsVHxxDKQ0YaitHEwomNmGEyQs,732
|
36
|
+
universal_mcp/applications/perplexity/app.py,sha256=g-BgGCU42yA6j-t3GCJZKQXfISdgHUV4KJMcJZBbdak,3808
|
37
|
+
universal_mcp/applications/reddit/README.md,sha256=YVbJ1RN6NWlB-P6w2LxCk_DuUWl7mwaKZScY-mIMnNc,1271
|
38
|
+
universal_mcp/applications/reddit/app.py,sha256=Jd-Pr-IMhROun82kuLf0mNJ3P-LDfGfvj1bn_8qNIAI,15748
|
39
|
+
universal_mcp/applications/resend/README.md,sha256=k-sb2UwbFvDPEz6qQPLWd2cJj8hDx5f3NW7dz2jAfjI,719
|
40
|
+
universal_mcp/applications/resend/app.py,sha256=wF4Jje4vD4cPxnPLMYkDxGkl9IctaS2AzUxVAifpJ94,1976
|
41
|
+
universal_mcp/applications/serpapi/README.md,sha256=hX4VeT2iL_67ZsMhKd60DAujQCh9K3IdHroHIq808RY,691
|
42
|
+
universal_mcp/applications/serpapi/app.py,sha256=STDsePi7wKyA-8bs6CtgmCFqyF3_pGC-qa1epiBLT64,3920
|
43
|
+
universal_mcp/applications/tavily/README.md,sha256=cNg4EwX5wBbkDpPtNBNC3A_GxglfSVhdAJuweSrXN20,721
|
44
|
+
universal_mcp/applications/tavily/app.py,sha256=O9TUoqPn8-b_mMMCfiB5ypZZXAb4Xo8d3GLdN5PF4MQ,2602
|
45
|
+
universal_mcp/applications/wrike/README.md,sha256=4EHVPlA8B_dzTA1-HQQqp89z6QL37RTyD2l6DD7vG9E,5156
|
46
|
+
universal_mcp/applications/wrike/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
47
|
+
universal_mcp/applications/wrike/app.py,sha256=Rjv2rYqEtfDOuW635QbPc1ajNDEOgtqGIQpU-atSe9M,60675
|
48
|
+
universal_mcp/applications/youtube/README.md,sha256=NHqIm6QvXQK7I2oZ8hUwfjLDS4_eSK9NPeFbuGIbmhg,5405
|
49
|
+
universal_mcp/applications/youtube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
+
universal_mcp/applications/youtube/app.py,sha256=TP56LE3RGcbgeX0XglRa6ajUkLvzuZU52OshPntPde0,57583
|
51
|
+
universal_mcp/applications/zenquotes/README.md,sha256=wA3hjqjrkrczQaffpwyolSKq6gXmkLgeHx6_EQrYEOY,709
|
52
|
+
universal_mcp/applications/zenquotes/app.py,sha256=xp_nlW4LFi0Mw1GRWIde4k8eexXUJx1wNqNExJ0oeKA,1085
|
53
|
+
universal_mcp/integrations/README.md,sha256=lTAPXO2nivcBe1q7JT6PRa6v9Ns_ZersQMIdw-nmwEA,996
|
54
|
+
universal_mcp/integrations/__init__.py,sha256=YY8Uw0XGNUpAQ1j-qgCOrwHTcuSew4W92cEtYXMxry4,963
|
55
|
+
universal_mcp/integrations/agentr.py,sha256=l0mo79oeDML19udFfoCo9lyhbDAf0X94_lnpOgbTrb0,3331
|
56
|
+
universal_mcp/integrations/integration.py,sha256=KgiQ6I1uWx-8701tgjXwgei7EANYCr8riY-Uhb2AAOE,9739
|
57
|
+
universal_mcp/servers/__init__.py,sha256=dDtvvMzbWskABlobTZHztrWMb3hbzgidza3BmEmIAD8,474
|
58
|
+
universal_mcp/servers/server.py,sha256=ARlDS4nmlYI22t2YVdSOcjWDwzvR-azeimYhAKX2g2A,8141
|
59
|
+
universal_mcp/stores/__init__.py,sha256=quvuwhZnpiSLuojf0NfmBx2xpaCulv3fbKtKaSCEmuM,603
|
60
|
+
universal_mcp/stores/store.py,sha256=8Hobd55WCXGXTJeADn7d_Qe-U8VkC6X3QDTgaKr3Saw,6774
|
61
|
+
universal_mcp/tools/__init__.py,sha256=hVL-elJLwD_K87Gpw_s2_o43sQRPyRNOnxlzt0_Pfn8,72
|
62
|
+
universal_mcp/tools/adapters.py,sha256=2HvpyFiI0zg9dp0XshnG7t6KrVqFHM7hgtmgY1bsHN0,927
|
63
|
+
universal_mcp/tools/func_metadata.py,sha256=f_5LdDNsOu1DpXvDUeZYiJswVmwGZz6IMPtpJJ5B2-Y,7975
|
64
|
+
universal_mcp/tools/tools.py,sha256=27PkcxoxdADoUqQHUyvKX1GJCOYb1lrOtqcR24tR7fs,12982
|
65
|
+
universal_mcp/utils/__init__.py,sha256=8wi4PGWu-SrFjNJ8U7fr2iFJ1ktqlDmSKj1xYd7KSDc,41
|
66
|
+
universal_mcp/utils/api_generator.py,sha256=-wRBpLVfJQXy1R-8FpDNs6b8_eeekVDuPc_uwjSGgiY,8883
|
67
|
+
universal_mcp/utils/docgen.py,sha256=yGBcBIr7dz3mNMGrCb_-JFsDf-ShmCKWWiPpuEj2SIU,21878
|
68
|
+
universal_mcp/utils/docstring_parser.py,sha256=-QVW9u9i1_FlAMwSkFil6ZNaKIkXKI6gqOYtURdp5ak,6745
|
69
|
+
universal_mcp/utils/dump_app_tools.py,sha256=9bQePJ4ZKzGtcIYrBgLxbKDOZmL7ajIAHhXljT_AlyA,2041
|
70
|
+
universal_mcp/utils/installation.py,sha256=3vy9ZLjQj1xpSAOyWpOanBr7o5DtffzWB5JAjN0Jjtk,3757
|
71
|
+
universal_mcp/utils/openapi.py,sha256=AgmcyntPyovic2mRqr-a7P4kEc7hU-yk9gRVIsO4078,20673
|
72
|
+
universal_mcp-0.1.8rc3.dist-info/METADATA,sha256=mTty3iqc9lUsEUtM1CAfsWHdR1CGWwDuLyeMDK09IwU,11271
|
73
|
+
universal_mcp-0.1.8rc3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
74
|
+
universal_mcp-0.1.8rc3.dist-info/entry_points.txt,sha256=QlBrVKmA2jIM0q-C-3TQMNJTTWOsOFQvgedBq2rZTS8,56
|
75
|
+
universal_mcp-0.1.8rc3.dist-info/RECORD,,
|
@@ -1,71 +0,0 @@
|
|
1
|
-
universal_mcp/__init__.py,sha256=2gdHpHaDDcsRjZjJ01FLN-1iidN_wbDAolNpxhGoFB4,59
|
2
|
-
universal_mcp/cli.py,sha256=DG-Qxc5vQIdbhAIQuU7bKKJuRGzwyOigjfCKSWBRhBI,5258
|
3
|
-
universal_mcp/config.py,sha256=sJaPI4q51CDPPG0z32rMJiE7a64eaa9nxbjJgYnaFA4,838
|
4
|
-
universal_mcp/exceptions.py,sha256=SCvFg88w-xA6Fct3yBXl6czFVTmaKA71l_oue2shLME,372
|
5
|
-
universal_mcp/logger.py,sha256=W6A868vyvpdkEQ4Dd0rWdC_7ErSxSQ1z2uxCb77IM8Y,2015
|
6
|
-
universal_mcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
universal_mcp/applications/__init__.py,sha256=qeWnbdIudyMR7ST4XTc0gpEM9o6TsM1ZnZ92dMAPSBA,754
|
8
|
-
universal_mcp/applications/application.py,sha256=DyFDIkQvDi8kHSzSWGKDw5Oe3mxjNPwr5m9Tqbm2NgA,3583
|
9
|
-
universal_mcp/applications/calendly/README.md,sha256=85m3XXLPhQ99oghl8SeazCZ2fjBR81-f1y_mjjhx2B0,5911
|
10
|
-
universal_mcp/applications/calendly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
universal_mcp/applications/calendly/app.py,sha256=LL5yeBTqMgqXN234C1hlyBEuZANCAKCUnxRDNfitAoM,48074
|
12
|
-
universal_mcp/applications/e2b/README.md,sha256=S4lTp-vEZ8VTCKPXqjUXu5nYlUMAF8lw8CQyBGPgxjs,700
|
13
|
-
universal_mcp/applications/e2b/app.py,sha256=U4-KjcZrKFEMO4sBwH4PR3H94c7NfqUpoFXtIGO9y54,3201
|
14
|
-
universal_mcp/applications/firecrawl/README.md,sha256=KAWe_TQbrc9eA6bSyde5dapMP1CNvarVItV_YJH3d_0,1430
|
15
|
-
universal_mcp/applications/firecrawl/app.py,sha256=WeO4Jsk5odCx40MYALLVdBMWVXqTb00KXb9aiPu-9js,10062
|
16
|
-
universal_mcp/applications/github/README.md,sha256=6ID-__gUJ5ZxzAS_OjzmoUAag1LamSvEB75DHcj3m-g,1294
|
17
|
-
universal_mcp/applications/github/app.py,sha256=1EGnCS-QuAJsxwI__RC0vD6PzNLx01byy0Kk_mOTjaY,18482
|
18
|
-
universal_mcp/applications/google_calendar/app.py,sha256=gszk_3qqb4R5wWhL7Xs9Uwwwlm15C2iJeBY-PHRXhHo,19920
|
19
|
-
universal_mcp/applications/google_docs/README.md,sha256=SyOgJG-XU0FXhrVukvg9mxwin73mpqaCOT6rDJ64Klk,909
|
20
|
-
universal_mcp/applications/google_docs/app.py,sha256=37bx4o-fLp7k4L-KZte0q3fLndNVWVaInjH-oNIEqwA,4390
|
21
|
-
universal_mcp/applications/google_drive/README.md,sha256=YlN8IT12oO8zVMib1MlTYRBGNP7rzW_KyVAZyyxKvME,1192
|
22
|
-
universal_mcp/applications/google_drive/app.py,sha256=FAvJmgc7uPa-c2TvSh868PoiViyWjxGGbsoChJpB934,12286
|
23
|
-
universal_mcp/applications/google_mail/README.md,sha256=LL6TjjmwEqyuRVvIfCh-I_PlWp9ciCZOdJC0LafGZYc,1185
|
24
|
-
universal_mcp/applications/google_mail/app.py,sha256=Od4MZH6aa_dOZFasQfTOGa-xY1xm-8MmkBpFfX_Jb5M,28219
|
25
|
-
universal_mcp/applications/google_sheet/README.md,sha256=yW1b_qlb_pbIJzCxZc58581kKzC5vyP8Mj4iwXgidtQ,1108
|
26
|
-
universal_mcp/applications/google_sheet/app.py,sha256=BFzEm6u9bpRzA1NmPjL8Hbxlf8P8EMaq7XfhdFx_WWE,7296
|
27
|
-
universal_mcp/applications/markitdown/app.py,sha256=RJ1RcPeklV-dlHH0MWA3NowFiTmsRo3ppd5PATYcghI,1868
|
28
|
-
universal_mcp/applications/notion/README.md,sha256=45NmPOmSQv99qBvWdwmnV5vbaYc9_8vq8I-FA7veVAA,2600
|
29
|
-
universal_mcp/applications/notion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
-
universal_mcp/applications/notion/app.py,sha256=ur5IEs7nbO4NncO3MAegeZS5cHZgvOkqxfRBITHnT0k,21352
|
31
|
-
universal_mcp/applications/perplexity/README.md,sha256=QGV1iReH5p-Np7vvkZsVHxxDKQ0YaitHEwomNmGEyQs,732
|
32
|
-
universal_mcp/applications/perplexity/app.py,sha256=ux1llcJJHu6JJJOllZbuMdkViv6q1PnQ2Ya5hZQpy1I,3839
|
33
|
-
universal_mcp/applications/reddit/README.md,sha256=YVbJ1RN6NWlB-P6w2LxCk_DuUWl7mwaKZScY-mIMnNc,1271
|
34
|
-
universal_mcp/applications/reddit/app.py,sha256=9mM-bU3YqtkfyTxLxW_WOUxaC1OKi-Q1ksjKqkgEnJ8,16004
|
35
|
-
universal_mcp/applications/resend/README.md,sha256=k-sb2UwbFvDPEz6qQPLWd2cJj8hDx5f3NW7dz2jAfjI,719
|
36
|
-
universal_mcp/applications/resend/app.py,sha256=2H9y_kRerdX84VEKu-1aBDWyYFxlOSiEbnIT16HNJmg,2008
|
37
|
-
universal_mcp/applications/serpapi/README.md,sha256=hX4VeT2iL_67ZsMhKd60DAujQCh9K3IdHroHIq808RY,691
|
38
|
-
universal_mcp/applications/serpapi/app.py,sha256=M1oNUNjcRn_KOIUe8wVg-eN5OFeuhcxS3C2DejqN5BU,3952
|
39
|
-
universal_mcp/applications/tavily/README.md,sha256=cNg4EwX5wBbkDpPtNBNC3A_GxglfSVhdAJuweSrXN20,721
|
40
|
-
universal_mcp/applications/tavily/app.py,sha256=4Xi9-uSa6ke9Onr8YG5ovZMtYI8zDhAMjEqWXTPm7_c,2634
|
41
|
-
universal_mcp/applications/wrike/README.md,sha256=4EHVPlA8B_dzTA1-HQQqp89z6QL37RTyD2l6DD7vG9E,5156
|
42
|
-
universal_mcp/applications/wrike/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
43
|
-
universal_mcp/applications/wrike/app.py,sha256=cjPmDHmuSY0QgNKHxitwyAennzpc1vgz94TRB9xdAHQ,57778
|
44
|
-
universal_mcp/applications/youtube/README.md,sha256=NHqIm6QvXQK7I2oZ8hUwfjLDS4_eSK9NPeFbuGIbmhg,5405
|
45
|
-
universal_mcp/applications/youtube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
-
universal_mcp/applications/youtube/app.py,sha256=m32MaqOtNhWR3LFi5TjcnQ3huFUT6x5DTV4EKKVdyVQ,52859
|
47
|
-
universal_mcp/applications/zenquotes/README.md,sha256=wA3hjqjrkrczQaffpwyolSKq6gXmkLgeHx6_EQrYEOY,709
|
48
|
-
universal_mcp/applications/zenquotes/app.py,sha256=mKX0fLdAv_a_m3o8ZKUA2ayiQbLk9Mxfa8jgkNmgcxI,1109
|
49
|
-
universal_mcp/integrations/README.md,sha256=lTAPXO2nivcBe1q7JT6PRa6v9Ns_ZersQMIdw-nmwEA,996
|
50
|
-
universal_mcp/integrations/__init__.py,sha256=M8chg9JsfC14OWvyu8Est5_jZGRrsEDImxyfl2TpGRI,933
|
51
|
-
universal_mcp/integrations/agentr.py,sha256=l0mo79oeDML19udFfoCo9lyhbDAf0X94_lnpOgbTrb0,3331
|
52
|
-
universal_mcp/integrations/integration.py,sha256=igOZNGJQQKR4Q0FSol21H_Orf3Vmlslg8eWoahHWr4U,9727
|
53
|
-
universal_mcp/servers/__init__.py,sha256=FmRcHdDPQWTfovZjt_-e1b9bHk8-wQkSQNfvPMDTec4,472
|
54
|
-
universal_mcp/servers/server.py,sha256=pNLrfog-oemL4WiiOdcWASEQxLZL8560FOiTjJx_i-8,8748
|
55
|
-
universal_mcp/stores/__init__.py,sha256=quvuwhZnpiSLuojf0NfmBx2xpaCulv3fbKtKaSCEmuM,603
|
56
|
-
universal_mcp/stores/store.py,sha256=dmqXCyS36umPXD7iRnU9KYX4KTM4rkIiekGGtCg9ygg,6800
|
57
|
-
universal_mcp/tools/__init__.py,sha256=3G2UHjEbkZAdAPp7qDIV9lq7_HY1eX5rm4bBEW1_X8c,71
|
58
|
-
universal_mcp/tools/adapters.py,sha256=Hdxqrid3NrAxNGHlMXycNOSdhQA_eluJbalCwhue6H4,923
|
59
|
-
universal_mcp/tools/func_metadata.py,sha256=Ax7MCE-RuM6IPvX4jj386SRFHakHMzn461GJ48p5aIE,7946
|
60
|
-
universal_mcp/tools/tools.py,sha256=_AGc8LpmjT6v_wcNZWaPcaNOMVBQ2qGG67e2gRaUJAk,11532
|
61
|
-
universal_mcp/utils/__init__.py,sha256=8wi4PGWu-SrFjNJ8U7fr2iFJ1ktqlDmSKj1xYd7KSDc,41
|
62
|
-
universal_mcp/utils/api_generator.py,sha256=-wRBpLVfJQXy1R-8FpDNs6b8_eeekVDuPc_uwjSGgiY,8883
|
63
|
-
universal_mcp/utils/docgen.py,sha256=KBMb1fv67zjqCtNSmpkkICQtLgK_yUxTwMcQIHJgbY8,20923
|
64
|
-
universal_mcp/utils/docstring_parser.py,sha256=82IBBGY-T9hrsoeF-hD8ABWY0caPjkCbS7KZtgU60Sw,6499
|
65
|
-
universal_mcp/utils/dump_app_tools.py,sha256=cLB9SumKsbs-rXJ_02lpMyyNkOmKZ57gekhCjhAlcHg,2009
|
66
|
-
universal_mcp/utils/installation.py,sha256=3vy9ZLjQj1xpSAOyWpOanBr7o5DtffzWB5JAjN0Jjtk,3757
|
67
|
-
universal_mcp/utils/openapi.py,sha256=lZ55gAByt93r5oZdM11PhmRoFbZK9TJTZBD0TwQo-3E,18524
|
68
|
-
universal_mcp-0.1.8rc2.dist-info/METADATA,sha256=DbCePKSZbLFml5dgzg3p1BkDbVLJGl4T_QYJnR0wPqw,11283
|
69
|
-
universal_mcp-0.1.8rc2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
70
|
-
universal_mcp-0.1.8rc2.dist-info/entry_points.txt,sha256=QlBrVKmA2jIM0q-C-3TQMNJTTWOsOFQvgedBq2rZTS8,56
|
71
|
-
universal_mcp-0.1.8rc2.dist-info/RECORD,,
|
File without changes
|
File without changes
|