universal-mcp-applications 0.1.30rc1__py3-none-any.whl → 0.1.36rc1__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.

Potentially problematic release.


This version of universal-mcp-applications might be problematic. Click here for more details.

Files changed (106) hide show
  1. universal_mcp/applications/ahrefs/app.py +52 -198
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +111 -464
  4. universal_mcp/applications/asana/app.py +417 -1567
  5. universal_mcp/applications/aws_s3/app.py +33 -100
  6. universal_mcp/applications/bill/app.py +546 -1957
  7. universal_mcp/applications/box/app.py +1068 -3981
  8. universal_mcp/applications/braze/app.py +364 -1430
  9. universal_mcp/applications/browser_use/app.py +2 -8
  10. universal_mcp/applications/cal_com_v2/app.py +207 -625
  11. universal_mcp/applications/calendly/app.py +61 -200
  12. universal_mcp/applications/canva/app.py +45 -110
  13. universal_mcp/applications/clickup/app.py +207 -674
  14. universal_mcp/applications/coda/app.py +146 -426
  15. universal_mcp/applications/confluence/app.py +310 -1098
  16. universal_mcp/applications/contentful/app.py +36 -151
  17. universal_mcp/applications/crustdata/app.py +28 -107
  18. universal_mcp/applications/dialpad/app.py +283 -756
  19. universal_mcp/applications/digitalocean/app.py +1766 -5777
  20. universal_mcp/applications/domain_checker/app.py +3 -54
  21. universal_mcp/applications/e2b/app.py +14 -64
  22. universal_mcp/applications/elevenlabs/app.py +9 -47
  23. universal_mcp/applications/exa/app.py +6 -17
  24. universal_mcp/applications/falai/app.py +23 -100
  25. universal_mcp/applications/figma/app.py +53 -137
  26. universal_mcp/applications/file_system/app.py +2 -13
  27. universal_mcp/applications/firecrawl/app.py +51 -152
  28. universal_mcp/applications/fireflies/app.py +59 -281
  29. universal_mcp/applications/fpl/app.py +91 -528
  30. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  31. universal_mcp/applications/fpl/utils/helper.py +25 -89
  32. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  33. universal_mcp/applications/ghost_content/app.py +52 -161
  34. universal_mcp/applications/github/app.py +19 -56
  35. universal_mcp/applications/gong/app.py +88 -248
  36. universal_mcp/applications/google_calendar/app.py +16 -68
  37. universal_mcp/applications/google_docs/app.py +88 -188
  38. universal_mcp/applications/google_drive/app.py +140 -462
  39. universal_mcp/applications/google_gemini/app.py +12 -64
  40. universal_mcp/applications/google_mail/app.py +28 -157
  41. universal_mcp/applications/google_searchconsole/app.py +15 -48
  42. universal_mcp/applications/google_sheet/app.py +101 -578
  43. universal_mcp/applications/google_sheet/helper.py +10 -37
  44. universal_mcp/applications/hashnode/app.py +57 -269
  45. universal_mcp/applications/heygen/app.py +44 -122
  46. universal_mcp/applications/http_tools/app.py +10 -32
  47. universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
  48. universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
  49. universal_mcp/applications/hubspot/app.py +23 -87
  50. universal_mcp/applications/jira/app.py +2071 -7986
  51. universal_mcp/applications/klaviyo/app.py +494 -1376
  52. universal_mcp/applications/linkedin/README.md +23 -4
  53. universal_mcp/applications/linkedin/app.py +392 -212
  54. universal_mcp/applications/mailchimp/app.py +450 -1605
  55. universal_mcp/applications/markitdown/app.py +8 -20
  56. universal_mcp/applications/miro/app.py +217 -699
  57. universal_mcp/applications/ms_teams/app.py +64 -186
  58. universal_mcp/applications/neon/app.py +86 -192
  59. universal_mcp/applications/notion/app.py +21 -36
  60. universal_mcp/applications/onedrive/app.py +14 -36
  61. universal_mcp/applications/openai/app.py +42 -165
  62. universal_mcp/applications/outlook/app.py +16 -76
  63. universal_mcp/applications/perplexity/app.py +4 -19
  64. universal_mcp/applications/pipedrive/app.py +832 -3142
  65. universal_mcp/applications/posthog/app.py +163 -432
  66. universal_mcp/applications/reddit/app.py +40 -139
  67. universal_mcp/applications/resend/app.py +41 -107
  68. universal_mcp/applications/retell/app.py +14 -41
  69. universal_mcp/applications/rocketlane/app.py +221 -934
  70. universal_mcp/applications/scraper/README.md +7 -4
  71. universal_mcp/applications/scraper/app.py +280 -93
  72. universal_mcp/applications/semanticscholar/app.py +22 -64
  73. universal_mcp/applications/semrush/app.py +43 -77
  74. universal_mcp/applications/sendgrid/app.py +512 -1262
  75. universal_mcp/applications/sentry/app.py +271 -906
  76. universal_mcp/applications/serpapi/app.py +40 -143
  77. universal_mcp/applications/sharepoint/app.py +15 -37
  78. universal_mcp/applications/shopify/app.py +1551 -4287
  79. universal_mcp/applications/shortcut/app.py +155 -417
  80. universal_mcp/applications/slack/app.py +50 -101
  81. universal_mcp/applications/spotify/app.py +126 -325
  82. universal_mcp/applications/supabase/app.py +104 -213
  83. universal_mcp/applications/tavily/app.py +1 -1
  84. universal_mcp/applications/trello/app.py +693 -2656
  85. universal_mcp/applications/twilio/app.py +14 -50
  86. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  87. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  88. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  89. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  90. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  91. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  92. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  93. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  94. universal_mcp/applications/whatsapp/app.py +35 -186
  95. universal_mcp/applications/whatsapp/audio.py +2 -6
  96. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  97. universal_mcp/applications/whatsapp_business/app.py +70 -283
  98. universal_mcp/applications/wrike/app.py +45 -118
  99. universal_mcp/applications/yahoo_finance/app.py +19 -65
  100. universal_mcp/applications/youtube/app.py +75 -261
  101. universal_mcp/applications/zenquotes/app.py +2 -2
  102. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -106
  104. universal_mcp/applications/scraper/scraper_testers.py +0 -17
  105. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  106. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
