universal-mcp-applications 0.1.30__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 (105) 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 +9 -2
  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 +216 -102
  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.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -105
  104. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  105. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/licenses/LICENSE +0 -0
@@ -1,10 +1,7 @@
1
1
  from collections.abc import Callable
2
2
  from typing import Any
3
-
4
3
  from gql import gql
5
- from universal_mcp.applications.application import (
6
- GraphQLApplication,
7
- )
4
+ from universal_mcp.applications.application import GraphQLApplication
8
5
  from universal_mcp.integrations import Integration
9
6
 
10
7
 
@@ -14,14 +11,10 @@ class FirefliesApp(GraphQLApplication):
14
11
  """
15
12
 
16
13
  def __init__(self, integration: Integration | None = None, **kwargs: Any) -> None:
17
- super().__init__(
18
- name="fireflies", base_url="https://api.fireflies.ai/graphql", **kwargs
19
- )
14
+ super().__init__(name="fireflies", base_url="https://api.fireflies.ai/graphql", **kwargs)
20
15
  self.integration = integration
21
16
 
22
- def get_team_conversation_analytics(
23
- self, start_time: str | None = None, end_time: str | None = None
24
- ) -> dict[str, Any]:
17
+ async def get_team_conversation_analytics(self, start_time: str | None = None, end_time: str | None = None) -> dict[str, Any]:
25
18
  """
26
19
  Queries the Fireflies.ai API for team conversation analytics, specifically the average number of filler words. The data retrieval can optionally be filtered by a start and end time. Returns a dictionary containing the fetched analytics.
27
20
 
@@ -39,27 +32,18 @@ class FirefliesApp(GraphQLApplication):
39
32
  Tags:
40
33
  analytics, team, fireflies, query
41
34
  """
42
- query_gql = gql("""
43
- query Analytics($startTime: String, $endTime: String) {
44
- analytics(start_time: $startTime, end_time: $endTime) {
45
- team {
46
- conversation {
47
- average_filler_words
48
- }
49
- }
50
- }
51
- }
52
- """)
35
+ query_gql = gql(
36
+ "\n query Analytics($startTime: String, $endTime: String) {\n analytics(start_time: $startTime, end_time: $endTime) {\n team {\n conversation {\n average_filler_words\n }\n }\n }\n }\n "
37
+ )
53
38
  variables: dict[str, Any] = {}
54
39
  if start_time:
55
40
  variables["startTime"] = start_time
56
41
  if end_time:
57
42
  variables["endTime"] = end_time
58
-
59
43
  result = self.query(query_gql, variables=variables if variables else None)
60
44
  return result.get("analytics", {})
61
45
 
62
- def get_transcript_ai_outputs(self, transcript_id: str) -> list[dict[str, Any]]:
46
+ async def get_transcript_ai_outputs(self, transcript_id: str) -> list[dict[str, Any]]:
63
47
  """
64
48
  Retrieves all AI-generated application outputs, such as summaries or analyses, associated with a specific transcript ID. It fetches the detailed prompt and response data for each AI app that has processed the transcript, providing a complete record of AI-generated content.
65
49
 
@@ -76,26 +60,14 @@ class FirefliesApp(GraphQLApplication):
76
60
  Tags:
77
61
  ai, apps, transcript, fireflies, query
78
62
  """
79
- query_gql = gql("""
80
- query GetAIAppsOutputs($transcriptId: String!) {
81
- apps(transcript_id: $transcriptId) {
82
- outputs {
83
- transcript_id
84
- user_id
85
- app_id
86
- created_at
87
- title
88
- prompt
89
- response
90
- }
91
- }
92
- }
93
- """)
63
+ query_gql = gql(
64
+ "\n query GetAIAppsOutputs($transcriptId: String!) {\n apps(transcript_id: $transcriptId) {\n outputs {\n transcript_id\n user_id\n app_id\n created_at\n title\n prompt\n response\n }\n }\n }\n "
65
+ )
94
66
  variables = {"transcriptId": transcript_id}
95
67
  result = self.query(query_gql, variables=variables)
96
68
  return result.get("apps", {})
97
69
 
98
- def get_user_details(self, user_id: str) -> dict[str, Any]:
70
+ async def get_user_details(self, user_id: str) -> dict[str, Any]:
99
71
  """
100
72
  Fetches details, such as name and integrations, for a single user identified by their unique ID. This function queries for a specific user, differentiating it from `list_users` which retrieves a list of all users in the workspace.
101
73
 
@@ -112,19 +84,14 @@ class FirefliesApp(GraphQLApplication):
112
84
  Tags:
