universal-mcp-applications 0.1.33__py3-none-any.whl → 0.1.39rc16__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 (119) hide show
  1. universal_mcp/applications/BEST_PRACTICES.md +1 -1
  2. universal_mcp/applications/ahrefs/app.py +92 -238
  3. universal_mcp/applications/airtable/app.py +36 -135
  4. universal_mcp/applications/apollo/app.py +124 -477
  5. universal_mcp/applications/asana/app.py +605 -1755
  6. universal_mcp/applications/aws_s3/app.py +63 -119
  7. universal_mcp/applications/bill/app.py +644 -2055
  8. universal_mcp/applications/box/app.py +1246 -4159
  9. universal_mcp/applications/braze/app.py +410 -1476
  10. universal_mcp/applications/browser_use/README.md +15 -1
  11. universal_mcp/applications/browser_use/__init__.py +1 -0
  12. universal_mcp/applications/browser_use/app.py +91 -26
  13. universal_mcp/applications/cal_com_v2/app.py +207 -625
  14. universal_mcp/applications/calendly/app.py +103 -242
  15. universal_mcp/applications/canva/app.py +75 -140
  16. universal_mcp/applications/clickup/app.py +331 -798
  17. universal_mcp/applications/coda/app.py +240 -520
  18. universal_mcp/applications/confluence/app.py +497 -1285
  19. universal_mcp/applications/contentful/app.py +40 -155
  20. universal_mcp/applications/crustdata/app.py +44 -123
  21. universal_mcp/applications/dialpad/app.py +451 -924
  22. universal_mcp/applications/digitalocean/app.py +2071 -6082
  23. universal_mcp/applications/domain_checker/app.py +3 -54
  24. universal_mcp/applications/e2b/app.py +17 -68
  25. universal_mcp/applications/elevenlabs/README.md +27 -3
  26. universal_mcp/applications/elevenlabs/app.py +741 -74
  27. universal_mcp/applications/exa/README.md +8 -4
  28. universal_mcp/applications/exa/app.py +415 -186
  29. universal_mcp/applications/falai/README.md +5 -7
  30. universal_mcp/applications/falai/app.py +156 -232
  31. universal_mcp/applications/figma/app.py +91 -175
  32. universal_mcp/applications/file_system/app.py +2 -13
  33. universal_mcp/applications/firecrawl/app.py +198 -176
  34. universal_mcp/applications/fireflies/app.py +59 -281
  35. universal_mcp/applications/fpl/app.py +92 -529
  36. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  37. universal_mcp/applications/fpl/utils/helper.py +25 -89
  38. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  39. universal_mcp/applications/ghost_content/app.py +70 -179
  40. universal_mcp/applications/github/app.py +30 -67
  41. universal_mcp/applications/gong/app.py +142 -302
  42. universal_mcp/applications/google_calendar/app.py +26 -78
  43. universal_mcp/applications/google_docs/README.md +15 -14
  44. universal_mcp/applications/google_docs/app.py +103 -206
  45. universal_mcp/applications/google_drive/app.py +194 -793
  46. universal_mcp/applications/google_gemini/app.py +68 -59
  47. universal_mcp/applications/google_mail/README.md +1 -0
  48. universal_mcp/applications/google_mail/app.py +93 -214
  49. universal_mcp/applications/google_searchconsole/app.py +25 -58
  50. universal_mcp/applications/google_sheet/README.md +2 -1
  51. universal_mcp/applications/google_sheet/app.py +226 -624
  52. universal_mcp/applications/google_sheet/helper.py +26 -53
  53. universal_mcp/applications/hashnode/app.py +57 -269
  54. universal_mcp/applications/heygen/README.md +10 -32
  55. universal_mcp/applications/heygen/app.py +339 -811
  56. universal_mcp/applications/http_tools/app.py +10 -32
  57. universal_mcp/applications/hubspot/README.md +1 -1
  58. universal_mcp/applications/hubspot/app.py +7508 -99
  59. universal_mcp/applications/jira/app.py +2419 -8334
  60. universal_mcp/applications/klaviyo/app.py +739 -1621
  61. universal_mcp/applications/linkedin/README.md +18 -1
  62. universal_mcp/applications/linkedin/app.py +729 -251
  63. universal_mcp/applications/mailchimp/app.py +696 -1851
  64. universal_mcp/applications/markitdown/app.py +8 -20
  65. universal_mcp/applications/miro/app.py +333 -815
  66. universal_mcp/applications/ms_teams/app.py +420 -1407
  67. universal_mcp/applications/neon/app.py +144 -250
  68. universal_mcp/applications/notion/app.py +38 -53
  69. universal_mcp/applications/onedrive/app.py +26 -48
  70. universal_mcp/applications/openai/app.py +43 -166
  71. universal_mcp/applications/outlook/README.md +22 -9
  72. universal_mcp/applications/outlook/app.py +403 -141
  73. universal_mcp/applications/perplexity/README.md +2 -1
  74. universal_mcp/applications/perplexity/app.py +161 -20
  75. universal_mcp/applications/pipedrive/app.py +1021 -3331
  76. universal_mcp/applications/posthog/app.py +272 -541
  77. universal_mcp/applications/reddit/app.py +65 -164
  78. universal_mcp/applications/resend/app.py +72 -139
  79. universal_mcp/applications/retell/app.py +23 -50
  80. universal_mcp/applications/rocketlane/app.py +252 -965
  81. universal_mcp/applications/scraper/app.py +114 -142
  82. universal_mcp/applications/semanticscholar/app.py +36 -78
  83. universal_mcp/applications/semrush/app.py +44 -78
  84. universal_mcp/applications/sendgrid/app.py +826 -1576
  85. universal_mcp/applications/sentry/app.py +444 -1079
  86. universal_mcp/applications/serpapi/app.py +44 -146
  87. universal_mcp/applications/sharepoint/app.py +27 -49
  88. universal_mcp/applications/shopify/app.py +1748 -4486
  89. universal_mcp/applications/shortcut/app.py +275 -536
  90. universal_mcp/applications/slack/app.py +43 -125
  91. universal_mcp/applications/spotify/app.py +206 -405
  92. universal_mcp/applications/supabase/app.py +174 -283
  93. universal_mcp/applications/tavily/app.py +2 -2
  94. universal_mcp/applications/trello/app.py +853 -2816
  95. universal_mcp/applications/twilio/app.py +27 -62
  96. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  97. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  98. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  99. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  100. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  101. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  102. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  103. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  104. universal_mcp/applications/whatsapp/app.py +35 -186
  105. universal_mcp/applications/whatsapp/audio.py +2 -6
  106. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  107. universal_mcp/applications/whatsapp_business/app.py +86 -299
  108. universal_mcp/applications/wrike/app.py +80 -153
  109. universal_mcp/applications/yahoo_finance/app.py +19 -65
  110. universal_mcp/applications/youtube/app.py +120 -306
  111. universal_mcp/applications/zenquotes/app.py +3 -3
  112. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/METADATA +4 -2
  113. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/RECORD +115 -119
  114. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/WHEEL +1 -1
  115. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  116. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
  117. universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
  118. universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
  119. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,5 @@