1
  from typing import Any
2
-
3
2
  from universal_mcp.applications.application import APIApplication
4
3
  from universal_mcp.integrations import Integration
5
4
 
@@ -9,15 +8,8 @@ class FigmaApp(APIApplication):
9
8
  super().__init__(name="figma", integration=integration, **kwargs)
10
9
  self.base_url = "https://api.figma.com"
11
10
 
12
- def get_file(
13
- self,
14
- file_key,
15
- version=None,
16
- ids=None,
17
- depth=None,
18
- geometry=None,
19
- plugin_data=None,
20
- branch_data=None,
11
+ async def get_file(
12
+ self, file_key, version=None, ids=None, depth=None, geometry=None, plugin_data=None, branch_data=None
21
13
  ) -> dict[str, Any]:
22
14
  """
23
15
  Retrieves a specified file's data (including versions, geometry, and plugin information) from the API using a unique file identifier.
@@ -56,9 +48,7 @@ class FigmaApp(APIApplication):
56
48
  response.raise_for_status()
57
49
  return response.json()
58
50
 
59
- def get_file_nodes(
60
- self, file_key, ids, version=None, depth=None, geometry=None, plugin_data=None
61
- ) -> dict[str, Any]:
51
+ async def get_file_nodes(self, file_key, ids, version=None, depth=None, geometry=None, plugin_data=None) -> dict[str, Any]:
62
52
  """
63
53
  Retrieves nodes related to a file identified by the "file_key" using the specified query parameters for filtering by "ids", "version", "depth", "geometry", and "plugin_data".
64
54
 
@@ -81,20 +71,14 @@ class FigmaApp(APIApplication):
81
71
  url = f"{self.base_url}/v1/files/{file_key}/nodes"
82
72
  query_params = {
83
73
  k: v
84
- for k, v in [
85
- ("ids", ids),
86
- ("version", version),
87
- ("depth", depth),
88
- ("geometry", geometry),
89
- ("plugin_data", plugin_data),
90
- ]
74
+ for k, v in [("ids", ids), ("version", version), ("depth", depth), ("geometry", geometry), ("plugin_data", plugin_data)]
91
75
  if v is not None
92
76
  }
93
77
  response = self._get(url, params=query_params)
94
78
  response.raise_for_status()
95
79
  return response.json()
96
80
 
97
- def get_images(
81
+ async def get_images(
98
82
  self,
99
83
  file_key,
100
84
  ids,
@@ -153,7 +137,7 @@ class FigmaApp(APIApplication):
153
137
  response.raise_for_status()
154
138
  return response.json()
155
139
 
156
- def get_image_fills(self, file_key) -> dict[str, Any]:
140
+ async def get_image_fills(self, file_key) -> dict[str, Any]:
157
141
  """
158
142
  Retrieves images associated with a file identified by the `{file_key}` using the `/v1/files/{file_key}/images` API endpoint.
159
143
 
@@ -174,7 +158,7 @@ class FigmaApp(APIApplication):
174
158
  response.raise_for_status()
175
159
  return response.json()
176
160
 
177
- def get_team_projects(self, team_id) -> dict[str, Any]:
161
+ async def get_team_projects(self, team_id) -> dict[str, Any]:
178
162
  """
179
163
  Retrieves a list of projects associated with a specific team identified by the team_id parameter.
180
164
 
@@ -195,7 +179,7 @@ class FigmaApp(APIApplication):
195
179
  response.raise_for_status()
196
180
  return response.json()
197
181
 
198
- def get_project_files(self, project_id, branch_data=None) -> dict[str, Any]:
182
+ async def get_project_files(self, project_id, branch_data=None) -> dict[str, Any]:
199
183
  """
200
184
  Retrieves files from a specified project, optionally including branch data, using the provided project identifier.
201
185
 
@@ -212,16 +196,12 @@ class FigmaApp(APIApplication):
212
196
  if project_id is None:
213
197
  raise ValueError("Missing required parameter 'project_id'")
214
198
  url = f"{self.base_url}/v1/projects/{project_id}/files"
215
- query_params = {
216
- k: v for k, v in [("branch_data", branch_data)] if v is not None
217
- }
199
+ query_params = {k: v for k, v in [("branch_data", branch_data)] if v is not None}
218
200
  response = self._get(url, params=query_params)
219
201
  response.raise_for_status()
220
202
  return response.json()
221
203
 
222
- def get_file_versions(
223
- self, file_key, page_size=None, before=None, after=None
224
- ) -> dict[str, Any]:
204
+ async def get_file_versions(self, file_key, page_size=None, before=None, after=None) -> dict[str, Any]:
225
205
  """
226
206
  Retrieves a list of file versions using the "GET" method, filtering by file key and optional query parameters for pagination and sorting.
227
207
 
@@ -240,16 +220,12 @@ class FigmaApp(APIApplication):
240
220
  if file_key is None:
241
221
  raise ValueError("Missing required parameter 'file_key'")
242
222
  url = f"{self.base_url}/v1/files/{file_key}/versions"
243
- query_params = {
244
- k: v
245
- for k, v in [("page_size", page_size), ("before", before), ("after", after)]
246
- if v is not None
247
- }
223
+ query_params = {k: v for k, v in [("page_size", page_size), ("before", before), ("after", after)] if v is not None}
248
224
  response = self._get(url, params=query_params)
249
225
  response.raise_for_status()
250
226
  return response.json()
251
227
 
252
- def get_comments(self, file_key, as_md=None) -> dict[str, Any]:
228
+ async def get_comments(self, file_key, as_md=None) -> dict[str, Any]:
253
229
  """
254
230
  Retrieves comments associated with a specified file and optionally returns them in Markdown format based on the query parameter.
255
231
 
@@ -271,9 +247,7 @@ class FigmaApp(APIApplication):
271
247
  response.raise_for_status()
272
248
  return response.json()
273
249
 
274
- def post_comment(
275
- self, file_key, message, comment_id=None, client_meta=None
276
- ) -> dict[str, Any]:
250
+ async def post_comment(self, file_key, message, comment_id=None, client_meta=None) -> dict[str, Any]:
277
251
  """
278
252
  Creates a new comment on a file specified by the file_key and returns an appropriate status code.
279
253
 
@@ -291,11 +265,7 @@ class FigmaApp(APIApplication):
291
265
  """
292
266
  if file_key is None:
293
267
  raise ValueError("Missing required parameter 'file_key'")
294
- request_body = {
295
- "message": message,
296
- "comment_id": comment_id,
297
- "client_meta": client_meta,
298
- }
268
+ request_body = {"message": message, "comment_id": comment_id, "client_meta": client_meta}
299
269
  request_body = {k: v for k, v in request_body.items() if v is not None}
300
270
  url = f"{self.base_url}/v1/files/{file_key}/comments"
301
271
  query_params = {}
@@ -303,7 +273,7 @@ class FigmaApp(APIApplication):
303
273
  response.raise_for_status()
304
274
  return response.json()
305
275
 
306
- def delete_comment(self, file_key, comment_id) -> dict[str, Any]:
276
+ async def delete_comment(self, file_key, comment_id) -> dict[str, Any]:
307
277
  """
308
278
  Deletes a specified comment from a file identified by its file key and comment ID.
309
279
 
@@ -327,9 +297,7 @@ class FigmaApp(APIApplication):
327
297
  response.raise_for_status()
328
298
  return response.json()
329
299
 
330
- def get_comment_reactions(
331
- self, file_key, comment_id, cursor=None
332
- ) -> dict[str, Any]:
300
+ async def get_comment_reactions(self, file_key, comment_id, cursor=None) -> dict[str, Any]:
333
301
  """
334
302
  Retrieves reactions for a specific comment in a file using the provided file key and comment ID.
335
303
 
@@ -354,7 +322,7 @@ class FigmaApp(APIApplication):
354
322
  response.raise_for_status()
355
323
  return response.json()
356
324
 
357
- def post_comment_reaction(self, file_key, comment_id, emoji) -> dict[str, Any]:
325
+ async def post_comment_reaction(self, file_key, comment_id, emoji) -> dict[str, Any]:
358
326
  """
359
327
  Adds a reaction to a specific comment on a file identified by the file key and comment ID using the "POST" method at the "/v1/files/{file_key}/comments/{comment_id}/reactions" endpoint.
360
328
 
@@ -373,9 +341,7 @@ class FigmaApp(APIApplication):
373
341
  raise ValueError("Missing required parameter 'file_key'")
374
342
  if comment_id is None:
375
343
  raise ValueError("Missing required parameter 'comment_id'")
376
- request_body = {
377
- "emoji": emoji,
378
- }
344
+ request_body = {"emoji": emoji}
379
345
  request_body = {k: v for k, v in request_body.items() if v is not None}
380
346
  url = f"{self.base_url}/v1/files/{file_key}/comments/{comment_id}/reactions"
381
347
  query_params = {}
@@ -383,7 +349,7 @@ class FigmaApp(APIApplication):
383
349
  response.raise_for_status()
384
350
  return response.json()
385
351
 
386
- def delete_comment_reaction(self, file_key, comment_id, emoji) -> dict[str, Any]:
352
+ async def delete_comment_reaction(self, file_key, comment_id, emoji) -> dict[str, Any]:
387
353
  """
388
354
  Removes a reaction emoji from a comment on a file using the specified emoji parameter.
389
355
 
@@ -408,7 +374,7 @@ class FigmaApp(APIApplication):
408
374
  response.raise_for_status()
409
375
  return response.json()
410
376
 
411
- def get_me(self) -> Any:
377
+ async def get_me(self) -> Any:
412
378
  """
413
379
  Retrieves the authenticated user's profile data.
414
380
 
@@ -424,9 +390,7 @@ class FigmaApp(APIApplication):
424
390
  response.raise_for_status()
425
391
  return response.json()
426
392
 
427
- def get_team_components(
428
- self, team_id, page_size=None, after=None, before=None
429
- ) -> dict[str, Any]:
393
+ async def get_team_components(self, team_id, page_size=None, after=None, before=None) -> dict[str, Any]:
430
394
  """
431
395
  Retrieves a list of components for a specified team with pagination support using page_size, after, and before parameters.
432
396
 
@@ -445,16 +409,12 @@ class FigmaApp(APIApplication):
445
409
  if team_id is None:
446
410
  raise ValueError("Missing required parameter 'team_id'")
447
411
  url = f"{self.base_url}/v1/teams/{team_id}/components"
448
- query_params = {
449
- k: v
450
- for k, v in [("page_size", page_size), ("after", after), ("before", before)]
451
- if v is not None
452
- }
412
+ query_params = {k: v for k, v in [("page_size", page_size), ("after", after), ("before", before)] if v is not None}
453
413
  response = self._get(url, params=query_params)
454
414
  response.raise_for_status()
455
415
  return response.json()
456
416
 
457
- def get_file_components(self, file_key) -> dict[str, Any]:
417
+ async def get_file_components(self, file_key) -> dict[str, Any]:
458
418
  """
459
419
  Retrieves a list of components associated with a file identified by the specified file key using the API endpoint "/v1/files/{file_key}/components".
460
420
 
@@ -475,7 +435,7 @@ class FigmaApp(APIApplication):
475
435
  response.raise_for_status()
476
436
  return response.json()
477
437
 
478
- def get_component(self, key) -> dict[str, Any]:
438
+ async def get_component(self, key) -> dict[str, Any]:
479
439
  """
480
440
  Retrieves component information for a specific key using the API endpoint at "/v1/components/{key}" with the GET method.
481
441
 
@@ -496,9 +456,7 @@ class FigmaApp(APIApplication):
496
456
  response.raise_for_status()
497
457
  return response.json()
498
458
 
499
- def get_team_component_sets(
500
- self, team_id, page_size=None, after=None, before=None
501
- ) -> dict[str, Any]:
459
+ async def get_team_component_sets(self, team_id, page_size=None, after=None, before=None) -> dict[str, Any]:
502
460
  """
503
461
  Retrieves a paginated list of component sets associated with a specific team ID, supporting pagination via page size, after, and before query parameters.
504
462
 
@@ -517,16 +475,12 @@ class FigmaApp(APIApplication):
517
475
  if team_id is None:
518
476
  raise ValueError("Missing required parameter 'team_id'")
519
477
  url = f"{self.base_url}/v1/teams/{team_id}/component_sets"
520
- query_params = {
521
- k: v
522
- for k, v in [("page_size", page_size), ("after", after), ("before", before)]
523
- if v is not None
524
- }
478
+ query_params = {k: v for k, v in [("page_size", page_size), ("after", after), ("before", before)] if v is not None}
525
479
  response = self._get(url, params=query_params)
526
480
  response.raise_for_status()
527
481
  return response.json()
528
482
 
529
- def get_file_component_sets(self, file_key) -> dict[str, Any]:
483
+ async def get_file_component_sets(self, file_key) -> dict[str, Any]:
530
484
  """
531
485
  Retrieves the component sets associated with a file identified by a specific file key using the "GET" method at the "/v1/files/{file_key}/component_sets" endpoint.
532
486
 
@@ -547,7 +501,7 @@ class FigmaApp(APIApplication):
547
501
  response.raise_for_status()
548
502
  return response.json()
549
503
 
550
- def get_component_set(self, key) -> dict[str, Any]:
504
+ async def get_component_set(self, key) -> dict[str, Any]:
551
505
  """
552
506
  Retrieves a component set by its unique key identifier and returns the associated component data.
553
507
 
@@ -568,9 +522,7 @@ class FigmaApp(APIApplication):
568
522
  response.raise_for_status()
569
523
  return response.json()
570
524
 
571
- def get_team_styles(
572
- self, team_id, page_size=None, after=None, before=None
573
- ) -> dict[str, Any]:
525
+ async def get_team_styles(self, team_id, page_size=None, after=None, before=None) -> dict[str, Any]:
574
526
  """
575
527
  Retrieves paginated style resources associated with a specific team using query parameters for pagination control.
576
528
 
@@ -589,16 +541,12 @@ class FigmaApp(APIApplication):
589
541
  if team_id is None:
590
542
  raise ValueError("Missing required parameter 'team_id'")
591
543
  url = f"{self.base_url}/v1/teams/{team_id}/styles"
592
- query_params = {
593
- k: v
594
- for k, v in [("page_size", page_size), ("after", after), ("before", before)]
595
- if v is not None
596
- }
544
+ query_params = {k: v for k, v in [("page_size", page_size), ("after", after), ("before", before)] if v is not None}
597
545
  response = self._get(url, params=query_params)
598
546
  response.raise_for_status()
599
547
  return response.json()
600
548
 
601
- def get_file_styles(self, file_key) -> dict[str, Any]:
549
+ async def get_file_styles(self, file_key) -> dict[str, Any]:
602
550
  """
603
551
  Retrieves styles information for a specific file identified by the file key using the API endpoint "/v1/files/{file_key}/styles" with the GET method.
604
552
 
@@ -619,7 +567,7 @@ class FigmaApp(APIApplication):
619
567
  response.raise_for_status()
620
568
  return response.json()
621
569
 
622
- def get_style(self, key) -> dict[str, Any]:
570
+ async def get_style(self, key) -> dict[str, Any]:
623
571
  """
624
572
  Retrieves a style object associated with the specified key using the "GET" method at the "/v1/styles/{key}" endpoint.
625
573
 
@@ -640,9 +588,7 @@ class FigmaApp(APIApplication):
640
588
  response.raise_for_status()
641
589
  return response.json()
642
590
 
643
- def post_webhook(
644
- self, event_type, team_id, endpoint, passcode, status=None, description=None
645
- ) -> dict[str, Any]:
591
+ async def post_webhook(self, event_type, team_id, endpoint, passcode, status=None, description=None) -> dict[str, Any]:
646
592
  """
647
593
  Registers a new webhook to receive HTTP callbacks for specified events, returning success or error status codes.
648
594
 
@@ -677,7 +623,7 @@ class FigmaApp(APIApplication):
677
623
  response.raise_for_status()
678
624
  return response.json()
679
625
 
680
- def get_webhook(self, webhook_id) -> dict[str, Any]:
626
+ async def get_webhook(self, webhook_id) -> dict[str, Any]:
681
627
  """
682
628
  Retrieves information about a specific webhook by its ID using the "GET" method at the path "/v2/webhooks/{webhook_id}".
683
629
 
@@ -698,9 +644,7 @@ class FigmaApp(APIApplication):
698
644
  response.raise_for_status()
699
645
  return response.json()
700
646
 
701
- def put_webhook(
702
- self, webhook_id, event_type, endpoint, passcode, status=None, description=None
703
- ) -> dict[str, Any]:
647
+ async def put_webhook(self, webhook_id, event_type, endpoint, passcode, status=None, description=None) -> dict[str, Any]:
704
648
  """
705
649
  Updates an existing webhook's configuration using the provided webhook ID and returns an HTTP status code indicating success or failure.
706
650
 
@@ -722,13 +666,7 @@ class FigmaApp(APIApplication):
722
666
  """
723
667
  if webhook_id is None:
724
668
  raise ValueError("Missing required parameter 'webhook_id'")
725
- request_body = {
726
- "event_type": event_type,
727
- "endpoint": endpoint,
728
- "passcode": passcode,
729
- "status": status,
730
- "description": description,
731
- }
669
+ request_body = {"event_type": event_type, "endpoint": endpoint, "passcode": passcode, "status": status, "description": description}
732
670
  request_body = {k: v for k, v in request_body.items() if v is not None}
733
671
  url = f"{self.base_url}/v2/webhooks/{webhook_id}"
734
672
  query_params = {}
@@ -736,7 +674,7 @@ class FigmaApp(APIApplication):
736
674
  response.raise_for_status()
737
675
  return response.json()
738
676
 
739
- def delete_webhook(self, webhook_id) -> dict[str, Any]:
677
+ async def delete_webhook(self, webhook_id) -> dict[str, Any]:
740
678
  """
741
679
  Deletes a webhook identified by its `webhook_id`, permanently removing it to manage and optimize webhook configurations.
742
680
 
@@ -757,7 +695,7 @@ class FigmaApp(APIApplication):
757
695
  response.raise_for_status()
758
696
  return response.json()
759
697
 
760
- def get_team_webhooks(self, team_id) -> dict[str, Any]:
698
+ async def get_team_webhooks(self, team_id) -> dict[str, Any]:
761
699
  """
762
700
  Retrieves a list of webhooks for a specified team using the "GET" method, with the team identified by the `team_id` path parameter.
763
701
 
@@ -778,7 +716,7 @@ class FigmaApp(APIApplication):
778
716
  response.raise_for_status()
779
717
  return response.json()
780
718
 
781
- def get_webhook_requests(self, webhook_id) -> dict[str, Any]:
719
+ async def get_webhook_requests(self, webhook_id) -> dict[str, Any]:
782
720
  """
783
721
  Retrieves a list of requests for a specific webhook identified by `{webhook_id}` using the "GET" method.
784
722
 
@@ -799,9 +737,7 @@ class FigmaApp(APIApplication):
799
737
  response.raise_for_status()
800
738
  return response.json()
801
739
 
802
- def get_activity_logs(
803
- self, events=None, start_time=None, end_time=None, limit=None, order=None
804
- ) -> dict[str, Any]:
740
+ async def get_activity_logs(self, events=None, start_time=None, end_time=None, limit=None, order=None) -> dict[str, Any]:
805
741
  """
806
742
  Retrieves a list of activity logs filtered by specified events, time range, and other parameters, returning the results in a specified order with a limited number of entries.
807
743
 
@@ -821,26 +757,15 @@ class FigmaApp(APIApplication):
821
757
  url = f"{self.base_url}/v1/activity_logs"
822
758
  query_params = {
823
759
  k: v
824
- for k, v in [
825
- ("events", events),
826
- ("start_time", start_time),
827
- ("end_time", end_time),
828
- ("limit", limit),
829
- ("order", order),
830
- ]
760
+ for k, v in [("events", events), ("start_time", start_time), ("end_time", end_time), ("limit", limit), ("order", order)]
831
761
  if v is not None
832
762
  }
833
763
  response = self._get(url, params=query_params)
834
764
  response.raise_for_status()
835
765
  return response.json()
836
766
 
837
- def get_payments(
838
- self,
839
- plugin_payment_token=None,
840
- user_id=None,
841
- community_file_id=None,
842
- plugin_id=None,
843
- widget_id=None,
767
+ async def get_payments(
768
+ self, plugin_payment_token=None, user_id=None, community_file_id=None, plugin_id=None, widget_id=None
844
769
  ) -> dict[str, Any]:
845
770
  """
846
771
  Retrieves payment information based on specified parameters, including plugin payment token, user ID, community file ID, plugin ID, and widget ID, using the "/v1/payments" API endpoint with a GET request.
@@ -874,7 +799,7 @@ class FigmaApp(APIApplication):
874
799
  response.raise_for_status()
875
800
  return response.json()
876
801
 
877
- def get_local_variables(self, file_key) -> dict[str, Any]:
802
+ async def get_local_variables(self, file_key) -> dict[str, Any]:
878
803
  """
879
804
  Retrieves local variables for a file specified by the "file_key" using the "GET" method.
880
805
 
@@ -895,7 +820,7 @@ class FigmaApp(APIApplication):
895
820
  response.raise_for_status()
896
821
  return response.json()
897
822
 
898
- def get_published_variables(self, file_key) -> dict[str, Any]:
823
+ async def get_published_variables(self, file_key) -> dict[str, Any]:
899
824
  """
900
825
  Retrieves the published variables for a file identified by the `{file_key}` using the `GET` method.
901
826
 
@@ -916,13 +841,8 @@ class FigmaApp(APIApplication):
916
841
  response.raise_for_status()
917
842
  return response.json()
918
843
 
919
- def post_variables(
920
- self,
921
- file_key,
922
- variableCollections=None,
923
- variableModes=None,
924
- variables=None,
925
- variableModeValues=None,
844
+ async def post_variables(
845
+ self, file_key, variableCollections=None, variableModes=None, variables=None, variableModeValues=None
926
846
  ) -> dict[str, Any]:
927
847
  """
928
848
  Creates variables for a specific file identified by its file_key and returns an appropriate status code based on the operation's outcome.
@@ -955,7 +875,7 @@ class FigmaApp(APIApplication):
955
875
  response.raise_for_status()
956
876
  return response.json()
957
877
 
958
- def get_dev_resources(self, file_key, node_ids=None) -> dict[str, Any]:
878
+ async def get_dev_resources(self, file_key, node_ids=None) -> dict[str, Any]:
959
879
  """
960
880
  Retrieves development resources associated with a specific file, identified by its file_key, with optional filtering by node IDs.
961
881
 
@@ -977,7 +897,7 @@ class FigmaApp(APIApplication):
977
897
  response.raise_for_status()
978
898
  return response.json()
979
899
 
980
- def post_dev_resources(self, dev_resources) -> dict[str, Any]:
900
+ async def post_dev_resources(self, dev_resources) -> dict[str, Any]:
981
901
  """
982
902
  Creates developer resources via the API and returns a status response.
983
903
 
@@ -990,9 +910,7 @@ class FigmaApp(APIApplication):
990
910
  Tags:
991
911
  Dev Resources
992
912
  """
993
- request_body = {
994
- "dev_resources": dev_resources,
995
- }
913
+ request_body = {"dev_resources": dev_resources}
996
914
  request_body = {k: v for k, v in request_body.items() if v is not None}
997
915
  url = f"{self.base_url}/v1/dev_resources"
998
916
  query_params = {}
@@ -1000,7 +918,7 @@ class FigmaApp(APIApplication):
1000
918
  response.raise_for_status()
1001
919
  return response.json()
1002
920
 
1003
- def put_dev_resources(self, dev_resources) -> dict[str, Any]:
921
+ async def put_dev_resources(self, dev_resources) -> dict[str, Any]:
1004
922
  """
1005
923
  Replaces a specific developer resource at the specified path with updated data, returning a status code for success or error conditions.
1006
924
 
@@ -1013,9 +931,7 @@ class FigmaApp(APIApplication):
1013
931
  Tags:
1014
932
  Dev Resources
1015
933
  """
1016
- request_body = {
1017
- "dev_resources": dev_resources,
1018
- }
934
+ request_body = {"dev_resources": dev_resources}
1019
935
  request_body = {k: v for k, v in request_body.items() if v is not None}
1020
936
  url = f"{self.base_url}/v1/dev_resources"
1021
937
  query_params = {}
@@ -1023,7 +939,7 @@ class FigmaApp(APIApplication):
1023
939
  response.raise_for_status()
1024
940
  return response.json()
1025
941
 
1026
- def delete_dev_resource(self, file_key, dev_resource_id) -> Any:
942
+ async def delete_dev_resource(self, file_key, dev_resource_id) -> Any:
1027
943
  """
1028
944
  Deletes a specific development resource associated with a file using the provided file key and development resource ID.
1029
945
 
@@ -1,7 +1,6 @@
1
1
  import os
2
2
  import shutil
3
3
  import uuid
4
-
5
4
  from universal_mcp.applications.application import BaseApplication
6
5
 
7
6
 
@@ -63,14 +62,7 @@ class FileSystemApp(BaseApplication):
63
62
  file_path = await FileSystemApp._generate_file_path()
64
63
  with open(file_path, "wb") as f:
65
64
  f.write(file_data)
66
- result = {
67
- "status": "success",
68
- "data": {
69
- "url": file_path,
70
- "filename": file_path,
71
- "size": len(file_data),
72
- },
73
- }
65
+ result = {"status": "success", "data": {"url": file_path, "filename": file_path, "size": len(file_data)}}
74
66
  return result
75
67
 
76
68
  @staticmethod
@@ -98,7 +90,4 @@ class FileSystemApp(BaseApplication):
98
90
  return {"status": "success"}
99
91
 
100
92
  def list_tools(self):
101
- return [
102
- FileSystemApp.read_file,
103
- FileSystemApp.write_file,
104
- ]
93
+ return [FileSystemApp.read_file, FileSystemApp.write_file]