113
85
  user, details, fireflies, query, important
114
86
  """
115
- query_gql = gql("""
116
- query User($userId: String!) {
117
- user(id: $userId) {
118
- name
119
- integrations
120
- }
121
- }
122
- """)
87
+ query_gql = gql(
88
+ "\n query User($userId: String!) {\n user(id: $userId) {\n name\n integrations\n }\n }\n "
89
+ )
123
90
  variables = {"userId": user_id}
124
91
  result = self.query(query_gql, variables=variables)
125
92
  return result.get("user", {})
126
93
 
127
- def list_users(self) -> list[dict[str, Any]]:
94
+ async def list_users(self) -> list[dict[str, Any]]:
128
95
  """
129
96
  Retrieves a list of all users in the workspace, returning each user's name and configured integrations. It provides a complete team roster, differing from `get_user_details`, which fetches information for a single user by their ID.
130
97
 
@@ -138,23 +105,11 @@ class FirefliesApp(GraphQLApplication):
138
105
  Tags:
139
106
  user, list, users, fireflies, query
140
107
  """
141
- query_str = """
142
- query ListAllUsers {
143
- users {
144
- name
145
- integrations
146
- # You might want to add other available user fields here if needed, e.g.:
147
- # id
148
- # email
149
- # role
150
- # is_admin
151
- }
152
- }
153
- """
108
+ query_str = "\n query ListAllUsers {\n users {\n name\n integrations\n # You might want to add other available user fields here if needed, e.g.:\n # id\n # email\n # role\n # is_admin\n }\n }\n "
154
109
  result = self.query(query_str)
155
110
  return result.get("users", [])
156
111
 
157
- def get_transcript_details(self, transcript_id: str) -> dict[str, Any]:
112
+ async def get_transcript_details(self, transcript_id: str) -> dict[str, Any]:
158
113
  """
159
114
  Queries the Fireflies API for a single transcript's details, such as title and ID, using its unique identifier. It fetches one specific entry, distinguishing it from `list_transcripts`, which retrieves a collection, and from `get_ai_apps_outputs` which gets AI data from a transcript.
160
115
 
@@ -171,127 +126,14 @@ class FirefliesApp(GraphQLApplication):
171
126
  Tags:
172
127
  transcript, details, fireflies, query, important
173
128
  """
174
- query_gql = gql("""
175
- query Transcript($transcriptId: String!) {
176
- transcript(id: $transcriptId) {
177
- id
178
- title
179
- host_email
180
- organizer_email
181
- user {
182
- user_id
183
- email
184
- name
185
- num_transcripts
186
- recent_meeting
187
- minutes_consumed
188
- is_admin
189
- integrations
190
- }
191
- speakers {
192
- id
193
- name
194
- }
195
- transcript_url
196
- participants
197
- meeting_attendees {
198
- displayName
199
- email
200
- phoneNumber
201
- name
202
- location
203
- }
204
- fireflies_users
205
- duration
206
- dateString
207
- date
208
- audio_url
209
- video_url
210
- sentences {
211
- index
212
- speaker_name
213
- speaker_id
214
- text
215
- raw_text
216
- start_time
217
- end_time
218
- ai_filters {
219
- task
220
- pricing
221
- metric
222
- question
223
- date_and_time
224
- text_cleanup
225
- sentiment
226
- }
227
- }
228
- calendar_id
229
- summary {
230
- action_items
231
- keywords
232
- outline
233
- overview
234
- shorthand_bullet
235
- gist
236
- bullet_gist
237
- short_summary
238
- short_overview
239
- meeting_type
240
- topics_discussed
241
- transcript_chapters
242
- }
243
- meeting_info {
244
- fred_joined
245
- silent_meeting
246
- summary_status
247
- }
248
- cal_id
249
- calendar_type
250
- apps_preview {
251
- outputs {
252
- transcript_id
253
- user_id
254
- app_id
255
- created_at
256
- title
257
- prompt
258
- response
259
- }
260
- }
261
- meeting_link
262
- analytics {
263
- sentiments {
264
- negative_pct
265
- neutral_pct
266
- positive_pct
267
- }
268
- categories {
269
- questions
270
- date_times
271
- metrics
272
- tasks
273
- }
274
- speakers {
275
- speaker_id
276
- name
277
- duration
278
- word_count
279
- longest_monologue
280
- monologues_count
281
- filler_words
282
- questions
283
- duration_pct
284
- words_per_minute
285
- }
286
- }
287
- }
288
- }
289
- """)
129
+ query_gql = gql(
130
+ "\n query Transcript($transcriptId: String!) {\n transcript(id: $transcriptId) {\n id\n title\n host_email\n organizer_email\n user {\n user_id\n email\n name\n num_transcripts\n recent_meeting\n minutes_consumed\n is_admin\n integrations\n }\n speakers {\n id\n name\n }\n transcript_url\n participants\n meeting_attendees {\n displayName\n email\n phoneNumber\n name\n location\n }\n fireflies_users\n duration\n dateString\n date\n audio_url\n video_url\n sentences {\n index\n speaker_name\n speaker_id\n text\n raw_text\n start_time\n end_time\n ai_filters {\n task\n pricing\n metric\n question\n date_and_time\n text_cleanup\n sentiment\n }\n }\n calendar_id\n summary {\n action_items\n keywords\n outline\n overview\n shorthand_bullet\n gist\n bullet_gist\n short_summary\n short_overview\n meeting_type\n topics_discussed\n transcript_chapters\n }\n meeting_info {\n fred_joined\n silent_meeting\n summary_status\n }\n cal_id\n calendar_type\n apps_preview {\n outputs {\n transcript_id\n user_id\n app_id\n created_at\n title\n prompt\n response\n }\n }\n meeting_link\n analytics {\n sentiments {\n negative_pct\n neutral_pct\n positive_pct\n }\n categories {\n questions\n date_times\n metrics\n tasks\n }\n speakers {\n speaker_id\n name\n duration\n word_count\n longest_monologue\n monologues_count\n filler_words\n questions\n duration_pct\n words_per_minute\n }\n }\n }\n }\n "
131
+ )
290
132
  variables = {"transcriptId": transcript_id}
291
133
  result = self.query(query_gql, variables=variables)
292
134
  return result.get("transcript", {})
293
135
 
294
- def list_transcripts(self, user_id: str | None = None) -> list[dict[str, Any]]:
136
+ async def list_transcripts(self, user_id: str | None = None) -> list[dict[str, Any]]:
295
137
  """
