universal-mcp-applications 0.1.33__py3-none-any.whl → 0.1.39rc8__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 (113) hide show
  1. universal_mcp/applications/ahrefs/app.py +92 -238
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +122 -475
  4. universal_mcp/applications/asana/app.py +605 -1755
  5. universal_mcp/applications/aws_s3/app.py +36 -103
  6. universal_mcp/applications/bill/app.py +644 -2055
  7. universal_mcp/applications/box/app.py +1246 -4159
  8. universal_mcp/applications/braze/app.py +410 -1476
  9. universal_mcp/applications/browser_use/README.md +15 -1
  10. universal_mcp/applications/browser_use/__init__.py +1 -0
  11. universal_mcp/applications/browser_use/app.py +86 -24
  12. universal_mcp/applications/cal_com_v2/app.py +207 -625
  13. universal_mcp/applications/calendly/app.py +103 -242
  14. universal_mcp/applications/canva/app.py +75 -140
  15. universal_mcp/applications/clickup/app.py +331 -798
  16. universal_mcp/applications/coda/app.py +240 -520
  17. universal_mcp/applications/confluence/app.py +497 -1285
  18. universal_mcp/applications/contentful/app.py +36 -151
  19. universal_mcp/applications/crustdata/app.py +42 -121
  20. universal_mcp/applications/dialpad/app.py +451 -924
  21. universal_mcp/applications/digitalocean/app.py +2071 -6082
  22. universal_mcp/applications/domain_checker/app.py +3 -54
  23. universal_mcp/applications/e2b/app.py +14 -64
  24. universal_mcp/applications/elevenlabs/app.py +9 -47
  25. universal_mcp/applications/exa/README.md +8 -4
  26. universal_mcp/applications/exa/app.py +408 -186
  27. universal_mcp/applications/falai/app.py +24 -101
  28. universal_mcp/applications/figma/app.py +91 -175
  29. universal_mcp/applications/file_system/app.py +2 -13
  30. universal_mcp/applications/firecrawl/app.py +186 -163
  31. universal_mcp/applications/fireflies/app.py +59 -281
  32. universal_mcp/applications/fpl/app.py +92 -529
  33. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  34. universal_mcp/applications/fpl/utils/helper.py +25 -89
  35. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  36. universal_mcp/applications/ghost_content/app.py +66 -175
  37. universal_mcp/applications/github/app.py +28 -65
  38. universal_mcp/applications/gong/app.py +140 -300
  39. universal_mcp/applications/google_calendar/app.py +26 -78
  40. universal_mcp/applications/google_docs/app.py +98 -202
  41. universal_mcp/applications/google_drive/app.py +194 -793
  42. universal_mcp/applications/google_gemini/app.py +27 -62
  43. universal_mcp/applications/google_mail/README.md +1 -0
  44. universal_mcp/applications/google_mail/app.py +93 -214
  45. universal_mcp/applications/google_searchconsole/app.py +25 -58
  46. universal_mcp/applications/google_sheet/app.py +171 -624
  47. universal_mcp/applications/google_sheet/helper.py +26 -53
  48. universal_mcp/applications/hashnode/app.py +57 -269
  49. universal_mcp/applications/heygen/app.py +77 -155
  50. universal_mcp/applications/http_tools/app.py +10 -32
  51. universal_mcp/applications/hubspot/README.md +1 -1
  52. universal_mcp/applications/hubspot/app.py +7508 -99
  53. universal_mcp/applications/jira/app.py +2419 -8334
  54. universal_mcp/applications/klaviyo/app.py +737 -1619
  55. universal_mcp/applications/linkedin/README.md +5 -0
  56. universal_mcp/applications/linkedin/app.py +332 -227
  57. universal_mcp/applications/mailchimp/app.py +696 -1851
  58. universal_mcp/applications/markitdown/app.py +8 -20
  59. universal_mcp/applications/miro/app.py +333 -815
  60. universal_mcp/applications/ms_teams/app.py +85 -207
  61. universal_mcp/applications/neon/app.py +144 -250
  62. universal_mcp/applications/notion/app.py +36 -51
  63. universal_mcp/applications/onedrive/app.py +26 -48
  64. universal_mcp/applications/openai/app.py +42 -165
  65. universal_mcp/applications/outlook/README.md +22 -9
  66. universal_mcp/applications/outlook/app.py +403 -141
  67. universal_mcp/applications/perplexity/README.md +2 -1
  68. universal_mcp/applications/perplexity/app.py +162 -20
  69. universal_mcp/applications/pipedrive/app.py +1021 -3331
  70. universal_mcp/applications/posthog/app.py +272 -541
  71. universal_mcp/applications/reddit/app.py +61 -160
  72. universal_mcp/applications/resend/app.py +41 -107
  73. universal_mcp/applications/retell/app.py +23 -50
  74. universal_mcp/applications/rocketlane/app.py +250 -963
  75. universal_mcp/applications/scraper/app.py +67 -125
  76. universal_mcp/applications/semanticscholar/app.py +36 -78
  77. universal_mcp/applications/semrush/app.py +43 -77
  78. universal_mcp/applications/sendgrid/app.py +826 -1576
  79. universal_mcp/applications/sentry/app.py +444 -1079
  80. universal_mcp/applications/serpapi/app.py +40 -143
  81. universal_mcp/applications/sharepoint/app.py +27 -49
  82. universal_mcp/applications/shopify/app.py +1743 -4479
  83. universal_mcp/applications/shortcut/app.py +272 -534
  84. universal_mcp/applications/slack/app.py +41 -123
  85. universal_mcp/applications/spotify/app.py +206 -405
  86. universal_mcp/applications/supabase/app.py +174 -283
  87. universal_mcp/applications/tavily/app.py +2 -2
  88. universal_mcp/applications/trello/app.py +853 -2816
  89. universal_mcp/applications/twilio/app.py +14 -50
  90. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  91. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  92. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  93. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  94. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  95. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  96. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  97. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  98. universal_mcp/applications/whatsapp/app.py +35 -186
  99. universal_mcp/applications/whatsapp/audio.py +2 -6
  100. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  101. universal_mcp/applications/whatsapp_business/app.py +86 -299
  102. universal_mcp/applications/wrike/app.py +80 -153
  103. universal_mcp/applications/yahoo_finance/app.py +19 -65
  104. universal_mcp/applications/youtube/app.py +120 -306
  105. universal_mcp/applications/zenquotes/app.py +3 -3
  106. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/METADATA +4 -2
  107. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/RECORD +109 -113
  108. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/WHEEL +1 -1
  109. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  110. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
  111. universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
  112. universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
  113. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,5 @@