1
1
  from datetime import UTC, datetime, timedelta
2
2
  from typing import Any
3
-
4
3
  from loguru import logger
5
4
  from universal_mcp.applications.application import APIApplication
6
5
  from universal_mcp.integrations import Integration
@@ -24,34 +23,19 @@ class GoogleCalendarApp(APIApplication):
24
23
  """
25
24
  if not dt_string or dt_string == "Unknown":
26
25
  return "Unknown"
27
-
28
- # Check if it's just a date (all-day event) or a datetime
29
26
  if "T" in dt_string:
30
- # It's a datetime - parse and format it
31
27
  try:
32
- # Handle Z (UTC) suffix by replacing with +00:00 timezone
33
28
  if dt_string.endswith("Z"):
34
29
  dt_string = dt_string.replace("Z", "+00:00")
35
-
36
- # Parse the ISO datetime string
37
30
  dt = datetime.fromisoformat(dt_string)
38
-
39
- # Format to a more readable form
40
31
  return dt.strftime("%Y-%m-%d %I:%M %p")
41
32
  except ValueError:
42
- # In case of parsing error, return the original
43
33
  logger.warning(f"Could not parse datetime string: {dt_string}")
44
34
  return dt_string
45
35
  else:
46
- # It's just a date (all-day event)
47
36
  return f"{dt_string} (All day)"
48
37
 
49
- def get_upcoming_events(
50
- self,
51
- days: int = 1,
52
- max_results: int | None = None,
53
- time_zone: str | None = None,
54
- ) -> dict[str, Any]:
38
+ async def get_upcoming_events(self, days: int = 1, max_results: int | None = None, time_zone: str | None = None) -> dict[str, Any]:
55
39
  """