296
138
  Fetches a list of meeting transcripts, returning the title and ID for each. The list can be filtered to return only transcripts for a specific user. This function complements `get_transcript_details`, which retrieves a single transcript by its unique ID.
297
139
 
@@ -308,21 +150,16 @@ class FirefliesApp(GraphQLApplication):
308
150
  Tags:
309
151
  transcript, list, fireflies, query
310
152
  """
311
- query_gql = gql("""
312
- query Transcripts($userId: String) {
313
- transcripts(user_id: $userId) {
314
- title
315
- id
316
- }
317
- }
318
- """)
153
+ query_gql = gql(
154
+ "\n query Transcripts($userId: String) {\n transcripts(user_id: $userId) {\n title\n id\n }\n }\n "
155
+ )
319
156
  variables: dict[str, Any] = {}
320
157
  if user_id:
321
158
  variables["userId"] = user_id
322
159
  result = self.query(query_gql, variables=variables if variables else None)
323
160
  return result.get("transcripts", [])
324
161
 
325
- def get_bite_details(self, bite_id: str) -> dict[str, Any]:
162
+ async def get_bite_details(self, bite_id: str) -> dict[str, Any]:
326
163
  """
327
164
  Retrieves detailed information for a specific bite (soundbite/clip) using its unique ID. It fetches data including the user ID, name, processing status, and summary. This provides a focused view of a single bite, distinguishing it from `list_bites` which fetches a collection of bites.
328
165
 
@@ -339,21 +176,14 @@ class FirefliesApp(GraphQLApplication):
339
176
  Tags:
340
177
  bite, details, fireflies, query
341
178
  """
342
- query_gql = gql("""
343
- query Bite($biteId: ID!) {
344
- bite(id: $biteId) {
345
- user_id
346
- name
347
- status
348
- summary
349
- }
350
- }
351
- """)
179
+ query_gql = gql(
180
+ "\n query Bite($biteId: ID!) {\n bite(id: $biteId) {\n user_id\n name\n status\n summary\n }\n }\n "
181
+ )
352
182
  variables = {"biteId": bite_id}
353
183
  result = self.query(query_gql, variables=variables)
354
184
  return result.get("bite", {})
355
185
 
356
- def list_bites(self, mine: bool | None = None) -> list[dict[str, Any]]:
186
+ async def list_bites(self, mine: bool | None = None) -> list[dict[str, Any]]:
357
187
  """
358
188
  Retrieves a list of soundbites (clips) from the Fireflies API. An optional 'mine' parameter filters for soundbites belonging only to the authenticated user. Differentiates from 'get_bite_details' by fetching multiple items rather than a single one by ID.
359
189
 