1
1
  from collections.abc import Callable
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
@@ -26,8 +25,8 @@ class GhostContentApp(APIApplication):
26
25
  """
27
26
  super().__init__(name="ghost_content", integration=integration)
28
27
  self._base_url = None
29
- self._api_key = None # Cache the API key
30
- self._version = None # Cache the version
28
+ self._api_key = None
29
+ self._version = None
31
30
 
32
31
  @property
33
32
  def base_url(self) -> str:
@@ -39,13 +38,8 @@ class GhostContentApp(APIApplication):
39
38
  credentials = self.integration.get_credentials()
40
39
  ghost_url = credentials.get("url") or credentials.get("admin_domain")
41
40
  if not ghost_url:
42
- logger.error(
43
- "GhostContentApp: Missing 'url' or 'admin_domain' in integration credentials."
44
- )
45
- raise ValueError(
46
- "Integration credentials must include 'url' or 'admin_domain' for the Ghost site."
47
- )
48
-
41
+ logger.error("GhostContentApp: Missing 'url' or 'admin_domain' in integration credentials.")
42
+ raise ValueError("Integration credentials must include 'url' or 'admin_domain' for the Ghost site.")
49
43
  self._base_url = f"{ghost_url.rstrip('/')}/api/content/"
50
44
  logger.info(f"GhostContentApp: Constructed base URL as {self._base_url}")
51
45
  return self._base_url
@@ -70,18 +64,10 @@ class GhostContentApp(APIApplication):
70
64
  """
71
65
  if not self._api_key:
72
66
  credentials = self.integration.get_credentials()
73
- api_key = (
74
- credentials.get("key")
75
- or credentials.get("api_key")
76
- or credentials.get("API_KEY")
77
- )
67
+ api_key = credentials.get("key") or credentials.get("api_key") or credentials.get("API_KEY")
78
68
  if not api_key:
79
- logger.error(
80
- "GhostContentApp: Content API key ('key') not found in integration credentials."
81
- )
82
- raise ValueError(
83
- "Integration credentials must include the Ghost Content API 'key'."
84
- )
69
+ logger.error("GhostContentApp: Content API key ('key') not found in integration credentials.")
70
+ raise ValueError("Integration credentials must include the Ghost Content API 'key'.")
85
71
  self._api_key = api_key