56
40
  Retrieves events for a specified number of days, starting from today. This function simplifies date-range queries by auto-calculating start/end times, unlike the more comprehensive `list_events` function, which offers granular control with explicit time filters, text search, and custom sorting.
57
41
 
@@ -74,28 +58,17 @@ class GoogleCalendarApp(APIApplication):
74
58
  time_min = f"{today.isoformat()}T00:00:00Z"
75
59
  time_max = f"{end_date.isoformat()}T00:00:00Z"
76
60
  url = f"{self.base_api_url}/events"
77
- params = {
78
- "timeMin": time_min,
79
- "timeMax": time_max,
80
- "singleEvents": "true",
81
- "orderBy": "startTime",
82
- }
61
+ params = {"timeMin": time_min, "timeMax": time_max, "singleEvents": "true", "orderBy": "startTime"}
83
62
  if max_results is not None:
84
63
  params["maxResults"] = str(max_results)
85
64
  if time_zone:
86
65
  params["timeZone"] = time_zone
87
66
  date_range = "today" if days == 1 else f"the next {days} days"
88
67
  logger.info(f"Retrieving calendar events for {date_range}")
89
- response = self._get(url, params=params)
90
-
68
+ response = await self._aget(url, params=params)
91
69
  return self._handle_response(response)
92
70
 
93
- def get_event_by_id(
94
- self,
95
- event_id: str,
96
- max_attendees: int | None = None,
97
- time_zone: str | None = None,
98
- ) -> dict[str, Any]:
71
+ async def get_event_by_id(self, event_id: str, max_attendees: int | None = None, time_zone: str | None = None) -> dict[str, Any]:
99
72
  """
100
73
  Retrieves a specific calendar event using its unique ID. Unlike `list_events`, which fetches multiple events based on date ranges or search queries, this function targets a single, known event. It can optionally limit attendees returned and specify a time zone for date formatting in the response.
101
74
 
@@ -121,10 +94,10 @@ class GoogleCalendarApp(APIApplication):
121
94
  if time_zone:
122
95
  params["timeZone"] = time_zone
123
96
  logger.info(f"Retrieving calendar event with ID: {event_id}")
124
- response = self._get(url, params=params)
97
+ response = await self._aget(url, params=params)
125
98
  return self._handle_response(response)
126
99
 
127
- def list_events(
100
+ async def list_events(
128
101
  self,
129
102
  max_results: int = 10,
130
103
  time_min: str | None = None,
@@ -159,16 +132,11 @@ class GoogleCalendarApp(APIApplication):
159
132
  list, retrieve, calendar, events, pagination, api, important
160
133
  """
161
134
  url = f"{self.base_api_url}/events"
162
- params = {
163
- "maxResults": str(max_results),
164
- "orderBy": order_by,
165
- "singleEvents": str(single_events).lower(),
166
- }
135
+ params = {"maxResults": str(max_results), "orderBy": order_by, "singleEvents": str(single_events).lower()}
167
136
  if time_min:
168
137
  params["timeMin"] = time_min
169
138
  else:
170
- # Default to current time if not specified
171
- now = datetime.utcnow().isoformat() + "Z" # 'Z' indicates UTC time
139
+ now = datetime.utcnow().isoformat() + "Z"
172
140
  params["timeMin"] = now
173
141
  if time_max:
174
142
  params["timeMax"] = time_max
@@ -179,11 +147,10 @@ class GoogleCalendarApp(APIApplication):
179
147
  if page_token:
180
148
  params["pageToken"] = page_token
181
149
  logger.info(f"Retrieving calendar events with params: {params}")
182
- response = self._get(url, params=params)
183
-
150
+ response = await self._aget(url, params=params)
184
151
  return self._handle_response(response)
185
152
 