@@ -370,24 +200,16 @@ class FirefliesApp(GraphQLApplication):
370
200
  Tags:
371
201
  bite, list, fireflies, query
372
202
  """
373
- query_gql = gql("""
374
- query Bites($mine: Boolean) {
375
- bites(mine: $mine) {
376
- user_id
377
- name
378
- end_time
379
- }
380
- }
381
- """)
203
+ query_gql = gql(
204
+ "\n query Bites($mine: Boolean) {\n bites(mine: $mine) {\n user_id\n name\n end_time\n }\n }\n "
205
+ )
382
206
  variables: dict[str, Any] = {}
383
- if (
384
- mine is not None
385
- ): # API might default this, ensure we only send if explicitly set
207
+ if mine is not None:
386
208
  variables["mine"] = mine
387
209
  result = self.query(query_gql, variables=variables if variables else None)
388
210
  return result.get("bites", [])
389
211
 
390
- def add_to_live_meeting(self, meeting_link: str) -> dict[str, Any]:
212
+ async def add_to_live_meeting(self, meeting_link: str) -> dict[str, Any]:
391
213
  """
392
214
  Executes a GraphQL mutation to make the Fireflies.ai notetaker join a live meeting specified by its URL. This action initiates the bot's recording and transcription process for the ongoing session and returns a success confirmation.
393
215
 
@@ -404,20 +226,14 @@ class FirefliesApp(GraphQLApplication):
404
226
  Tags:
405
227
  meeting, live, fireflies, mutation, important
406
228
  """
407
- mutation_gql = gql("""
408
- mutation AddToLiveMeeting($meetingLink: String!) {
409
- addToLiveMeeting(meeting_link: $meetingLink) {
410
- success
411
- }
412
- }
413
- """)
229
+ mutation_gql = gql(
230
+ "\n mutation AddToLiveMeeting($meetingLink: String!) {\n addToLiveMeeting(meeting_link: $meetingLink) {\n success\n }\n }\n "
231
+ )
414
232
  variables = {"meetingLink": meeting_link}
415
233
  result = self.mutate(mutation_gql, variables=variables)
416
234
  return result.get("addToLiveMeeting", {})
417
235
 
418
- def create_soundbite_from_transcript(
419
- self, transcript_id: str, start_time: float, end_time: float
420
- ) -> dict[str, Any]:
236
+ async def create_soundbite_from_transcript(self, transcript_id: str, start_time: float, end_time: float) -> dict[str, Any]:
421
237
  """
422
238
  Creates a soundbite/clip from a specified segment of a transcript using its ID, start, and end times. This function executes a GraphQL mutation, returning details of the newly created bite, such as its ID and processing status.
423
239
 
@@ -436,24 +252,14 @@ class FirefliesApp(GraphQLApplication):
436
252
  Tags:
437
253
  bite, create, transcript, fireflies, mutation
438
254
  """
439
- mutation_gql = gql("""
440
- mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) {
441
- createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) {
442
- summary
443
- status
444
- id
445
- }
446
- }
447
- """)
448
- variables = {
449
- "transcriptId": transcript_id,
450
- "startTime": start_time,
451
- "endTime": end_time,
452
- }
255
+ mutation_gql = gql(
256
+ "\n mutation CreateBite($transcriptId: ID!, $startTime: Float!, $endTime: Float!) {\n createBite(transcript_id: $transcriptId, start_time: $startTime, end_time: $endTime) {\n summary\n status\n id\n }\n }\n "
257
+ )
258
+ variables = {"transcriptId": transcript_id, "startTime": start_time, "endTime": end_time}
453
259
  result = self.mutate(mutation_gql, variables=variables)
454
260
  return result.get("createBite", {})
455
261
 
456
- def delete_transcript(self, transcript_id: str) -> dict[str, Any]:
262
+ async def delete_transcript(self, transcript_id: str) -> dict[str, Any]:
457
263
  """
458
264
  Permanently deletes a specific transcript from Fireflies.ai using its ID. This destructive operation executes a GraphQL mutation and returns a dictionary containing the details of the transcript (e.g., title, date) as it existed just before being removed, confirming the action.
459
265
 
@@ -470,21 +276,14 @@ class FirefliesApp(GraphQLApplication):
470
276
  Tags:
471
277
  transcript, delete, fireflies, mutation, destructive