86
72
  return self._api_key
87
73
 
@@ -95,10 +81,8 @@ class GhostContentApp(APIApplication):
95
81
  credentials = self.integration.get_credentials()
96
82
  version = credentials.get("api_version")
97
83
  if not version:
98
- logger.warning(
99
- "GhostContentApp: 'version' not found in integration credentials. Defaulting to 'v5.0'."
100
- )
101
- version = "v5.0" # Default to a common version if not specified
84
+ logger.warning("GhostContentApp: 'version' not found in integration credentials. Defaulting to 'v5.0'.")
85
+ version = "v5.0"
102
86
  self._version = version
103
87
  return self._version
104
88
 
@@ -107,37 +91,32 @@ class GhostContentApp(APIApplication):
107
91
  Get the headers for Ghost Content API requests.
108
92
  Overrides the base class method to include the `Accept-Version` header.
109
93
  """
110
- headers = super()._get_headers() # Get base headers (e.g., Content-Type)
111
-
112
- # Add the Accept-Version header as per Ghost Content API documentation
94
+ headers = super()._get_headers()
113
95
  headers["Accept-Version"] = self._get_version
114
- logger.debug(
115
- f"GhostContentApp: Using Accept-Version: {self._get_version} in headers."
116
- )
96
+ logger.debug(f"GhostContentApp: Using Accept-Version: {self._get_version} in headers.")
117
97
  return headers
118
98
 
119
99
  def _build_common_params(
120
100
  self,
121
101
  include: list[str] | None = None,
122
102
  fields: list[str] | None = None,
123
- filter: str | None = None, # Changed from filter_str to filter
103
+ filter: str | None = None,
124
104
  limit: int | None = None,
125
105
  order: str | None = None,
126
106
  page: int | None = None,
127
- formats: list[str] | None = None, # Specific to posts/pages for content format
128
- visibility: str | None = None, # Specific to posts/pages/tiers for visibility
107
+ formats: list[str] | None = None,
108
+ visibility: str | None = None,
129
109
  ) -> dict[str, Any]:
130
110
  """
131
111
  Helper to build common query parameters for Ghost Content API requests,
132
112
  including the mandatory API key.
133
113
  """
134
114
  params: dict[str, Any] = {"key": self._get_api_key}
135
-
136
115
  if include:
137
116
  params["include"] = ",".join(include)
138
117
  if fields:
139
118
  params["fields"] = ",".join(fields)
140
- if filter: # Use 'filter' here
119
+ if filter:
141
120
  params["filter"] = filter
142
121
  if limit is not None:
143
122
  params["limit"] = limit
@@ -151,8 +130,7 @@ class GhostContentApp(APIApplication):
151
130
  params["visibility"] = visibility
152
131
  return params
153
132
 
154
- # --- Posts Tools ---
155
- def browse_posts(
133
+ async def browse_posts(
156
134
  self,
157
135
  include: list[str] | None = None,
158
136
  fields: list[str] | None = None,
@@ -161,7 +139,7 @@ class GhostContentApp(APIApplication):
161
139
  page: int | None = None,
162
140
  order: str | None = None,
163
141
  formats: list[str] | None = None,
164
- ) -> dict[str, Any]: # Changed return type to Dict[str, Any]
142
+ ) -> dict[str, Any]:
165
143
  """
166
144
  Retrieves and browses posts from a data source based on provided parameters.
167
145
 
@@ -184,26 +162,15 @@ class GhostContentApp(APIApplication):
184
162
  browse, fetch, posts, management, important
185
163
  """
186
164
  url = f"{self.base_url}posts/"
187
- # Removed 'visibility' from params as it's not in the method signature
188
165
  params = self._build_common_params(
189
- include=include,
190
- fields=fields,
191
- filter=filter,
192
- limit=limit,
193
- page=page,
194
- order=order,
195
- formats=formats,
166
+ include=include, fields=fields, filter=filter, limit=limit, page=page, order=order, formats=formats
196
167
  )
197
- response = self._get(url, params=params)
168
+ response = await self._aget(url, params=params)
198
169
  return response.json()
199
170
 
200
- def read_post_by_id(
201
- self,
202
- id: str,
203
- include: list[str] | None = None,
204
- fields: list[str] | None = None,
205
- formats: list[str] | None = None,
206
- ) -> dict[str, Any]: # Changed return type
171
+ async def read_post_by_id(
172
+ self, id: str, include: list[str] | None = None, fields: list[str] | None = None, formats: list[str] | None = None
173
+ ) -> dict[str, Any]:
207
174
  """
