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
 
@@ -11,14 +10,9 @@ class ShortcutApp(APIApplication):
11
10
 
12
11
  def _get_headers(self) -> dict[str, Any]:
13
12
  api_key = self.integration.get_credentials().get("api_key")
14
- return {
15
- "Shortcut-Token": f"{api_key}",
16
- "Content-Type": "application/json",
17
- }
13
+ return {"Shortcut-Token": f"{api_key}", "Content-Type": "application/json"}
18
14
 
19
- def list_categories(
20
- self,
21
- ) -> list[Any]:
15
+ async def list_categories(self) -> list[Any]:
22
16
  """
23
17
  Retrieves a list of categories from the API.
24
18
 
@@ -40,9 +34,7 @@ class ShortcutApp(APIApplication):
40
34
  response.raise_for_status()
41
35
  return response.json()
42
36
 
43
- def create_category(
44
- self, name, color=None, external_id=None, type=None
45
- ) -> dict[str, Any]:
37
+ async def create_category(self, name, color=None, external_id=None, type=None) -> dict[str, Any]:
46
38
  """
47
39
  Creates a new category with the specified parameters.
48
40
 
@@ -64,12 +56,7 @@ class ShortcutApp(APIApplication):
64
56
  """
65
57
  if name is None:
66
58
  raise ValueError("Missing required parameter 'name'")
67
- request_body = {
68
- "name": name,
69
- "color": color,
70
- "external_id": external_id,
71
- "type": type,
72
- }
59
+ request_body = {"name": name, "color": color, "external_id": external_id, "type": type}
73
60
  request_body = {k: v for k, v in request_body.items() if v is not None}
74
61
  url = f"{self.base_url}/api/v3/categories"
75
62
  query_params = {}
@@ -77,7 +64,7 @@ class ShortcutApp(APIApplication):
77
64
  response.raise_for_status()
78
65
  return response.json()
79
66
 
80
- def get_category(self, category_public_id) -> dict[str, Any]:
67
+ async def get_category(self, category_public_id) -> dict[str, Any]:
81
68
  """
82
69
  Fetches a category by its public ID.
83
70
 
@@ -101,9 +88,7 @@ class ShortcutApp(APIApplication):
101
88
  response.raise_for_status()
102
89
  return response.json()
103
90
 
104
- def update_category(
105
- self, category_public_id, name=None, color=None, archived=None
106
- ) -> dict[str, Any]:
91
+ async def update_category(self, category_public_id, name=None, color=None, archived=None) -> dict[str, Any]:
107
92
  """
108
93
  Updates a category with the specified attributes.
109
94
 
@@ -125,11 +110,7 @@ class ShortcutApp(APIApplication):
125
110
  """
126
111
  if category_public_id is None:
127
112
  raise ValueError("Missing required parameter 'category-public-id'")
128
- request_body = {
129
- "name": name,
130
- "color": color,
131
- "archived": archived,
132
- }
113
+ request_body = {"name": name, "color": color, "archived": archived}
133
114
  request_body = {k: v for k, v in request_body.items() if v is not None}
134
115
  url = f"{self.base_url}/api/v3/categories/{category_public_id}"
135
116
  query_params = {}
@@ -137,7 +118,7 @@ class ShortcutApp(APIApplication):
137
118
  response.raise_for_status()
138
119
  return response.json()
139
120
 
140
- def delete_category(self, category_public_id) -> Any:
121
+ async def delete_category(self, category_public_id) -> Any:
141
122
  """
142
123
  Deletes a category by its public ID.
143
124
 
@@ -162,7 +143,7 @@ class ShortcutApp(APIApplication):
162
143
  response.raise_for_status()
163
144
  return response.json()
164
145
 
165
- def list_category_milestones(self, category_public_id) -> list[Any]:
146
+ async def list_category_milestones(self, category_public_id) -> list[Any]:
166
147
  """
167
148
  Lists all milestones associated with a specified category.
168
149
 
@@ -187,7 +168,7 @@ class ShortcutApp(APIApplication):
187
168
  response.raise_for_status()
188
169
  return response.json()
189
170
 
190
- def list_category_objectives(self, category_public_id) -> list[Any]:
171
+ async def list_category_objectives(self, category_public_id) -> list[Any]:
191
172
  """
192
173
  Fetches and lists objectives for a given category based on its public ID.
193
174
 
@@ -211,9 +192,7 @@ class ShortcutApp(APIApplication):
211
192
  response.raise_for_status()
212
193
  return response.json()
213
194
 
214
- def list_custom_fields(
215
- self,
216
- ) -> list[Any]:
195
+ async def list_custom_fields(self) -> list[Any]:
217
196
  """
218
197
  Retrieves a list of custom fields from the API.
219
198
 
@@ -235,7 +214,7 @@ class ShortcutApp(APIApplication):
235
214
  response.raise_for_status()
236
215
  return response.json()
237
216
 
238
- def get_custom_field(self, custom_field_public_id) -> dict[str, Any]:
217
+ async def get_custom_field(self, custom_field_public_id) -> dict[str, Any]:
239
218
  """
240
219
  Retrieves a custom field by its public ID.
241
220
 
@@ -260,7 +239,7 @@ class ShortcutApp(APIApplication):
260
239
  response.raise_for_status()
261
240
  return response.json()
262
241
 
263
- def update_custom_field(
242
+ async def update_custom_field(
264
243
  self,
265
244
  custom_field_public_id,
266
245
  enabled=None,
@@ -312,7 +291,7 @@ class ShortcutApp(APIApplication):
312
291
  response.raise_for_status()
313
292
  return response.json()
314
293
 
315
- def delete_custom_field(self, custom_field_public_id) -> Any:
294
+ async def delete_custom_field(self, custom_field_public_id) -> Any:
316
295
  """
317
296
  Deletes a custom field specified by its public identifier.
318
297
 
@@ -337,9 +316,7 @@ class ShortcutApp(APIApplication):
337
316
  response.raise_for_status()
338
317
  return response.json()
339
318
 
340
- def list_entity_templates(
341
- self,
342
- ) -> list[Any]:
319
+ async def list_entity_templates(self) -> list[Any]:
343
320
  """
344
321
  Retrieves a list of entity templates from an API endpoint.
345
322
 
@@ -361,9 +338,7 @@ class ShortcutApp(APIApplication):
361
338
  response.raise_for_status()
362
339
  return response.json()
363
340
 
364
- def create_entity_template(
365
- self, name, story_contents, author_id=None
366
- ) -> dict[str, Any]:
341
+ async def create_entity_template(self, name, story_contents, author_id=None) -> dict[str, Any]:
367
342
  """
368
343
  Creates an entity template with the provided name, story contents, and optional author ID.
369
344
 
@@ -386,11 +361,7 @@ class ShortcutApp(APIApplication):
386
361
  raise ValueError("Missing required parameter 'name'")
387
362
  if story_contents is None:
388
363
  raise ValueError("Missing required parameter 'story_contents'")
389
- request_body = {
390
- "name": name,
391
- "author_id": author_id,
392
- "story_contents": story_contents,
393
- }
364
+ request_body = {"name": name, "author_id": author_id, "story_contents": story_contents}
394
365
  request_body = {k: v for k, v in request_body.items() if v is not None}
395
366
  url = f"{self.base_url}/api/v3/entity-templates"
396
367
  query_params = {}
@@ -398,9 +369,7 @@ class ShortcutApp(APIApplication):
398
369
  response.raise_for_status()
399
370
  return response.json()
400
371
 
401
- def disable_story_templates(
402
- self,
403
- ) -> Any:
372
+ async def disable_story_templates(self) -> Any:
404
373
  """
405
374
  Disables story entity templates by sending a PUT request to the API endpoint.
406
375
 
@@ -422,9 +391,7 @@ class ShortcutApp(APIApplication):
422
391
  response.raise_for_status()
423
392
  return response.json()
424
393
 
425
- def enable_story_templates(
426
- self,
427
- ) -> Any:
394
+ async def enable_story_templates(self) -> Any:
428
395
  """
429
396
  Enables story templates by making a PUT request to the entity-templates endpoint.
430
397
 
@@ -446,7 +413,7 @@ class ShortcutApp(APIApplication):
446
413
  response.raise_for_status()
447
414
  return response.json()
448
415
 