186
- def create_event(
153
+ async def create_event(
187
154
  self,
188
155
  start: dict[str, Any],
189
156
  end: dict[str, Any],
@@ -231,7 +198,6 @@ class GoogleCalendarApp(APIApplication):
231
198
  Tags:
232
199
  create, calendar, event, insert, recurring, important
233
200
  """
234
-
235
201
  request_body_data = {
236
202
  "start": start,
237
203
  "end": end,
@@ -241,19 +207,12 @@ class GoogleCalendarApp(APIApplication):
241
207
  "attendees": attendees,
242
208
  "recurrence": recurrence,
243
209
  }
244
- request_body_data = {
245
- k: v for k, v in request_body_data.items() if v is not None
246
- }
247
-
210
+ request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
248
211
  url = f"{self.base_url}/calendars/{calendar_id}/events"
249
-
250
- response = self._post(url, data=request_body_data)
251
-
212
+ response = await self._apost(url, data=request_body_data)
252
213
  return self._handle_response(response)
253
214
 
254
- def create_event_from_text(
255
- self, text: str, send_updates: str = "none"
256
- ) -> dict[str, Any]:
215
+ async def create_event_from_text(self, text: str, send_updates: str = "none") -> dict[str, Any]:
257
216
  """
258
217
  Creates a calendar event by parsing a natural language string (e.g., "Meeting tomorrow at 10am"). This offers a user-friendly shortcut, contrasting with the structured `create_event` function which requires explicit fields like start and end times.
259
218
 
@@ -273,11 +232,10 @@ class GoogleCalendarApp(APIApplication):
273
232
  url = f"{self.base_api_url}/events/quickAdd"
274
233
  params = {"text": text, "sendUpdates": send_updates}
275
234
  logger.info(f"Creating event via quickAdd: '{text}'")
276
- response = self._post(url, data=None, params=params)
277
-
235
+ response = await self._apost(url, data=None, params=params)
278
236
  return self._handle_response(response)
279
237
 
280
- def list_recurring_event_instances(
238
+ async def list_recurring_event_instances(
281
239
  self,
282
240
  event_id: str,
283
241
  max_results: int = 25,
@@ -310,10 +268,7 @@ class GoogleCalendarApp(APIApplication):
310
268
  list, retrieve, calendar, events, recurring, pagination, api, important
311
269
  """
312
270
  url = f"{self.base_api_url}/events/{event_id}/instances"
313
- params = {
314
- "maxResults": str(max_results),
315
- "showDeleted": str(show_deleted).lower(),
316
- }
271
+ params = {"maxResults": str(max_results), "showDeleted": str(show_deleted).lower()}
317
272
  if time_min:
318
273
  params["timeMin"] = time_min
319
274
  if time_max:
@@ -323,11 +278,10 @@ class GoogleCalendarApp(APIApplication):
323
278
  if page_token:
324
279
  params["pageToken"] = page_token
325
280
  logger.info(f"Retrieving instances of recurring event with ID: {event_id}")
326
- response = self._get(url, params=params)
327
-
281
+ response = await self._aget(url, params=params)
328
282
  return self._handle_response(response)
329
283
 
330
- def delete_event(
284
+ async def delete_event(
331
285
  self,
332
286
  calendarId,
333
287
  eventId,
@@ -383,10 +337,10 @@ class GoogleCalendarApp(APIApplication):
383
337
  ]
384
338
  if v is not None
385
339
  }
386
- response = self._delete(url, params=query_params)
340
+ response = await self._adelete(url, params=query_params)
387
341
  return self._handle_response(response)
388
342
 
389
- def replace_event(
343
+ async def replace_event(
390
344
  self,
391
345
  event_id: str,
392
346
  start: dict[str, Any],
@@ -443,21 +397,16 @@ class GoogleCalendarApp(APIApplication):
443
397
  "attendees": attendees,
444
398
  "recurrence": recurrence,
445
399
  }
446
- request_body_data = {
447
- k: v for k, v in request_body_data.items() if v is not None
448
- }
449
-
400
+ request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
450
401
  url = f"{self.base_url}/calendars/{calendar_id}/events/{event_id}"
451
402
  params = {"sendUpdates": send_updates}
452
403
  if max_attendees is not None:
453
404
  params["maxAttendees"] = str(max_attendees)
454
-
455
405
  logger.info(f"Updating calendar event with ID: {event_id}")
456
- response = self._put(url, data=request_body_data, params=params)
457
-
406
+ response = await self._aput(url, data=request_body_data, params=params)
458
407
  return self._handle_response(response)
459
408
 
460
- def get_primary_calendar_details(self) -> dict[str, Any]:
409
+ async def get_primary_calendar_details(self) -> dict[str, Any]:
461
410
  """
462
411
  Retrieves metadata for the user's primary calendar, including its default timezone. This information is essential for creating new events with accurate, timezone-aware start and end times using other functions like `create_event`, preventing potential scheduling errors across different regions.
463
412
 
@@ -472,10 +421,10 @@ class GoogleCalendarApp(APIApplication):
472
421
  """
473
422
  url = f"{self.base_api_url}"
474
423
  logger.info("Retrieving user's calendar timezone settings")
475
- response = self._get(url)
424
+ response = await self._aget(url)
476
425
  return self._handle_response(response)
477
426
 
478
- def get_free_busy_info(
427
+ async def get_free_busy_info(
479
428
  self,
480
429
  alt=None,
481
430
  fields=None,
@@ -554,7 +503,7 @@ class GoogleCalendarApp(APIApplication):
554
503
  ]
555
504
  if v is not None
556
505
  }
557
- response = self._post(url, data=request_body, params=query_params)
506
+ response = await self._apost(url, data=request_body, params=query_params)
558
507
  response.raise_for_status()
559
508
  return response.json()
560
509
 
@@ -568,7 +517,6 @@ class GoogleCalendarApp(APIApplication):
568
517
  self.replace_event,
569
518
  self.list_recurring_event_instances,
570
519
  self.get_primary_calendar_details,
571
- # Auto Generated from Openapi spec
572
520
  self.delete_event,
573
521
  self.get_free_busy_info,
574
522
  ]
@@ -9,17 +9,18 @@ This is automatically generated from OpenAPI schema for the GoogleDocsApp API.
9
9
 
10
10
  | Tool | Description |
11
11
  |------|-------------|
12
- | `create_document` | Creates a blank Google Document with a specified title using a POST request to the Google Docs API. This is the primary creation method, returning the document's metadata, including the ID required by functions like `get_document` or `insert_text` to perform subsequent operations on the new file. |
13
- | `get_document` | Retrieves the complete content and metadata for a specific Google Document using its unique ID. This function performs a GET request to the API, returning the full JSON response. It's the primary read operation, contrasting with `create_document` which creates new documents. |
14
- | `insert_text` | Inserts a text string at a specified index within an existing Google Document using the `batchUpdate` API. This function adds new textual content, distinguishing it from functions that insert non-text elements like tables or apply formatting (`apply_text_style`) to existing content. |
15
- | `apply_text_style` | Applies character-level formatting such as bold, italic, font size, color, and hyperlinks to a specified text range in a document. This function modifies text appearance, distinguishing it from `update_paragraph_style`, which handles block-level formatting like alignment and headings. |
16
- | `delete_content_range` | Deletes content within a specified index range in a Google Document via the batchUpdate API. It removes any content based on location, distinguishing it from functions like `delete_header` or `delete_paragraph_bullets`, which remove specific structures or styles instead. |
17
- | `insert_table` | Inserts a table with specified row and column dimensions at a given index in a Google Document. This function uses the `batchUpdate` API for precise placement, allowing the table to be added to the document's body, a header, or a footer, returning the API's response. |
18
- | `create_footer` | Creates a footer of a specified type in a Google Document via the batch update API. The footer can optionally be associated with a specific section break, enabling distinct footers for different document sections, distinguishing it from the `create_header` and `create_footnote` functions. |
19
- | `create_footnote` | Creates a footnote via the batch update API, inserting a numbered reference at a specified index or a segment's end. This function adds an in-body citation, distinguishing it from `create_footer` which creates a content block at the bottom of the page. |
20
- | `delete_footer` | Deletes a specific footer from a Google Document using its unique ID via a `batchUpdate` request. This operation, the counterpart to `create_footer`, removes an entire footer section, unlike `delete_content_range` which targets text within a specified index range. |
21
- | `create_header` | Creates a header in a specified Google Document via the batchUpdate API endpoint. This function allows defining the header type and can optionally associate it with a specific section break location. It complements the `delete_header` and `create_footer` functions for managing document structure. |
22
- | `delete_header` | Removes a specific header from a Google Document using its unique ID. This function sends a `deleteHeader` request to the batch update API, acting as the direct counterpart to `create_header` and distinguishing it from `delete_footer` which removes footers. |
23
- | `apply_list_style` | Applies a predefined bulleted or numbered list format to paragraphs within a specified range using a `bullet_preset`. This function adds list formatting, distinguishing it from its counterpart, `delete_paragraph_bullets`, and other styling functions like `update_paragraph_style`, which handles alignment and headings. |
24
- | `delete_paragraph_bullets` | Removes bullet points or numbering from paragraphs within a specified range in a Google Document. This function reverts list formatting via the batch update API, acting as the direct counterpart to `apply_list_style` and preserving the underlying text content, unlike `delete_content_range`. |
25
- | `update_paragraph_style` | Applies paragraph-level formatting, such as named styles (e.g., 'HEADING_1'), alignment, or text direction, to a specified text range. This function handles block-level styles, distinguishing it from `apply_text_style`, which formats individual characters with attributes like bold or italic. |
12
+ | `create_document` | Creates a blank Google Document with a specified title by sending a POST request to the Google Docs API. The function returns a dictionary containing the new document's metadata, including the unique document ID required by other functions for subsequent modifications or retrieval. Note that you need to call other google_docs functions (e.g. `google_docs__insert_text`) to actually add content after creating the document. |
13
+ | `get_document` | Retrieves the complete, raw JSON object for a Google Document by its ID. This function returns the full, unprocessed API response with all metadata and structural elements, distinguishing it from `get_document_content`, which parses this data to extract only the title and plain text. |
14
+ | `get_document_content` | Retrieves and converts a Google Docs document into Markdown-formatted content. |
15
+ | `insert_text` | Inserts a text string at a specified index within a Google Document using the batchUpdate API. Unlike functions that format existing text or delete content ranges, this method specifically adds new textual content to the document body. |
16
+ | `apply_text_style` | Applies character-level formatting (e.g., bold, italic, color, links) to a specified text range. This function modifies text attributes directly, distinguishing it from `update_paragraph_style` which handles block-level properties like alignment. |
17
+ | `update_paragraph_style` | Applies paragraph-level formatting like alignment, named styles (e.g., 'HEADING_1'), and text direction to a text range in a Google Doc. Distinct from `apply_text_style`, which handles character formatting, this method modifies properties for entire paragraphs using the batchUpdate API. |
18
+ | `delete_content_range` | Removes content from a specified index range in a Google Document via the batchUpdate API. Unlike functions that delete entire elements (e.g., `delete_header`), this provides granular control by targeting content based on its precise start and end location, optionally within a specific segment or tab. |
19
+ | `insert_table` | Inserts a table with specified rows and columns at a given index in a Google Document using the batchUpdate API. It can optionally place the table within specific document segments, such as headers or footers, handling structural additions rather than text or style modifications. |
20
+ | `create_footer` | Creates a footer of a specified type in a Google Document using the batch update API. This function, distinct from `create_header`, can optionally associate the new footer with a specific section break, enabling section-specific footers within the document. |
21
+ | `create_footnote` | Inserts a numbered footnote reference into a Google Document using the batchUpdate API. The footnote can be placed at a precise index or at the end of a document segment, distinct from the `create_footer` function which adds standard page footers. |
22
+ | `delete_footer` | Deletes a specific footer from a Google Document using its unique ID via a batchUpdate API request. This operation removes the entire footer object, optionally within a specific tab, distinguishing it from functions that delete headers (`delete_header`) or general content (`delete_content_range`). |
23
+ | `create_header` | Creates a header of a specified type in a Google Document using the batchUpdate API. This function can optionally associate the new header with a specific section break, distinguishing it from the `create_footer` method, which performs the equivalent action for footers. |
24
+ | `delete_header` | Deletes a specific header from a Google Document using its unique ID via a batchUpdate API request. This function, the counterpart to `create_header`, removes headers and can optionally target a header within a specific tab. It requires both the document and header IDs for the operation. |
25
+ | `apply_list_style` | Applies a predefined list style (bulleted or numbered) to paragraphs within a specified range using a chosen preset. Unlike `delete_paragraph_bullets`, which removes list formatting, this function creates it, distinguishing it from other text and paragraph styling methods in the class. |
26
+ | `delete_paragraph_bullets` | Removes bullet points or numbering from paragraphs within a specified index range in a Google Document. This reverts list formatting to normal text while preserving content, acting as the inverse operation to the `apply_list_style` function. |