208
175
  Retrieves a post by its ID, optionally including additional data or specific fields.
209
176
 
@@ -223,19 +190,13 @@ class GhostContentApp(APIApplication):
223
190
  read, post, management
224
191
  """
225
192
  url = f"{self.base_url}posts/{id}/"
226
- params = self._build_common_params(
227
- include=include, fields=fields, formats=formats
228
- )
229
- response = self._get(url, params=params)
193
+ params = self._build_common_params(include=include, fields=fields, formats=formats)
194
+ response = await self._aget(url, params=params)
230
195
  return response.json()
231
196
 
232
- def read_post_by_slug(
233
- self,
234
- slug: str,
235
- include: list[str] | None = None,
236
- fields: list[str] | None = None,
237
- formats: list[str] | None = None,
238
- ) -> dict[str, Any]: # Changed return type
197
+ async def read_post_by_slug(
198
+ self, slug: str, include: list[str] | None = None, fields: list[str] | None = None, formats: list[str] | None = None
199
+ ) -> dict[str, Any]:
239
200
  """
240
201
  Retrieves a post by its slug, with optional parameters to specify included data, select specific fields, or request particular data formats.
241
202
 
@@ -255,14 +216,11 @@ class GhostContentApp(APIApplication):
255
216
  read, post, fetch, management
256
217
  """
257
218
  url = f"{self.base_url}posts/slug/{slug}/"
258
- params = self._build_common_params(
259
- include=include, fields=fields, formats=formats
260
- )
261
- response = self._get(url, params=params)
219
+ params = self._build_common_params(include=include, fields=fields, formats=formats)
220
+ response = await self._aget(url, params=params)
262
221
  return response.json()
263
222
 
264
- # --- Authors Tools ---
265
- def browse_authors(
223
+ async def browse_authors(
266
224
  self,
267
225
  include: list[str] | None = None,
268
226
  fields: list[str] | None = None,
@@ -270,7 +228,7 @@ class GhostContentApp(APIApplication):
270
228
  limit: int | None = None,
271
229
  page: int | None = None,
272
230
  order: str | None = None,
273
- ) -> dict[str, Any]: # Changed return type
231
+ ) -> dict[str, Any]:
274
232
  """
275
233
  Browse authors using various filtering and pagination options.
276
234
 
@@ -292,23 +250,11 @@ class GhostContentApp(APIApplication):
292
250
  list, management, important
293
251
  """
294
252
  url = f"{self.base_url}authors/"
295
- params = self._build_common_params(
296
- include=include,
297
- fields=fields,
298
- filter=filter,
299
- limit=limit,
300
- page=page,
301
- order=order,
302
- )
303
- response = self._get(url, params=params)
253
+ params = self._build_common_params(include=include, fields=fields, filter=filter, limit=limit, page=page, order=order)
254
+ response = await self._aget(url, params=params)
304
255
  return response.json()
305
256
 
306
- def read_author_by_id(
307
- self,
308
- id: str,
309
- include: list[str] | None = None,
310
- fields: list[str] | None = None,
311
- ) -> dict[str, Any]: # Changed return type
257
+ async def read_author_by_id(self, id: str, include: list[str] | None = None, fields: list[str] | None = None) -> dict[str, Any]:
312
258
  """
313
259
  Read an author from the database by their unique ID.
314
260
 
@@ -328,15 +274,10 @@ class GhostContentApp(APIApplication):
328
274
  """
329
275
  url = f"{self.base_url}authors/{id}/"
330
276
  params = self._build_common_params(include=include, fields=fields)
331
- response = self._get(url, params=params)
277
+ response = await self._aget(url, params=params)
332
278
  return response.json()
333
279
 
334
- def read_author_by_slug(
335
- self,
336
- slug: str,
337
- include: list[str] | None = None,
338
- fields: list[str] | None = None,
339
- ) -> dict[str, Any]: # Changed return type
280
+ async def read_author_by_slug(self, slug: str, include: list[str] | None = None, fields: list[str] | None = None) -> dict[str, Any]:
340
281
  """
341
282
  Retrieve an author's information by their slug.
342
283
 