472
278
  """
473
- mutation_gql = gql("""
474
- mutation DeleteTranscript($transcriptId: String!) {
475
- deleteTranscript(id: $transcriptId) {
476
- title
477
- date
478
- duration
479
- organizer_email
480
- }
481
- }
482
- """)
279
+ mutation_gql = gql(
280
+ "\n mutation DeleteTranscript($transcriptId: String!) {\n deleteTranscript(id: $transcriptId) {\n title\n date\n duration\n organizer_email\n }\n }\n "
281
+ )
483
282
  variables = {"transcriptId": transcript_id}
484
283
  result = self.mutate(mutation_gql, variables=variables)
485
284
  return result.get("deleteTranscript", {})
486
285
 
487
- def set_user_role(self, user_id: str, role: str) -> dict[str, Any]:
286
+ async def set_user_role(self, user_id: str, role: str) -> dict[str, Any]:
488
287
  """
489
288
  Assigns a new role (e.g., 'admin', 'member') to a user specified by their ID. This function executes a GraphQL mutation to modify user data and returns a dictionary with the user's updated name and admin status to confirm the change.
490
289
 
@@ -502,23 +301,15 @@ class FirefliesApp(GraphQLApplication):
502
301
  Tags:
503
302
  user, role, admin, fireflies, mutation
504
303
  """
505
- mutation_gql = gql("""
506
- mutation SetUserRole($user_id: String!, $role: Role!) {
507
- setUserRole(user_id: $user_id, role: $role) {
508
- name
509
- is_admin
510
- }
511
- }
512
- """)
304
+ mutation_gql = gql(
305
+ "\n mutation SetUserRole($user_id: String!, $role: Role!) {\n setUserRole(user_id: $user_id, role: $role) {\n name\n is_admin\n }\n }\n "
306
+ )
513
307
  variables = {"user_id": user_id, "role": role}
514
308
  result = self.mutate(mutation_gql, variables=variables)
515
309
  return result.get("setUserRole", {})
516
310
 
517
- def transcribe_audio_from_url(
518
- self,
519
- url: str,
520
- title: str | None = None,
521
- attendees: list[dict[str, str]] | None = None,
311
+ async def transcribe_audio_from_url(
312
+ self, url: str, title: str | None = None, attendees: list[dict[str, str]] | None = None
522
313
  ) -> dict[str, Any]:
523
314
  """
524
315
  Submits an audio file from a URL to the Fireflies.ai API for transcription. It can optionally associate a title and a list of attendees with the audio, returning the upload status and details upon completion.
@@ -539,28 +330,19 @@ class FirefliesApp(GraphQLApplication):
539
330
  Tags:
540
331
  audio, upload, transcript, fireflies, mutation
541
332
  """
542
- mutation_gql = gql("""
543
- mutation UploadAudio($input: AudioUploadInput!) {
544
- uploadAudio(input: $input) {
545
- success
546
- title
547
- message
548
- }
549
- }
550
- """)
333
+ mutation_gql = gql(
334
+ "\n mutation UploadAudio($input: AudioUploadInput!) {\n uploadAudio(input: $input) {\n success\n title\n message\n }\n }\n "
335
+ )
551
336
  input_data: dict[str, Any] = {"url": url}
552
337
  if title:
553
338
  input_data["title"] = title
554
339
  if attendees:
555
340
  input_data["attendees"] = attendees
556
-
557
341
  variables = {"input": input_data}
558
342
  result = self.mutate(mutation_gql, variables=variables)
559
343
  return result.get("uploadAudio", {})
560
344
 
561
- def update_transcript_title(
562
- self, transcript_id: str, new_title: str
563
- ) -> dict[str, Any]:
345
+ async def update_transcript_title(self, transcript_id: str, new_title: str) -> dict[str, Any]:
564
346
  """
565
347
  Updates the title of a specific transcript, identified by its ID, to a new value. This function executes a GraphQL mutation and returns a dictionary containing the newly assigned title upon successful completion of the request.
566
348
 
@@ -578,13 +360,9 @@ class FirefliesApp(GraphQLApplication):
578
360
  Tags:
579
361
  transcript, meeting, title, update, fireflies, mutation
580
362
  """
581
- mutation_gql = gql("""
582
- mutation UpdateMeetingTitle($input: UpdateMeetingTitleInput!) {
583
- updateMeetingTitle(input: $input) {
584
- title
585
- }
586
- }
587
- """)
363
+ mutation_gql = gql(
364
+ "\n mutation UpdateMeetingTitle($input: UpdateMeetingTitleInput!) {\n updateMeetingTitle(input: $input) {\n title\n }\n }\n "
365
+ )
588
366
  variables = {"input": {"id": transcript_id, "title": new_title}}
589
367
  result = self.mutate(mutation_gql, variables=variables)
590
368
  return result.get("updateMeetingTitle", {})