449
- def get_entity_template(self, entity_template_public_id) -> dict[str, Any]:
416
+ async def get_entity_template(self, entity_template_public_id) -> dict[str, Any]:
450
417
  """
451
418
  Retrieves a specific entity template by its public ID.
452
419
 
@@ -471,9 +438,7 @@ class ShortcutApp(APIApplication):
471
438
  response.raise_for_status()
472
439
  return response.json()
473
440
 
474
- def update_entity_template(
475
- self, entity_template_public_id, name=None, story_contents=None
476
- ) -> dict[str, Any]:
441
+ async def update_entity_template(self, entity_template_public_id, name=None, story_contents=None) -> dict[str, Any]:
477
442
  """
478
443
  Updates an entity template using the provided public ID, optionally setting its name and story contents.
479
444
 
@@ -493,10 +458,7 @@ class ShortcutApp(APIApplication):
493
458
  """
494
459
  if entity_template_public_id is None:
495
460
  raise ValueError("Missing required parameter 'entity-template-public-id'")
496
- request_body = {
497
- "name": name,
498
- "story_contents": story_contents,
499
- }
461
+ request_body = {"name": name, "story_contents": story_contents}
500
462
  request_body = {k: v for k, v in request_body.items() if v is not None}
501
463
  url = f"{self.base_url}/api/v3/entity-templates/{entity_template_public_id}"
502
464
  query_params = {}
@@ -504,7 +466,7 @@ class ShortcutApp(APIApplication):
504
466
  response.raise_for_status()
505
467
  return response.json()
506
468
 
507
- def delete_entity_template(self, entity_template_public_id) -> Any:
469
+ async def delete_entity_template(self, entity_template_public_id) -> Any:
508
470
  """
509
471
  Deletes an entity template by its public ID.
510
472
 
@@ -528,9 +490,7 @@ class ShortcutApp(APIApplication):
528
490
  response.raise_for_status()
529
491
  return response.json()
530
492
 
531
- def get_epic_workflow(
532
- self,
533
- ) -> dict[str, Any]:
493
+ async def get_epic_workflow(self) -> dict[str, Any]:
534
494
  """
535
495
  Retrieves the epic workflow configuration from the API.
536
496
 
@@ -552,7 +512,7 @@ class ShortcutApp(APIApplication):
552
512
  response.raise_for_status()
553
513
  return response.json()
554
514
 
555
- def list_epics(self, includes_description=None) -> list[Any]:
515
+ async def list_epics(self, includes_description=None) -> list[Any]:
556
516
  """
557
517
  Fetches a list of epics from the API.
558
518
 
@@ -569,16 +529,12 @@ class ShortcutApp(APIApplication):
569
529
  list, epics, async-job, management, important
570
530
  """
571
531
  url = f"{self.base_url}/api/v3/epics"
572
- query_params = {
573
- k: v
574
- for k, v in [("includes_description", includes_description)]
575
- if v is not None
576
- }
532
+ query_params = {k: v for k, v in [("includes_description", includes_description)] if v is not None}
577
533
  response = self._get(url, params=query_params)
578
534
  response.raise_for_status()
579
535
  return response.json()
580
536
 
581
- def create_epic(
537
+ async def create_epic(
582
538
  self,
583
539
  name,
584
540
  description=None,
@@ -664,7 +620,7 @@ class ShortcutApp(APIApplication):
664
620
  response.raise_for_status()
665
621
  return response.json()
666
622
 
667
- def get_epic(self, epic_public_id) -> dict[str, Any]:
623
+ async def get_epic(self, epic_public_id) -> dict[str, Any]:
668
624
  """
669
625
  Fetches an epic by its public ID
670
626
 
@@ -688,7 +644,7 @@ class ShortcutApp(APIApplication):
688
644
  response.raise_for_status()
689
645
  return response.json()
690
646
 
691
- def update_epic(
647
+ async def update_epic(
692
648
  self,
693
649
  epic_public_id,
694
650
  description=None,
@@ -779,7 +735,7 @@ class ShortcutApp(APIApplication):
779
735
  response.raise_for_status()
780
736
  return response.json()
781
737
 
782
- def delete_epic(self, epic_public_id) -> Any:
738
+ async def delete_epic(self, epic_public_id) -> Any:
783
739
  """
784
740
  Deletes an epic by its public ID.
785
741
 
@@ -804,7 +760,7 @@ class ShortcutApp(APIApplication):
804
760
  response.raise_for_status()
805
761
  return response.json()
806
762
 
807
- def list_epic_comments(self, epic_public_id) -> list[Any]:
763
+ async def list_epic_comments(self, epic_public_id) -> list[Any]:
808
764
  """
809
765
  Retrieves a list of comments for a specified epic.
810
766
 
@@ -829,14 +785,8 @@ class ShortcutApp(APIApplication):
829
785
  response.raise_for_status()
830
786
  return response.json()
831
787
 
832
- def create_epic_comment(
833
- self,
834
- epic_public_id,
835
- text,
836
- author_id=None,
837
- created_at=None,
838
- updated_at=None,
839
- external_id=None,
788
+ async def create_epic_comment(
789
+ self, epic_public_id, text, author_id=None, created_at=None, updated_at=None, external_id=None
840
790
  ) -> dict[str, Any]:
841
791
  """
842
792
  Creates a comment on an epic with the specified details.
@@ -876,7 +826,7 @@ class ShortcutApp(APIApplication):
876
826
  response.raise_for_status()
877
827
  return response.json()
878
828
 
879
- def get_epic_comment(self, epic_public_id, comment_public_id) -> dict[str, Any]:
829
+ async def get_epic_comment(self, epic_public_id, comment_public_id) -> dict[str, Any]:
880
830
  """
881
831
  Retrieves a specific comment from an epic by their respective public IDs.
882
832
 
@@ -904,9 +854,7 @@ class ShortcutApp(APIApplication):
904
854
  response.raise_for_status()
905
855
  return response.json()
906
856
 
907
- def update_epic_comment(
908
- self, epic_public_id, comment_public_id, text
909
- ) -> dict[str, Any]:
857
+ async def update_epic_comment(self, epic_public_id, comment_public_id, text) -> dict[str, Any]:
910
858
  """
911
859
  Updates the text of an existing comment on a specified epic.
912
860
 
@@ -931,9 +879,7 @@ class ShortcutApp(APIApplication):
931
879
  raise ValueError("Missing required parameter 'comment-public-id'")
932
880
  if text is None:
933
881
  raise ValueError("Missing required parameter 'text'")
934
- request_body = {
935
- "text": text,
936
- }
882
+ request_body = {"text": text}
937
883
  request_body = {k: v for k, v in request_body.items() if v is not None}
938
884
  url = f"{self.base_url}/api/v3/epics/{epic_public_id}/comments/{comment_public_id}"
939
885
  query_params = {}
@@ -941,15 +887,8 @@ class ShortcutApp(APIApplication):
941
887
  response.raise_for_status()
942
888
  return response.json()
943
889
 
944
- def create_epic_comment_comment(
945
- self,
946
- epic_public_id,
947
- comment_public_id,
948
- text,
949
- author_id=None,
950
- created_at=None,
951
- updated_at=None,
952
- external_id=None,
890
+ async def create_epic_comment_comment(
891
+ self, epic_public_id, comment_public_id, text, author_id=None, created_at=None, updated_at=None, external_id=None
953
892
  ) -> dict[str, Any]:
954
893
  """
955
894
  Creates a reply to an existing comment on a specified epic, sending the reply to the backend API and returning the created comment data.
@@ -993,7 +932,7 @@ class ShortcutApp(APIApplication):
993
932
  response.raise_for_status()
994
933
  return response.json()
995
934
 
996
- def delete_epic_comment(self, epic_public_id, comment_public_id) -> Any:
935
+ async def delete_epic_comment(self, epic_public_id, comment_public_id) -> Any:
997
936
  """
998
937
  Deletes a specific comment from an epic using its public identifiers.
999
938
 
@@ -1021,7 +960,7 @@ class ShortcutApp(APIApplication):
1021
960
  response.raise_for_status()
1022
961
  return response.json()
1023
962
 
1024
- def list_epic_stories(self, epic_public_id, includes_description=None) -> list[Any]:
963
+ async def list_epic_stories(self, epic_public_id, includes_description=None) -> list[Any]:
1025
964
  """
1026
965
  Retrieves a list of stories associated with a specific epic.
1027
966
 
@@ -1042,16 +981,12 @@ class ShortcutApp(APIApplication):
1042
981
  if epic_public_id is None:
1043
982
  raise ValueError("Missing required parameter 'epic-public-id'")
1044
983
  url = f"{self.base_url}/api/v3/epics/{epic_public_id}/stories"
1045
- query_params = {
1046
- k: v
1047
- for k, v in [("includes_description", includes_description)]
1048
- if v is not None
1049
- }
984
+ query_params = {k: v for k, v in [("includes_description", includes_description)] if v is not None}
1050
985
  response = self._get(url, params=query_params)
1051
986
  response.raise_for_status()
1052
987
  return response.json()
1053
988
 
1054
- def unlink_productboard_from_epic(self, epic_public_id) -> Any:
989
+ async def unlink_productboard_from_epic(self, epic_public_id) -> Any:
1055
990
  """
1056
991
  Unlinks a ProductBoard integration from an epic in the system.
1057
992
 
@@ -1076,7 +1011,7 @@ class ShortcutApp(APIApplication):
1076
1011
  response.raise_for_status()
1077
1012
  return response.json()
1078
1013
 
1079
- def get_external_link_stories(self, external_link) -> list[Any]:
1014
+ async def get_external_link_stories(self, external_link) -> list[Any]:
1080
1015
  """
1081
1016
  Retrieves stories associated with an external link.
1082
1017
 
@@ -1096,16 +1031,12 @@ class ShortcutApp(APIApplication):
1096
1031
  if external_link is None:
1097
1032
  raise ValueError("Missing required parameter 'external_link'")
1098
1033
  url = f"{self.base_url}/api/v3/external-link/stories"
1099
- query_params = {
1100
- k: v for k, v in [("external_link", external_link)] if v is not None
1101
- }
1034
+ query_params = {k: v for k, v in [("external_link", external_link)] if v is not None}
1102
1035
  response = self._get(url, params=query_params)
1103
1036
  response.raise_for_status()
1104
1037
  return response.json()
1105
1038
 
1106
- def list_files(
1107
- self,
1108
- ) -> list[Any]:
1039
+ async def list_files(self) -> list[Any]:
1109
1040
  """
1110
1041
  Retrieves a list of files from the remote API endpoint.
1111
1042
 
@@ -1127,7 +1058,7 @@ class ShortcutApp(APIApplication):
1127
1058
  response.raise_for_status()
1128
1059
  return response.json()
1129
1060
 
1130
- def get_file(self, file_public_id) -> dict[str, Any]:
1061
+ async def get_file(self, file_public_id) -> dict[str, Any]:
1131
1062
  """
1132
1063
  Retrieves a file based on its public ID, returning a dictionary containing file information.
1133
1064
 
@@ -1151,15 +1082,8 @@ class ShortcutApp(APIApplication):
1151
1082
  response.raise_for_status()
1152
1083
  return response.json()
1153
1084
 
1154
- def update_file(
1155
- self,
1156
- file_public_id,
1157
- description=None,
1158
- created_at=None,
1159
- updated_at=None,
1160
- name=None,
1161
- uploader_id=None,
1162
- external_id=None,
1085
+ async def update_file(
1086
+ self, file_public_id, description=None, created_at=None, updated_at=None, name=None, uploader_id=None, external_id=None
1163
1087
  ) -> dict[str, Any]:
1164
1088
  """
1165
1089
  Updates metadata for a file identified by its public ID.
@@ -1200,7 +1124,7 @@ class ShortcutApp(APIApplication):
1200
1124
  response.raise_for_status()
1201
1125
  return response.json()
1202
1126
 
1203
- def delete_file(self, file_public_id) -> Any:
1127
+ async def delete_file(self, file_public_id) -> Any:
1204
1128
  """
1205
1129
  Deletes a file identified by a public ID from the server.
1206
1130
 
@@ -1225,9 +1149,7 @@ class ShortcutApp(APIApplication):
1225
1149
  response.raise_for_status()
1226
1150
  return response.json()
1227
1151
 
1228
- def list_groups(
1229
- self,
1230
- ) -> list[Any]:
1152
+ async def list_groups(self) -> list[Any]:
1231
1153
  """
1232
1154
  Retrieves a list of all groups from the API.
1233
1155
 
@@ -1249,16 +1171,8 @@ class ShortcutApp(APIApplication):
1249
1171
  response.raise_for_status()
1250
1172
  return response.json()
1251
1173
 
1252
- def create_group(
1253
- self,
1254
- name,
1255
- mention_name,
1256
- description=None,
1257
- member_ids=None,
1258
- workflow_ids=None,
1259
- color=None,
1260
- color_key=None,
1261
- display_icon_id=None,
1174
+ async def create_group(
1175
+ self, name, mention_name, description=None, member_ids=None, workflow_ids=None, color=None, color_key=None, display_icon_id=None
1262
1176
  ) -> dict[str, Any]:
1263
1177
  """
1264
1178
  Creates a new group with the specified configuration and returns the group's details.
@@ -1304,7 +1218,7 @@ class ShortcutApp(APIApplication):
1304
1218
  response.raise_for_status()
1305
1219
  return response.json()
1306
1220
 
1307
- def get_group(self, group_public_id) -> dict[str, Any]:
1221
+ async def get_group(self, group_public_id) -> dict[str, Any]:
1308
1222
  """
1309
1223
  Retrieves information about a specific group using its public ID.
1310
1224
 
@@ -1329,7 +1243,7 @@ class ShortcutApp(APIApplication):
1329
1243
  response.raise_for_status()
1330
1244
  return response.json()
1331
1245
 
1332
- def update_group(
1246
+ async def update_group(
1333
1247
  self,
1334
1248
  group_public_id,
1335
1249
  description=None,
@@ -1387,7 +1301,7 @@ class ShortcutApp(APIApplication):
1387
1301
  response.raise_for_status()
1388
1302
  return response.json()
1389
1303
 
1390
- def list_group_stories(self, group_public_id, limit=None, offset=None) -> list[Any]:
1304
+ async def list_group_stories(self, group_public_id, limit=None, offset=None) -> list[Any]:
1391
1305
  """
1392
1306
  Retrieves a list of stories from a specific group.
1393
1307
 
@@ -1409,16 +1323,12 @@ class ShortcutApp(APIApplication):
1409
1323
  if group_public_id is None:
1410
1324
  raise ValueError("Missing required parameter 'group-public-id'")
1411
1325
  url = f"{self.base_url}/api/v3/groups/{group_public_id}/stories"
1412
- query_params = {
1413
- k: v for k, v in [("limit", limit), ("offset", offset)] if v is not None
1414
- }
1326
+ query_params = {k: v for k, v in [("limit", limit), ("offset", offset)] if v is not None}
1415
1327
  response = self._get(url, params=query_params)
1416
1328
  response.raise_for_status()
1417
1329
  return response.json()
1418
1330
 
1419
- def list_iterations(
1420
- self,
1421
- ) -> list[Any]:
1331
+ async def list_iterations(self) -> list[Any]:
1422
1332
  """
1423
1333
  Lists all available iterations from the API.
1424
1334
 
@@ -1440,15 +1350,8 @@ class ShortcutApp(APIApplication):
1440
1350
  response.raise_for_status()
1441
1351
  return response.json()
1442
1352
 
1443
- def create_iteration(
1444
- self,
1445
- name,
1446
- start_date,
1447
- end_date,
1448
- follower_ids=None,
1449
- group_ids=None,
1450
- labels=None,
1451
- description=None,
1353
+ async def create_iteration(
1354
+ self, name, start_date, end_date, follower_ids=None, group_ids=None, labels=None, description=None
1452
1355
  ) -> dict[str, Any]:
1453
1356
  """
1454
1357
  Creates a new iteration with the specified details and returns the server's response as a dictionary.
@@ -1494,9 +1397,7 @@ class ShortcutApp(APIApplication):
1494
1397
  response.raise_for_status()
1495
1398
  return response.json()
1496
1399
 
1497
- def disable_iterations(
1498
- self,
1499
- ) -> Any:
1400
+ async def disable_iterations(self) -> Any:
1500
1401
  """
1501
1402
  Disables iterations by making a PUT request to the iterations API endpoint.
1502
1403
 
@@ -1518,9 +1419,7 @@ class ShortcutApp(APIApplication):
1518
1419
  response.raise_for_status()
1519
1420
  return response.json()
1520
1421
 
1521
- def enable_iterations(
1522
- self,
1523
- ) -> Any:
1422
+ async def enable_iterations(self) -> Any:
1524
1423
  """
1525
1424
  Enable iterations for the API service.
1526
1425
 
@@ -1542,7 +1441,7 @@ class ShortcutApp(APIApplication):
1542
1441
  response.raise_for_status()
1543
1442
  return response.json()
1544
1443
 
1545
- def get_iteration(self, iteration_public_id) -> dict[str, Any]:
1444
+ async def get_iteration(self, iteration_public_id) -> dict[str, Any]:
1546
1445
  """
1547
1446
  Retrieves iteration details using the specified public ID.
1548
1447
 
@@ -1567,7 +1466,7 @@ class ShortcutApp(APIApplication):
1567
1466
  response.raise_for_status()
1568
1467
  return response.json()
1569
1468
 
1570
- def update_iteration(
1469
+ async def update_iteration(
1571
1470
  self,
1572
1471
  iteration_public_id,
1573
1472
  follower_ids=None,
@@ -1619,7 +1518,7 @@ class ShortcutApp(APIApplication):
1619
1518
  response.raise_for_status()
1620
1519
  return response.json()
1621
1520
 
1622
- def delete_iteration(self, iteration_public_id) -> Any:
1521
+ async def delete_iteration(self, iteration_public_id) -> Any:
1623
1522
  """
1624
1523
  Deletes a specific iteration identified by its public ID.
1625
1524
 
@@ -1644,9 +1543,7 @@ class ShortcutApp(APIApplication):
1644
1543
  response.raise_for_status()
1645
1544
  return response.json()
1646
1545
 
1647
- def list_iteration_stories(
1648
- self, iteration_public_id, includes_description=None
1649
- ) -> list[Any]:
1546
+ async def list_iteration_stories(self, iteration_public_id, includes_description=None) -> list[Any]:
1650
1547
  """
1651
1548
  Retrieves a list of stories for a specified iteration, optionally including their descriptions.
1652
1549
 
@@ -1667,16 +1564,12 @@ class ShortcutApp(APIApplication):
1667
1564
  if iteration_public_id is None:
1668
1565
  raise ValueError("Missing required parameter 'iteration-public-id'")
1669
1566
  url = f"{self.base_url}/api/v3/iterations/{iteration_public_id}/stories"
1670
- query_params = {
1671
- k: v
1672
- for k, v in [("includes_description", includes_description)]
1673
- if v is not None
1674
- }
1567
+ query_params = {k: v for k, v in [("includes_description", includes_description)] if v is not None}
1675
1568
  response = self._get(url, params=query_params)
1676
1569
  response.raise_for_status()
1677
1570
  return response.json()
1678
1571
 
1679
- def get_key_result(self, key_result_public_id) -> dict[str, Any]:
1572
+ async def get_key_result(self, key_result_public_id) -> dict[str, Any]:
1680
1573
  """
1681
1574
  Retrieves detailed information for a specific key result using its public identifier.
1682
1575
 
@@ -1701,13 +1594,8 @@ class ShortcutApp(APIApplication):
1701
1594
  response.raise_for_status()
1702
1595
  return response.json()
1703
1596
 
1704
- def update_key_result(
1705
- self,
1706
- key_result_public_id,
1707
- name=None,
1708
- initial_observed_value=None,
1709
- observed_value=None,
1710
- target_value=None,
1597
+ async def update_key_result(
1598
+ self, key_result_public_id, name=None, initial_observed_value=None, observed_value=None, target_value=None
1711
1599
  ) -> dict[str, Any]:
1712
1600
  """
1713
1601
  Updates a key result with the provided details.
@@ -1743,7 +1631,7 @@ class ShortcutApp(APIApplication):
1743
1631
  response.raise_for_status()
1744
1632
  return response.json()
1745
1633
 
1746
- def list_labels(self, slim=None) -> list[Any]:
1634
+ async def list_labels(self, slim=None) -> list[Any]:
1747
1635
  """
1748
1636
  Fetches a list of labels from the API.
1749
1637
 
@@ -1765,9 +1653,7 @@ class ShortcutApp(APIApplication):
1765
1653
  response.raise_for_status()
1766
1654
  return response.json()
1767
1655
 
1768
- def create_label(
1769
- self, name, description=None, color=None, external_id=None
1770
- ) -> dict[str, Any]:
1656
+ async def create_label(self, name, description=None, color=None, external_id=None) -> dict[str, Any]:
1771
1657
  """
1772
1658
  Creates a new label with the specified attributes.
1773
1659
 
@@ -1789,12 +1675,7 @@ class ShortcutApp(APIApplication):
1789
1675
  """
1790
1676
  if name is None:
1791
1677
  raise ValueError("Missing required parameter 'name'")
1792
- request_body = {
1793
- "name": name,
1794
- "description": description,
1795
- "color": color,
1796
- "external_id": external_id,
1797
- }
1678
+ request_body = {"name": name, "description": description, "color": color, "external_id": external_id}
1798
1679
  request_body = {k: v for k, v in request_body.items() if v is not None}
1799
1680
  url = f"{self.base_url}/api/v3/labels"
1800
1681
  query_params = {}
@@ -1802,7 +1683,7 @@ class ShortcutApp(APIApplication):
1802
1683
  response.raise_for_status()
1803
1684
  return response.json()
1804
1685
 
1805
- def get_label(self, label_public_id) -> dict[str, Any]:
1686
+ async def get_label(self, label_public_id) -> dict[str, Any]:
1806
1687
  """
1807
1688
  Retrieves a label's details from the API using its public identifier.
1808
1689
 
@@ -1827,9 +1708,7 @@ class ShortcutApp(APIApplication):
1827
1708
  response.raise_for_status()
1828
1709
  return response.json()
1829
1710
 
1830
- def update_label(
1831
- self, label_public_id, name=None, description=None, color=None, archived=None
1832
- ) -> dict[str, Any]:
1711
+ async def update_label(self, label_public_id, name=None, description=None, color=None, archived=None) -> dict[str, Any]:
1833
1712
  """
1834
1713
  Updates a label with the specified information.
1835
1714
 
@@ -1852,12 +1731,7 @@ class ShortcutApp(APIApplication):
1852
1731
  """
1853
1732
  if label_public_id is None:
1854
1733
  raise ValueError("Missing required parameter 'label-public-id'")
1855
- request_body = {
1856
- "name": name,
1857
- "description": description,
1858
- "color": color,
1859
- "archived": archived,
1860
- }
1734
+ request_body = {"name": name, "description": description, "color": color, "archived": archived}
1861
1735
  request_body = {k: v for k, v in request_body.items() if v is not None}
1862
1736
  url = f"{self.base_url}/api/v3/labels/{label_public_id}"
1863
1737
  query_params = {}
@@ -1865,7 +1739,7 @@ class ShortcutApp(APIApplication):
1865
1739
  response.raise_for_status()
1866
1740
  return response.json()
1867
1741
 
1868
- def delete_label(self, label_public_id) -> Any:
1742
+ async def delete_label(self, label_public_id) -> Any:
1869
1743
  """
1870
1744
  Deletes a label identified by its public ID via an HTTP DELETE request.
1871
1745
 
@@ -1890,7 +1764,7 @@ class ShortcutApp(APIApplication):
1890
1764
  response.raise_for_status()
1891
1765
  return response.json()
1892
1766
 
1893
- def list_label_epics(self, label_public_id) -> list[Any]:
1767
+ async def list_label_epics(self, label_public_id) -> list[Any]:
1894
1768
  """
1895
1769
  Retrieves a list of epics associated with a specific label.
1896
1770
 
@@ -1915,9 +1789,7 @@ class ShortcutApp(APIApplication):
1915
1789
  response.raise_for_status()
1916
1790
  return response.json()
1917
1791
 
1918
- def list_label_stories(
1919
- self, label_public_id, includes_description=None
1920
- ) -> list[Any]:
1792
+ async def list_label_stories(self, label_public_id, includes_description=None) -> list[Any]:
1921
1793
  """
1922
1794
  Retrieves a list of stories associated with a specific label.
1923
1795
 
@@ -1938,18 +1810,12 @@ class ShortcutApp(APIApplication):
1938
1810
  if label_public_id is None:
1939
1811
  raise ValueError("Missing required parameter 'label-public-id'")
1940
1812
  url = f"{self.base_url}/api/v3/labels/{label_public_id}/stories"
1941
- query_params = {
1942
- k: v
1943
- for k, v in [("includes_description", includes_description)]
1944
- if v is not None
1945
- }
1813
+ query_params = {k: v for k, v in [("includes_description", includes_description)] if v is not None}
1946
1814
  response = self._get(url, params=query_params)
1947
1815
  response.raise_for_status()
1948
1816
  return response.json()
1949
1817
 
1950
- def list_linked_files(
1951
- self,
1952
- ) -> list[Any]:
1818
+ async def list_linked_files(self) -> list[Any]:
1953
1819
  """
1954
1820
  Retrieve a list of all linked files.
1955
1821
 
@@ -1971,17 +1837,8 @@ class ShortcutApp(APIApplication):
1971
1837
  response.raise_for_status()
1972
1838
  return response.json()
1973
1839
 
1974
- def create_linked_file(
1975
- self,
1976
- name,
1977
- type,
1978
- url,
1979
- description=None,
1980
- story_id=None,
1981
- thumbnail_url=None,
1982
- size=None,
1983
- uploader_id=None,
1984
- content_type=None,
1840
+ async def create_linked_file(
1841
+ self, name, type, url, description=None, story_id=None, thumbnail_url=None, size=None, uploader_id=None, content_type=None
1985
1842
  ) -> dict[str, Any]:
1986
1843
  """
1987
1844
  Creates a linked file with the specified attributes.
@@ -2031,7 +1888,7 @@ class ShortcutApp(APIApplication):
2031
1888
  response.raise_for_status()
2032
1889
  return response.json()
2033
1890
 
2034
- def get_linked_file(self, linked_file_public_id) -> dict[str, Any]:
1891
+ async def get_linked_file(self, linked_file_public_id) -> dict[str, Any]:
2035
1892
  """
2036
1893
  Fetches details for a linked file by its public identifier.
2037
1894
 
@@ -2056,7 +1913,7 @@ class ShortcutApp(APIApplication):
2056
1913
  response.raise_for_status()
2057
1914
  return response.json()
2058
1915
 
2059
- def update_linked_file(
1916
+ async def update_linked_file(
2060
1917
  self,
2061
1918
  linked_file_public_id,
2062
1919
  description=None,
@@ -2111,7 +1968,7 @@ class ShortcutApp(APIApplication):
2111
1968
  response.raise_for_status()
2112
1969
  return response.json()
2113
1970
 
2114
- def delete_linked_file(self, linked_file_public_id) -> Any:
1971
+ async def delete_linked_file(self, linked_file_public_id) -> Any:
2115
1972
  """
2116
1973
  Deletes a linked file by its public ID using the API.
2117
1974
 
@@ -2136,9 +1993,7 @@ class ShortcutApp(APIApplication):
2136
1993
  response.raise_for_status()
2137
1994
  return response.json()
2138
1995
 
2139
- def get_current_member_info(
2140
- self,
2141
- ) -> dict[str, Any]:
1996
+ async def get_current_member_info(self) -> dict[str, Any]:
2142
1997
  """
2143
1998
  Retrieves information about the current authenticated member.
2144
1999
 
@@ -2160,9 +2015,7 @@ class ShortcutApp(APIApplication):
2160
2015
  response.raise_for_status()
2161
2016
  return response.json()
2162
2017
 
2163
- def list_milestones(
2164
- self,
2165
- ) -> list[Any]:
2018
+ async def list_milestones(self) -> list[Any]:
2166
2019
  """
2167
2020
  Lists milestones by fetching them from a specified API endpoint.
2168
2021
 
@@ -2184,14 +2037,8 @@ class ShortcutApp(APIApplication):
2184
2037
  response.raise_for_status()
2185
2038
  return response.json()
2186
2039
 
2187
- def create_milestone(
2188
- self,
2189
- name,
2190
- description=None,
2191
- state=None,
2192
- started_at_override=None,
2193
- completed_at_override=None,
2194
- categories=None,
2040
+ async def create_milestone(
2041
+ self, name, description=None, state=None, started_at_override=None, completed_at_override=None, categories=None
2195
2042
  ) -> dict[str, Any]:
2196
2043
  """
2197
2044
  Creates a new milestone with the specified parameters.
@@ -2231,7 +2078,7 @@ class ShortcutApp(APIApplication):
2231
2078
  response.raise_for_status()
2232
2079
  return response.json()
2233
2080
 
2234
- def get_milestone(self, milestone_public_id) -> dict[str, Any]:
2081
+ async def get_milestone(self, milestone_public_id) -> dict[str, Any]:
2235
2082
  """
2236
2083
  Retrieves a milestone resource by its public identifier.
2237
2084
 
@@ -2256,7 +2103,7 @@ class ShortcutApp(APIApplication):
2256
2103
  response.raise_for_status()
2257
2104
  return response.json()
2258
2105
 
2259
- def update_milestone(
2106
+ async def update_milestone(
2260
2107
  self,
2261
2108
  milestone_public_id,
2262
2109
  description=None,
@@ -2314,7 +2161,7 @@ class ShortcutApp(APIApplication):
2314
2161
  response.raise_for_status()
2315
2162
  return response.json()
2316
2163
 
2317
- def delete_milestone(self, milestone_public_id) -> Any:
2164
+ async def delete_milestone(self, milestone_public_id) -> Any:
2318
2165
  """
2319
2166
  Deletes a milestone by its public ID.
2320
2167
 
@@ -2339,7 +2186,7 @@ class ShortcutApp(APIApplication):
2339
2186
  response.raise_for_status()
2340
2187
  return response.json()
2341
2188
 
2342
- def list_milestone_epics(self, milestone_public_id) -> list[Any]:
2189
+ async def list_milestone_epics(self, milestone_public_id) -> list[Any]:
2343
2190
  """
2344
2191
  Retrieves a list of epics associated with a specified milestone.
2345
2192
 
@@ -2364,9 +2211,7 @@ class ShortcutApp(APIApplication):
2364
2211
  response.raise_for_status()
2365
2212
  return response.json()
2366
2213
 
2367
- def list_objectives(
2368
- self,
2369
- ) -> list[Any]:
2214
+ async def list_objectives(self) -> list[Any]:
2370
2215
  """
2371
2216
  Retrieves a list of all objectives from the API endpoint.
2372
2217
 
@@ -2388,14 +2233,8 @@ class ShortcutApp(APIApplication):
2388
2233
  response.raise_for_status()
2389
2234
  return response.json()
2390
2235
 
2391
- def create_objective(
2392
- self,
2393
- name,
2394
- description=None,
2395
- state=None,
2396
- started_at_override=None,
2397
- completed_at_override=None,
2398
- categories=None,
2236
+ async def create_objective(
2237
+ self, name, description=None, state=None, started_at_override=None, completed_at_override=None, categories=None
2399
2238
  ) -> dict[str, Any]:
2400
2239
  """
2401
2240
  Creates a new objective resource with the specified attributes and returns the created objective's data.
@@ -2435,7 +2274,7 @@ class ShortcutApp(APIApplication):
2435
2274
  response.raise_for_status()
2436
2275
  return response.json()
2437
2276
 
2438
- def get_objective(self, objective_public_id) -> dict[str, Any]:
2277
+ async def get_objective(self, objective_public_id) -> dict[str, Any]:
2439
2278
  """
2440
2279
  Retrieves an objective by its public ID from the API.
2441
2280
 
@@ -2460,7 +2299,7 @@ class ShortcutApp(APIApplication):
2460
2299
  response.raise_for_status()
2461
2300
  return response.json()
2462
2301
 
2463
- def update_objective(
2302
+ async def update_objective(
2464
2303
  self,
2465
2304
  objective_public_id,
2466
2305
  description=None,
@@ -2518,7 +2357,7 @@ class ShortcutApp(APIApplication):
2518
2357
  response.raise_for_status()
2519
2358
  return response.json()
2520
2359
 
2521
- def delete_objective(self, objective_public_id) -> Any:
2360
+ async def delete_objective(self, objective_public_id) -> Any:
2522
2361
  """
2523
2362
  Deletes an objective by its public ID using an HTTP DELETE request.
2524
2363
 
@@ -2543,7 +2382,7 @@ class ShortcutApp(APIApplication):
2543
2382
  response.raise_for_status()
2544
2383
  return response.json()
2545
2384
 
2546
- def list_objective_epics(self, objective_public_id) -> list[Any]:
2385
+ async def list_objective_epics(self, objective_public_id) -> list[Any]:
2547
2386
  """
2548
2387
  Retrieves a list of epics associated with a specific objective.
2549
2388
 
@@ -2568,9 +2407,7 @@ class ShortcutApp(APIApplication):
2568
2407
  response.raise_for_status()
2569
2408
  return response.json()
2570
2409
 
2571
- def list_projects(
2572
- self,
2573
- ) -> list[Any]:
2410
+ async def list_projects(self) -> list[Any]:
2574
2411
  """
2575
2412
  Retrieves and lists all available projects from the API.
2576
2413
 
@@ -2592,7 +2429,7 @@ class ShortcutApp(APIApplication):
2592
2429
  response.raise_for_status()
2593
2430
  return response.json()
2594
2431
 
2595
- def create_project(
2432
+ async def create_project(
2596
2433
  self,
2597
2434
  name,
2598
2435
  team_id,
@@ -2655,7 +2492,7 @@ class ShortcutApp(APIApplication):
2655
2492
  response.raise_for_status()
2656
2493
  return response.json()
2657
2494
 
2658
- def get_project(self, project_public_id) -> dict[str, Any]:
2495
+ async def get_project(self, project_public_id) -> dict[str, Any]:
2659
2496
  """
2660
2497
  Retrieves project information by its public ID.
2661
2498
 
@@ -2680,7 +2517,7 @@ class ShortcutApp(APIApplication):
2680
2517
  response.raise_for_status()
2681
2518
  return response.json()
2682
2519
 
2683
- def update_project(
2520
+ async def update_project(
2684
2521
  self,
2685
2522
  project_public_id,
2686
2523
  description=None,
@@ -2738,7 +2575,7 @@ class ShortcutApp(APIApplication):
2738
2575
  response.raise_for_status()
2739
2576
  return response.json()
2740
2577
 
2741
- def delete_project(self, project_public_id) -> Any:
2578
+ async def delete_project(self, project_public_id) -> Any:
2742
2579
  """
2743
2580
  Deletes a project using its public ID.
2744
2581
 
@@ -2763,7 +2600,7 @@ class ShortcutApp(APIApplication):
2763
2600
  response.raise_for_status()
2764
2601
  return response.json()
2765
2602
 
2766
- def list_stories(self, project_public_id, includes_description=None) -> list[Any]:
2603
+ async def list_stories(self, project_public_id, includes_description=None) -> list[Any]:
2767
2604
  """
2768
2605
  Retrieves a list of stories for a specific project, with optional inclusion of story descriptions.
2769
2606
 
@@ -2784,18 +2621,12 @@ class ShortcutApp(APIApplication):
2784
2621
  if project_public_id is None:
2785
2622
  raise ValueError("Missing required parameter 'project-public-id'")
2786
2623
  url = f"{self.base_url}/api/v3/projects/{project_public_id}/stories"
2787
- query_params = {
2788
- k: v
2789
- for k, v in [("includes_description", includes_description)]
2790
- if v is not None
2791
- }
2624
+ query_params = {k: v for k, v in [("includes_description", includes_description)] if v is not None}
2792
2625
  response = self._get(url, params=query_params)
2793
2626
  response.raise_for_status()
2794
2627
  return response.json()
2795
2628
 
2796
- def list_repositories(
2797
- self,
2798
- ) -> list[Any]:
2629
+ async def list_repositories(self) -> list[Any]:
2799
2630
  """
2800
2631
  Lists all repositories from the API.
2801
2632
 
@@ -2817,7 +2648,7 @@ class ShortcutApp(APIApplication):
2817
2648
  response.raise_for_status()
2818
2649
  return response.json()
2819
2650
 
2820
- def get_repository(self, repo_public_id) -> dict[str, Any]:
2651
+ async def get_repository(self, repo_public_id) -> dict[str, Any]:
2821
2652
  """
2822
2653
  Retrieves detailed information about a repository by its public ID.
2823
2654
 
@@ -2842,9 +2673,7 @@ class ShortcutApp(APIApplication):
2842
2673
  response.raise_for_status()
2843
2674
  return response.json()
2844
2675
 
2845
- def search(
2846
- self, query, page_size=None, detail=None, next=None, entity_types=None
2847
- ) -> dict[str, Any]:
2676
+ async def search(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
2848
2677
  """
2849
2678
  Performs a search operation based on the provided query string and optional parameters like page size and entity types.
2850
2679
 
@@ -2869,22 +2698,14 @@ class ShortcutApp(APIApplication):
2869
2698
  url = f"{self.base_url}/api/v3/search"
2870
2699
  query_params = {
2871
2700
  k: v
2872
- for k, v in [
2873
- ("query", query),
2874
- ("page_size", page_size),
2875
- ("detail", detail),
2876
- ("next", next),
2877
- ("entity_types", entity_types),
2878
- ]
2701
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
2879
2702
  if v is not None
2880
2703
  }
2881
2704
  response = self._get(url, params=query_params)
2882
2705
  response.raise_for_status()
2883
2706
  return response.json()
2884
2707
 
2885
- def search_epics(
2886
- self, query, page_size=None, detail=None, next=None, entity_types=None
2887
- ) -> dict[str, Any]:
2708
+ async def search_epics(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
2888
2709
  """
2889
2710
  Searches for epics based on the provided query parameters.
2890
2711
 
@@ -2910,22 +2731,14 @@ class ShortcutApp(APIApplication):
2910
2731
  url = f"{self.base_url}/api/v3/search/epics"
2911
2732
  query_params = {
2912
2733
  k: v
2913
- for k, v in [
2914
- ("query", query),
2915
- ("page_size", page_size),
2916
- ("detail", detail),
2917
- ("next", next),
2918
- ("entity_types", entity_types),
2919
- ]
2734
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
2920
2735
  if v is not None
2921
2736
  }
2922
2737
  response = self._get(url, params=query_params)
2923
2738
  response.raise_for_status()
2924
2739
  return response.json()
2925
2740
 
2926
- def search_iterations(
2927
- self, query, page_size=None, detail=None, next=None, entity_types=None
2928
- ) -> dict[str, Any]:
2741
+ async def search_iterations(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
2929
2742
  """
2930
2743
  Searches for iterations based on a query and additional parameters.
2931
2744
 
@@ -2951,22 +2764,14 @@ class ShortcutApp(APIApplication):
2951
2764
  url = f"{self.base_url}/api/v3/search/iterations"
2952
2765
  query_params = {
2953
2766
  k: v
2954
- for k, v in [
2955
- ("query", query),
2956
- ("page_size", page_size),
2957
- ("detail", detail),
2958
- ("next", next),
2959
- ("entity_types", entity_types),
2960
- ]
2767
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
2961
2768
  if v is not None
2962
2769
  }
2963
2770
  response = self._get(url, params=query_params)
2964
2771
  response.raise_for_status()
2965
2772
  return response.json()
2966
2773
 
2967
- def search_milestones(
2968
- self, query, page_size=None, detail=None, next=None, entity_types=None
2969
- ) -> dict[str, Any]:
2774
+ async def search_milestones(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
2970
2775
  """
2971
2776
  Searches for milestones matching the provided query and returns the results as a dictionary.
2972
2777
 
@@ -2992,22 +2797,14 @@ class ShortcutApp(APIApplication):
2992
2797
  url = f"{self.base_url}/api/v3/search/milestones"
2993
2798
  query_params = {
2994
2799
  k: v
2995
- for k, v in [
2996
- ("query", query),
2997
- ("page_size", page_size),
2998
- ("detail", detail),
2999
- ("next", next),
3000
- ("entity_types", entity_types),
3001
- ]
2800
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
3002
2801
  if v is not None
3003
2802
  }
3004
2803
  response = self._get(url, params=query_params)
3005
2804
  response.raise_for_status()
3006
2805
  return response.json()
3007
2806
 
3008
- def search_objectives(
3009
- self, query, page_size=None, detail=None, next=None, entity_types=None
3010
- ) -> dict[str, Any]:
2807
+ async def search_objectives(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
3011
2808
  """
3012
2809
  Searches for objectives based on the specified query and returns the search results.
3013
2810
 
@@ -3033,22 +2830,14 @@ class ShortcutApp(APIApplication):
3033
2830
  url = f"{self.base_url}/api/v3/search/objectives"
3034
2831
  query_params = {
3035
2832
  k: v
3036
- for k, v in [
3037
- ("query", query),
3038
- ("page_size", page_size),
3039
- ("detail", detail),
3040
- ("next", next),
3041
- ("entity_types", entity_types),
3042
- ]
2833
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
3043
2834
  if v is not None
3044
2835
  }
3045
2836
  response = self._get(url, params=query_params)
3046
2837
  response.raise_for_status()
3047
2838
  return response.json()
3048
2839
 
3049
- def search_stories(
3050
- self, query, page_size=None, detail=None, next=None, entity_types=None
3051
- ) -> dict[str, Any]:
2840
+ async def search_stories(self, query, page_size=None, detail=None, next=None, entity_types=None) -> dict[str, Any]:
3052
2841
  """
3053
2842
  Searches for stories matching the given query and optional filters, returning paginated results from the stories API.
3054
2843
 
@@ -3074,20 +2863,14 @@ class ShortcutApp(APIApplication):
3074
2863
  url = f"{self.base_url}/api/v3/search/stories"
3075
2864
  query_params = {
3076
2865
  k: v
3077
- for k, v in [
3078
- ("query", query),
3079
- ("page_size", page_size),
3080
- ("detail", detail),
3081
- ("next", next),
3082
- ("entity_types", entity_types),
3083
- ]
2866
+ for k, v in [("query", query), ("page_size", page_size), ("detail", detail), ("next", next), ("entity_types", entity_types)]
3084
2867
  if v is not None
3085
2868
  }
3086
2869
  response = self._get(url, params=query_params)
3087
2870
  response.raise_for_status()
3088
2871
  return response.json()
3089
2872
 
3090
- def create_story(
2873
+ async def create_story(
3091
2874
  self,
3092
2875
  name,
3093
2876
  description=None,
@@ -3209,7 +2992,7 @@ class ShortcutApp(APIApplication):
3209
2992
  response.raise_for_status()
3210
2993
  return response.json()
3211
2994
 
3212
- def update_multiple_stories(
2995
+ async def update_multiple_stories(
3213
2996
  self,
3214
2997
  story_ids,
3215
2998
  archived=None,
@@ -3307,7 +3090,7 @@ class ShortcutApp(APIApplication):
3307
3090
  response.raise_for_status()
3308
3091
  return response.json()
3309
3092
 
3310
- def create_multiple_stories(self, stories) -> list[Any]:
3093
+ async def create_multiple_stories(self, stories) -> list[Any]:
3311
3094
  """
3312
3095
  Creates multiple stories in bulk using the API.
3313
3096
 
@@ -3326,9 +3109,7 @@ class ShortcutApp(APIApplication):
3326
3109
  """
3327
3110
  if stories is None:
3328
3111
  raise ValueError("Missing required parameter 'stories'")
3329
- request_body = {
3330
- "stories": stories,
3331
- }
3112
+ request_body = {"stories": stories}
3332
3113
  request_body = {k: v for k, v in request_body.items() if v is not None}
3333
3114
  url = f"{self.base_url}/api/v3/stories/bulk"
3334
3115
  query_params = {}
@@ -3336,7 +3117,7 @@ class ShortcutApp(APIApplication):
3336
3117
  response.raise_for_status()
3337
3118
  return response.json()
3338
3119
 
3339
- def create_story_from_template(
3120
+ async def create_story_from_template(
3340
3121
  self,
3341
3122
  story_template_id,
3342
3123
  description=None,
@@ -3499,7 +3280,7 @@ class ShortcutApp(APIApplication):
3499
3280
  response.raise_for_status()
3500
3281
  return response.json()
3501
3282
 
3502
- def search_stories_old(
3283
+ async def search_stories_old(
3503
3284
  self,
3504
3285
  archived=None,
3505
3286
  owner_id=None,
@@ -3609,7 +3390,7 @@ class ShortcutApp(APIApplication):
3609
3390
  response.raise_for_status()
3610
3391
  return response.json()
3611
3392
 
3612
- def get_story(self, story_public_id) -> dict[str, Any]:
3393
+ async def get_story(self, story_public_id) -> dict[str, Any]:
3613
3394
  """
3614
3395
  Retrieves a story from the API based on its public ID
3615
3396
 
@@ -3633,7 +3414,7 @@ class ShortcutApp(APIApplication):
3633
3414
  response.raise_for_status()
3634
3415
  return response.json()
3635
3416
 
3636
- def update_story(
3417
+ async def update_story(
3637
3418
  self,
3638
3419
  story_public_id,
3639
3420
  description=None,
@@ -3745,7 +3526,7 @@ class ShortcutApp(APIApplication):
3745
3526
  response.raise_for_status()
3746
3527
  return response.json()
3747
3528
 
3748
- def delete_story(self, story_public_id) -> Any:
3529
+ async def delete_story(self, story_public_id) -> Any:
3749
3530
  """
3750
3531
  Deletes a story using its public ID.
3751
3532
 
@@ -3770,7 +3551,7 @@ class ShortcutApp(APIApplication):
3770
3551
  response.raise_for_status()
3771
3552
  return response.json()
3772
3553
 
3773
- def list_story_comment(self, story_public_id) -> list[Any]:
3554
+ async def list_story_comment(self, story_public_id) -> list[Any]:
3774
3555
  """
3775
3556
  Retrieves a list of comments for a specific story.
3776
3557
 
@@ -3795,15 +3576,8 @@ class ShortcutApp(APIApplication):
3795
3576
  response.raise_for_status()
3796
3577
  return response.json()
3797
3578
 
3798
- def create_story_comment(
3799
- self,
3800
- story_public_id,
3801
- text,
3802
- author_id=None,
3803
- created_at=None,
3804
- updated_at=None,
3805
- external_id=None,
3806
- parent_id=None,
3579
+ async def create_story_comment(
3580
+ self, story_public_id, text, author_id=None, created_at=None, updated_at=None, external_id=None, parent_id=None
3807
3581
  ) -> dict[str, Any]:
3808
3582
  """
3809
3583
  Creates a new comment on a story by sending a POST request with the comment details to the specified API endpoint.
@@ -3845,7 +3619,7 @@ class ShortcutApp(APIApplication):
3845
3619
  response.raise_for_status()
3846
3620
  return response.json()
3847
3621
 
3848
- def get_story_comment(self, story_public_id, comment_public_id) -> dict[str, Any]:
3622
+ async def get_story_comment(self, story_public_id, comment_public_id) -> dict[str, Any]:
3849
3623
  """
3850
3624
  Retrieves a specific comment from a story using the API.
3851
3625
 
@@ -3873,9 +3647,7 @@ class ShortcutApp(APIApplication):
3873
3647
  response.raise_for_status()
3874
3648
  return response.json()
3875
3649
 
3876
- def update_story_comment(
3877
- self, story_public_id, comment_public_id, text
3878
- ) -> dict[str, Any]:
3650
+ async def update_story_comment(self, story_public_id, comment_public_id, text) -> dict[str, Any]:
3879
3651
  """
3880
3652
  Updates a story comment with new text based on the provided story and comment public IDs.
3881
3653
 
@@ -3899,9 +3671,7 @@ class ShortcutApp(APIApplication):
3899
3671
  raise ValueError("Missing required parameter 'comment-public-id'")
3900
3672
  if text is None:
3901
3673
  raise ValueError("Missing required parameter 'text'")
3902
- request_body = {
3903
- "text": text,
3904
- }
3674
+ request_body = {"text": text}
3905
3675
  request_body = {k: v for k, v in request_body.items() if v is not None}
3906
3676
  url = f"{self.base_url}/api/v3/stories/{story_public_id}/comments/{comment_public_id}"
3907
3677
  query_params = {}
@@ -3909,7 +3679,7 @@ class ShortcutApp(APIApplication):
3909
3679
  response.raise_for_status()
3910
3680
  return response.json()
3911
3681
 
3912
- def delete_story_comment(self, story_public_id, comment_public_id) -> Any:
3682
+ async def delete_story_comment(self, story_public_id, comment_public_id) -> Any:
3913
3683
  """
3914
3684
  Deletes a specific comment from a story using the provided story and comment public IDs.
3915
3685
 
@@ -3937,9 +3707,7 @@ class ShortcutApp(APIApplication):
3937
3707
  response.raise_for_status()
3938
3708
  return response.json()
3939
3709
 
3940
- def create_story_reaction(
3941
- self, story_public_id, comment_public_id, emoji
3942
- ) -> list[Any]:
3710
+ async def create_story_reaction(self, story_public_id, comment_public_id, emoji) -> list[Any]:
3943
3711
  """
3944
3712
  Creates a reaction with an emoji to a comment on a story.
3945
3713
 
@@ -3963,9 +3731,7 @@ class ShortcutApp(APIApplication):
3963
3731
  raise ValueError("Missing required parameter 'comment-public-id'")
3964
3732
  if emoji is None:
3965
3733
  raise ValueError("Missing required parameter 'emoji'")
3966
- request_body = {
3967
- "emoji": emoji,
3968
- }
3734
+ request_body = {"emoji": emoji}
3969
3735
  request_body = {k: v for k, v in request_body.items() if v is not None}
3970
3736
  url = f"{self.base_url}/api/v3/stories/{story_public_id}/comments/{comment_public_id}/reactions"
3971
3737
  query_params = {}
@@ -3973,9 +3739,7 @@ class ShortcutApp(APIApplication):
3973
3739
  response.raise_for_status()
3974
3740
  return response.json()
3975
3741
 
3976
- def unlink_comment_thread_from_slack(
3977
- self, story_public_id, comment_public_id
3978
- ) -> dict[str, Any]:
3742
+ async def unlink_comment_thread_from_slack(self, story_public_id, comment_public_id) -> dict[str, Any]:
3979
3743
  """
3980
3744
  Unlinks a comment thread from Slack for a specific story.
3981
3745
 
@@ -4003,7 +3767,7 @@ class ShortcutApp(APIApplication):
4003
3767
  response.raise_for_status()
4004
3768
  return response.json()
4005
3769
 
4006
- def story_history(self, story_public_id) -> list[Any]:
3770
+ async def story_history(self, story_public_id) -> list[Any]:
4007
3771
  """
4008
3772
  Retrieves the full change history for a specified story by its public ID.
4009
3773
 
@@ -4028,15 +3792,8 @@ class ShortcutApp(APIApplication):
4028
3792
  response.raise_for_status()
4029
3793
  return response.json()
4030
3794
 
4031
- def create_task(
4032
- self,
4033
- story_public_id,
4034
- description,
4035
- complete=None,
4036
- owner_ids=None,
4037
- external_id=None,
4038
- created_at=None,
4039
- updated_at=None,
3795
+ async def create_task(
3796
+ self, story_public_id, description, complete=None, owner_ids=None, external_id=None, created_at=None, updated_at=None
4040
3797
  ) -> dict[str, Any]:
4041
3798
  """
4042
3799
  Creates a task within a specified story.
@@ -4079,7 +3836,7 @@ class ShortcutApp(APIApplication):
4079
3836
  response.raise_for_status()
4080
3837
  return response.json()
4081
3838
 
4082
- def get_task(self, story_public_id, task_public_id) -> dict[str, Any]:
3839
+ async def get_task(self, story_public_id, task_public_id) -> dict[str, Any]:
4083
3840
  """
4084
3841
  Gets task details for a specific task within a story.
4085
3842
 
@@ -4107,15 +3864,8 @@ class ShortcutApp(APIApplication):
4107
3864
  response.raise_for_status()
4108
3865
  return response.json()
4109
3866
 
4110
- def update_task(
4111
- self,
4112
- story_public_id,
4113
- task_public_id,
4114
- description=None,
4115
- owner_ids=None,
4116
- complete=None,
4117
- before_id=None,
4118
- after_id=None,
3867
+ async def update_task(
3868
+ self, story_public_id, task_public_id, description=None, owner_ids=None, complete=None, before_id=None, after_id=None
4119
3869
  ) -> dict[str, Any]:
4120
3870
  """
4121
3871
  Updates the specified task within a story, modifying fields such as description, owners, completion status, and position.
@@ -4157,7 +3907,7 @@ class ShortcutApp(APIApplication):
4157
3907
  response.raise_for_status()
4158
3908
  return response.json()
4159
3909
 
4160
- def delete_task(self, story_public_id, task_public_id) -> Any:
3910
+ async def delete_task(self, story_public_id, task_public_id) -> Any:
4161
3911
  """
4162
3912
  Deletes a task associated with a story based on their respective public IDs.
4163
3913
 
@@ -4184,7 +3934,7 @@ class ShortcutApp(APIApplication):
4184
3934
  response.raise_for_status()
4185
3935
  return response.json()
4186
3936
 
4187
- def create_story_link(self, verb, subject_id, object_id) -> dict[str, Any]:
3937
+ async def create_story_link(self, verb, subject_id, object_id) -> dict[str, Any]:
4188
3938
  """
4189
3939
  Creates a story link between a subject and an object with the specified verb by sending a POST request to the story-links API endpoint.
4190
3940
 
@@ -4209,11 +3959,7 @@ class ShortcutApp(APIApplication):
4209
3959
  raise ValueError("Missing required parameter 'subject_id'")
4210
3960
  if object_id is None:
4211
3961
  raise ValueError("Missing required parameter 'object_id'")
4212
- request_body = {
4213
- "verb": verb,
4214
- "subject_id": subject_id,
4215
- "object_id": object_id,
4216
- }
3962
+ request_body = {"verb": verb, "subject_id": subject_id, "object_id": object_id}
4217
3963
  request_body = {k: v for k, v in request_body.items() if v is not None}
4218
3964
  url = f"{self.base_url}/api/v3/story-links"
4219
3965
  query_params = {}
@@ -4221,7 +3967,7 @@ class ShortcutApp(APIApplication):
4221
3967
  response.raise_for_status()
4222
3968
  return response.json()
4223
3969
 
4224
- def get_story_link(self, story_link_public_id) -> dict[str, Any]:
3970
+ async def get_story_link(self, story_link_public_id) -> dict[str, Any]:
4225
3971
  """
4226
3972
  Retrieves a specific story link by its public ID.
4227
3973
 
@@ -4246,9 +3992,7 @@ class ShortcutApp(APIApplication):
4246
3992
  response.raise_for_status()
4247
3993
  return response.json()
4248
3994
 
4249
- def update_story_link(
4250
- self, story_link_public_id, verb=None, subject_id=None, object_id=None
4251
- ) -> dict[str, Any]:
3995
+ async def update_story_link(self, story_link_public_id, verb=None, subject_id=None, object_id=None) -> dict[str, Any]:
4252
3996
  """
4253
3997
  Updates an existing story link with new attributes.
4254
3998
 
@@ -4270,11 +4014,7 @@ class ShortcutApp(APIApplication):
4270
4014
  """
4271
4015
  if story_link_public_id is None:
4272
4016
  raise ValueError("Missing required parameter 'story-link-public-id'")
4273
- request_body = {
4274
- "verb": verb,
4275
- "subject_id": subject_id,
4276
- "object_id": object_id,
4277
- }
4017
+ request_body = {"verb": verb, "subject_id": subject_id, "object_id": object_id}
4278
4018
  request_body = {k: v for k, v in request_body.items() if v is not None}
4279
4019
  url = f"{self.base_url}/api/v3/story-links/{story_link_public_id}"
4280
4020
  query_params = {}
@@ -4282,7 +4022,7 @@ class ShortcutApp(APIApplication):
4282
4022
  response.raise_for_status()
4283
4023
  return response.json()
4284
4024
 
4285
- def delete_story_link(self, story_link_public_id) -> Any:
4025
+ async def delete_story_link(self, story_link_public_id) -> Any:
4286
4026
  """
4287
4027
  Deletes a story link by its public ID.
4288
4028
 
@@ -4307,9 +4047,7 @@ class ShortcutApp(APIApplication):
4307
4047
  response.raise_for_status()
4308
4048
  return response.json()
4309
4049
 
4310
- def list_workflows(
4311
- self,
4312
- ) -> list[Any]:
4050
+ async def list_workflows(self) -> list[Any]:
4313
4051
  """
4314
4052
  Retrieves a list of available workflows from the API.
4315
4053
 
@@ -4331,7 +4069,7 @@ class ShortcutApp(APIApplication):
4331
4069
  response.raise_for_status()
4332
4070
  return response.json()
4333
4071
 
4334
- def get_workflow(self, workflow_public_id) -> dict[str, Any]:
4072
+ async def get_workflow(self, workflow_public_id) -> dict[str, Any]:
4335
4073
  """
4336
4074
  Retrieves detailed information about a workflow given its public ID.
4337
4075