@@ -356,11 +297,10 @@ class GhostContentApp(APIApplication):
356
297
  """
357
298
  url = f"{self.base_url}authors/slug/{slug}/"
358
299
  params = self._build_common_params(include=include, fields=fields)
359
- response = self._get(url, params=params)
300
+ response = await self._aget(url, params=params)
360
301
  return response.json()
361
302
 
362
- # --- Tags Tools ---
363
- def browse_tags(
303
+ async def browse_tags(
364
304
  self,
365
305
  include: list[str] | None = None,
366
306
  fields: list[str] | None = None,
@@ -368,7 +308,7 @@ class GhostContentApp(APIApplication):
368
308
  limit: int | None = None,
369
309
  page: int | None = None,
370
310
  order: str | None = None,
371
- ) -> dict[str, Any]: # Changed return type
311
+ ) -> dict[str, Any]:
372
312
  """
373
313
  Browse and retrieve tags based on specified parameters.
374
314
 
@@ -390,23 +330,11 @@ class GhostContentApp(APIApplication):
390
330
  browse, tags, management, important
391
331
  """
392
332
  url = f"{self.base_url}tags/"
393
- params = self._build_common_params(
394
- include=include,
395
- fields=fields,
396
- filter=filter,
397
- limit=limit,
398
- page=page,
399
- order=order,
400
- )
401
- response = self._get(url, params=params)
333
+ params = self._build_common_params(include=include, fields=fields, filter=filter, limit=limit, page=page, order=order)
334
+ response = await self._aget(url, params=params)
402
335
  return response.json()
403
336
 
404
- def read_tag_by_id(
405
- self,
406
- id: str,
407
- include: list[str] | None = None,
408
- fields: list[str] | None = None,
409
- ) -> dict[str, Any]: # Changed return type
337
+ async def read_tag_by_id(self, id: str, include: list[str] | None = None, fields: list[str] | None = None) -> dict[str, Any]:
410
338
  """
411
339
  Retrieves a tag's details by its unique identifier, optionally filtering by included and field sets.
412
340
 
@@ -426,15 +354,10 @@ class GhostContentApp(APIApplication):
426
354
  """
427
355
  url = f"{self.base_url}tags/{id}/"
428
356
  params = self._build_common_params(include=include, fields=fields)
429
- response = self._get(url, params=params)
357
+ response = await self._aget(url, params=params)
430
358
  return response.json()
431
359
 
432
- def read_tag_by_slug(
433
- self,
434
- slug: str,
435
- include: list[str] | None = None,
436
- fields: list[str] | None = None,
437
- ) -> dict[str, Any]: # Changed return type
360
+ async def read_tag_by_slug(self, slug: str, include: list[str] | None = None, fields: list[str] | None = None) -> dict[str, Any]:
438
361
  """
439
362
  Retrieve tag information identified by a unique slug, with optional inclusion of related data and selective fields.
440
363
 
@@ -454,11 +377,10 @@ class GhostContentApp(APIApplication):
454
377
  """
455
378
  url = f"{self.base_url}tags/slug/{slug}/"
456
379
  params = self._build_common_params(include=include, fields=fields)
457
- response = self._get(url, params=params)
380
+ response = await self._aget(url, params=params)
458
381
  return response.json()
459
382
 
460
- # --- Pages Tools ---
461
- def browse_pages(
383
+ async def browse_pages(
462
384
  self,
463
385
  include: list[str] | None = None,
464
386
  fields: list[str] | None = None,
@@ -467,7 +389,7 @@ class GhostContentApp(APIApplication):
467
389
  page: int | None = None,
468
390
  order: str | None = None,
469
391
  formats: list[str] | None = None,
470
- ) -> dict[str, Any]: # Changed return type
392
+ ) -> dict[str, Any]:
471
393
  """
472
394
  Retrieves a list of pages using optional filtering, pagination, and formatting parameters.
473
395
 
@@ -490,26 +412,15 @@ class GhostContentApp(APIApplication):
490
412
  browse, list, management, important
491
413
  """
492
414
  url = f"{self.base_url}pages/"
493
- # Removed 'visibility' from params as it's not in the method signature
494
415
  params = self._build_common_params(
495
- include=include,
496
- fields=fields,
497
- filter=filter,
498
- limit=limit,
499
- page=page,
500
- order=order,
501
- formats=formats,
416
+ include=include, fields=fields, filter=filter, limit=limit, page=page, order=order, formats=formats
502
417
  )
503
- response = self._get(url, params=params)
418
+ response = await self._aget(url, params=params)
504
419
  return response.json()
505
420
 
506
- def read_page_by_id(
507
- self,
508
- id: str,
509
- include: list[str] | None = None,
510
- fields: list[str] | None = None,
511
- formats: list[str] | None = None,
512
- ) -> dict[str, Any]: # Changed return type
421
+ async def read_page_by_id(
422
+ self, id: str, include: list[str] | None = None, fields: list[str] | None = None, formats: list[str] | None = None
423
+ ) -> dict[str, Any]:
513
424
  """
514
425
  Read a page by ID, allowing for optional inclusion of additional data, specific fields, and formats.
515
426
 
@@ -529,19 +440,13 @@ class GhostContentApp(APIApplication):
529
440
  read, page, data-retrieval
530
441
  """
531
442
  url = f"{self.base_url}pages/{id}/"
532
- params = self._build_common_params(
533
- include=include, fields=fields, formats=formats
534
- )
535
- response = self._get(url, params=params)
443
+ params = self._build_common_params(include=include, fields=fields, formats=formats)
444
+ response = await self._aget(url, params=params)
536
445
  return response.json()
537
446
 
538
- def read_page_by_slug(
539
- self,
540
- slug: str,
541
- include: list[str] | None = None,
542
- fields: list[str] | None = None,
543
- formats: list[str] | None = None,
544
- ) -> dict[str, Any]: # Changed return type
447
+ async def read_page_by_slug(
448
+ self, slug: str, include: list[str] | None = None, fields: list[str] | None = None, formats: list[str] | None = None
449
+ ) -> dict[str, Any]:
545
450
  """
546
451
  Retrieve a page's content and metadata by its slug identifier, optionally including related data, specific fields, and content formats.
547
452
 
@@ -561,14 +466,11 @@ class GhostContentApp(APIApplication):
561
466
  read, get, page, slug, http-request
562
467
  """
563
468
  url = f"{self.base_url}pages/slug/{slug}/"
564
- params = self._build_common_params(
565
- include=include, fields=fields, formats=formats
566
- )
567
- response = self._get(url, params=params)
469
+ params = self._build_common_params(include=include, fields=fields, formats=formats)
470
+ response = await self._aget(url, params=params)
568
471
  return response.json()
569
472
 
570
- # --- Tiers Tool ---
571
- def browse_tiers(
473
+ async def browse_tiers(
572
474
  self,
573
475
  include: list[str] | None = None,
574
476
  fields: list[str] | None = None,
@@ -576,7 +478,7 @@ class GhostContentApp(APIApplication):
576
478
  limit: int | None = None,
577
479
  page: int | None = None,
578
480
  order: str | None = None,
579
- ) -> dict[str, Any]: # Changed return type
481
+ ) -> dict[str, Any]:
580
482
  """
581
483
  Browse tiers based on optional filters and pagination.
582
484
 
@@ -598,20 +500,11 @@ class GhostContentApp(APIApplication):
598
500
  browse, pagination, filter, management, important
599
501
  """
600
502
  url = f"{self.base_url}tiers/"
601
- # Removed 'visibility' from params as it's not in the method signature
602
- params = self._build_common_params(
603
- include=include,
604
- fields=fields,
605
- filter=filter,
606
- limit=limit,
607
- page=page,
608
- order=order,
609
- )
610
- response = self._get(url, params=params)
503
+ params = self._build_common_params(include=include, fields=fields, filter=filter, limit=limit, page=page, order=order)
504
+ response = await self._aget(url, params=params)
611
505
  return response.json()
612
506
 
613
- # --- Settings Tool ---
614
- def browse_settings(self) -> dict[str, Any]: # Changed return type
507
+ async def browse_settings(self) -> dict[str, Any]:
615
508
  """
616
509
  Fetches site settings by making a GET request to the settings endpoint.
617
510
 
@@ -628,10 +521,8 @@ class GhostContentApp(APIApplication):
628
521
  fetch, settings, management, important
629
522
  """
630
523
  url = f"{self.base_url}settings/"
631
- params = (
632
- self._build_common_params()
633
- ) # Only the API key is needed for this endpoint via _build_common_params
634
- response = self._get(url, params=params)
524
+ params = self._build_common_params()
525
+ response = await self._aget(url, params=params)
635
526
  return response.json()
636
527
 
637
528
  def list_tools(self) -> list[Callable]: