universal-mcp 0.1.12__py3-none-any.whl → 0.1.13rc2__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.
Files changed (109) hide show
  1. universal_mcp/applications/__init__.py +51 -7
  2. universal_mcp/cli.py +109 -17
  3. universal_mcp/integrations/__init__.py +1 -1
  4. universal_mcp/integrations/integration.py +79 -0
  5. universal_mcp/servers/README.md +79 -0
  6. universal_mcp/servers/server.py +17 -29
  7. universal_mcp/stores/README.md +74 -0
  8. universal_mcp/stores/store.py +0 -2
  9. universal_mcp/templates/README.md.j2 +93 -0
  10. universal_mcp/templates/api_client.py.j2 +27 -0
  11. universal_mcp/tools/README.md +86 -0
  12. universal_mcp/tools/tools.py +1 -1
  13. universal_mcp/utils/agentr.py +90 -0
  14. universal_mcp/utils/api_generator.py +166 -208
  15. universal_mcp/utils/openapi.py +221 -321
  16. universal_mcp/utils/singleton.py +23 -0
  17. {universal_mcp-0.1.12.dist-info → universal_mcp-0.1.13rc2.dist-info}/METADATA +16 -41
  18. universal_mcp-0.1.13rc2.dist-info/RECORD +38 -0
  19. universal_mcp/applications/ahrefs/README.md +0 -76
  20. universal_mcp/applications/ahrefs/__init__.py +0 -0
  21. universal_mcp/applications/ahrefs/app.py +0 -2291
  22. universal_mcp/applications/cal_com_v2/README.md +0 -175
  23. universal_mcp/applications/cal_com_v2/__init__.py +0 -0
  24. universal_mcp/applications/cal_com_v2/app.py +0 -5390
  25. universal_mcp/applications/calendly/README.md +0 -78
  26. universal_mcp/applications/calendly/__init__.py +0 -0
  27. universal_mcp/applications/calendly/app.py +0 -1195
  28. universal_mcp/applications/clickup/README.md +0 -160
  29. universal_mcp/applications/clickup/__init__.py +0 -0
  30. universal_mcp/applications/clickup/app.py +0 -5009
  31. universal_mcp/applications/coda/README.md +0 -133
  32. universal_mcp/applications/coda/__init__.py +0 -0
  33. universal_mcp/applications/coda/app.py +0 -3671
  34. universal_mcp/applications/e2b/README.md +0 -37
  35. universal_mcp/applications/e2b/app.py +0 -65
  36. universal_mcp/applications/elevenlabs/README.md +0 -84
  37. universal_mcp/applications/elevenlabs/__init__.py +0 -0
  38. universal_mcp/applications/elevenlabs/app.py +0 -1402
  39. universal_mcp/applications/falai/README.md +0 -42
  40. universal_mcp/applications/falai/__init__.py +0 -0
  41. universal_mcp/applications/falai/app.py +0 -332
  42. universal_mcp/applications/figma/README.md +0 -74
  43. universal_mcp/applications/figma/__init__.py +0 -0
  44. universal_mcp/applications/figma/app.py +0 -1261
  45. universal_mcp/applications/firecrawl/README.md +0 -45
  46. universal_mcp/applications/firecrawl/app.py +0 -268
  47. universal_mcp/applications/github/README.md +0 -47
  48. universal_mcp/applications/github/app.py +0 -429
  49. universal_mcp/applications/gong/README.md +0 -88
  50. universal_mcp/applications/gong/__init__.py +0 -0
  51. universal_mcp/applications/gong/app.py +0 -2297
  52. universal_mcp/applications/google_calendar/app.py +0 -442
  53. universal_mcp/applications/google_docs/README.md +0 -40
  54. universal_mcp/applications/google_docs/app.py +0 -88
  55. universal_mcp/applications/google_drive/README.md +0 -44
  56. universal_mcp/applications/google_drive/app.py +0 -286
  57. universal_mcp/applications/google_mail/README.md +0 -47
  58. universal_mcp/applications/google_mail/app.py +0 -664
  59. universal_mcp/applications/google_sheet/README.md +0 -42
  60. universal_mcp/applications/google_sheet/app.py +0 -150
  61. universal_mcp/applications/hashnode/app.py +0 -81
  62. universal_mcp/applications/hashnode/prompt.md +0 -23
  63. universal_mcp/applications/heygen/README.md +0 -69
  64. universal_mcp/applications/heygen/__init__.py +0 -0
  65. universal_mcp/applications/heygen/app.py +0 -956
  66. universal_mcp/applications/mailchimp/README.md +0 -306
  67. universal_mcp/applications/mailchimp/__init__.py +0 -0
  68. universal_mcp/applications/mailchimp/app.py +0 -10937
  69. universal_mcp/applications/markitdown/app.py +0 -44
  70. universal_mcp/applications/notion/README.md +0 -55
  71. universal_mcp/applications/notion/__init__.py +0 -0
  72. universal_mcp/applications/notion/app.py +0 -527
  73. universal_mcp/applications/perplexity/README.md +0 -37
  74. universal_mcp/applications/perplexity/app.py +0 -65
  75. universal_mcp/applications/reddit/README.md +0 -45
  76. universal_mcp/applications/reddit/app.py +0 -379
  77. universal_mcp/applications/replicate/README.md +0 -65
  78. universal_mcp/applications/replicate/__init__.py +0 -0
  79. universal_mcp/applications/replicate/app.py +0 -980
  80. universal_mcp/applications/resend/README.md +0 -38
  81. universal_mcp/applications/resend/app.py +0 -37
  82. universal_mcp/applications/retell_ai/README.md +0 -46
  83. universal_mcp/applications/retell_ai/__init__.py +0 -0
  84. universal_mcp/applications/retell_ai/app.py +0 -333
  85. universal_mcp/applications/rocketlane/README.md +0 -42
  86. universal_mcp/applications/rocketlane/__init__.py +0 -0
  87. universal_mcp/applications/rocketlane/app.py +0 -194
  88. universal_mcp/applications/serpapi/README.md +0 -37
  89. universal_mcp/applications/serpapi/app.py +0 -73
  90. universal_mcp/applications/spotify/README.md +0 -116
  91. universal_mcp/applications/spotify/__init__.py +0 -0
  92. universal_mcp/applications/spotify/app.py +0 -2526
  93. universal_mcp/applications/supabase/README.md +0 -112
  94. universal_mcp/applications/supabase/__init__.py +0 -0
  95. universal_mcp/applications/supabase/app.py +0 -2970
  96. universal_mcp/applications/tavily/README.md +0 -38
  97. universal_mcp/applications/tavily/app.py +0 -51
  98. universal_mcp/applications/wrike/README.md +0 -71
  99. universal_mcp/applications/wrike/__init__.py +0 -0
  100. universal_mcp/applications/wrike/app.py +0 -1372
  101. universal_mcp/applications/youtube/README.md +0 -82
  102. universal_mcp/applications/youtube/__init__.py +0 -0
  103. universal_mcp/applications/youtube/app.py +0 -1428
  104. universal_mcp/applications/zenquotes/README.md +0 -37
  105. universal_mcp/applications/zenquotes/app.py +0 -31
  106. universal_mcp/integrations/agentr.py +0 -112
  107. universal_mcp-0.1.12.dist-info/RECORD +0 -119
  108. {universal_mcp-0.1.12.dist-info → universal_mcp-0.1.13rc2.dist-info}/WHEEL +0 -0
  109. {universal_mcp-0.1.12.dist-info → universal_mcp-0.1.13rc2.dist-info}/entry_points.txt +0 -0
@@ -1,42 +0,0 @@
1
-
2
- # Google Sheet MCP Server
3
-
4
- An MCP Server for the Google Sheet API.
5
-
6
- ## Supported Integrations
7
-
8
- - AgentR
9
- - API Key (Coming Soon)
10
- - OAuth (Coming Soon)
11
-
12
- ## Tools
13
-
14
- This is automatically generated from OpenAPI schema for the Google Sheet API.
15
-
16
- ## Supported Integrations
17
-
18
- This tool can be integrated with any service that supports HTTP requests.
19
-
20
- ## Tool List
21
-
22
- | Tool | Description |
23
- |------|-------------|
24
- | create_spreadsheet | Creates a new blank Google Spreadsheet with the specified title. |
25
- | get_spreadsheet | Returns the spreadsheet details. |
26
- | batch_get_values | Returns one or more ranges of values from a spreadsheet. |
27
- | clear_values | Clears values from a spreadsheet. Only values are cleared -- all other properties
28
- of the cell (such as formatting, data validation, etc.) are kept. |
29
- | update_values | Sets values in a range of a spreadsheet. |
30
-
31
-
32
-
33
- ## Usage
34
-
35
- - Login to AgentR
36
- - Follow the quickstart guide to setup MCP Server for your client
37
- - Visit Apps Store and enable the Google Sheet app
38
- - Restart the MCP Server
39
-
40
- ### Local Development
41
-
42
- - Follow the README to test with the local MCP Server
@@ -1,150 +0,0 @@
1
- from typing import Any
2
-
3
- from universal_mcp.applications.application import APIApplication
4
- from universal_mcp.integrations import Integration
5
-
6
-
7
- class GoogleSheetApp(APIApplication):
8
- """
9
- Application for interacting with Google Sheets API.
10
- Provides tools to create and manage Google Spreadsheets.
11
- """
12
-
13
- def __init__(self, integration: Integration | None = None) -> None:
14
- super().__init__(name="google-sheet", integration=integration)
15
- self.base_api_url = "https://sheets.googleapis.com/v4/spreadsheets"
16
-
17
- def create_spreadsheet(self, title: str) -> dict[str, Any]:
18
- """
19
- Creates a new blank Google Spreadsheet with the specified title and returns the API response.
20
-
21
- Args:
22
- title: String representing the desired title for the new spreadsheet
23
-
24
- Returns:
25
- Dictionary containing the full response from the Google Sheets API, including the spreadsheet's metadata and properties
26
-
27
- Raises:
28
- HTTPError: When the API request fails due to invalid authentication, network issues, or API limitations
29
- ValueError: When the title parameter is empty or contains invalid characters
30
-
31
- Tags:
32
- create, spreadsheet, google-sheets, api, important
33
- """
34
- url = self.base_api_url
35
- spreadsheet_data = {"properties": {"title": title}}
36
- response = self._post(url, data=spreadsheet_data)
37
- return response.json()
38
-
39
- def get_spreadsheet(self, spreadsheet_id: str) -> dict[str, Any]:
40
- """
41
- Retrieves detailed information about a specific Google Spreadsheet using its ID.
42
-
43
- Args:
44
- spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve (found in the spreadsheet's URL)
45
-
46
- Returns:
47
- A dictionary containing the full spreadsheet metadata and contents, including properties, sheets, named ranges, and other spreadsheet-specific information from the Google Sheets API
48
-
49
- Raises:
50
- HTTPError: When the API request fails due to invalid spreadsheet_id or insufficient permissions
51
- ConnectionError: When there's a network connectivity issue
52
- ValueError: When the response cannot be parsed as JSON
53
-
54
- Tags:
55
- get, retrieve, spreadsheet, api, metadata, read, important
56
- """
57
- url = f"{self.base_api_url}/{spreadsheet_id}"
58
- response = self._get(url)
59
- return response.json()
60
-
61
- def batch_get_values(
62
- self, spreadsheet_id: str, ranges: list[str] = None
63
- ) -> dict[str, Any]:
64
- """
65
- Retrieves multiple ranges of values from a Google Spreadsheet in a single batch request.
66
-
67
- Args:
68
- spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve values from
69
- ranges: Optional list of A1 notation or R1C1 notation range strings (e.g., ['Sheet1!A1:B2', 'Sheet2!C3:D4']). If None, returns values from the entire spreadsheet
70
-
71
- Returns:
72
- A dictionary containing the API response with the requested spreadsheet values and metadata
73
-
74
- Raises:
75
- HTTPError: If the API request fails due to invalid spreadsheet_id, insufficient permissions, or invalid range format
76
- ValueError: If the spreadsheet_id is empty or invalid
77
-
78
- Tags:
79
- get, batch, read, spreadsheet, values, important
80
- """
81
- url = f"{self.base_api_url}/{spreadsheet_id}/values:batchGet"
82
- params = {}
83
- if ranges:
84
- params["ranges"] = ranges
85
- response = self._get(url, params=params)
86
- return response.json()
87
-
88
- def clear_values(self, spreadsheet_id: str, range: str) -> dict[str, Any]:
89
- """
90
- Clears all values from a specified range in a Google Spreadsheet while preserving cell formatting and other properties
91
-
92
- Args:
93
- spreadsheet_id: The unique identifier of the Google Spreadsheet to modify
94
- range: The A1 or R1C1 notation range of cells to clear (e.g., 'Sheet1!A1:B2')
95
-
96
- Returns:
97
- A dictionary containing the Google Sheets API response
98
-
99
- Raises:
100
- HttpError: When the API request fails due to invalid spreadsheet_id, invalid range format, or insufficient permissions
101
- ValueError: When spreadsheet_id is empty or range is in invalid format
102
-
103
- Tags:
104
- clear, modify, spreadsheet, api, sheets, data-management, important
105
- """
106
- url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}:clear"
107
- response = self._post(url, data={})
108
- return response.json()
109
-
110
- def update_values(
111
- self,
112
- spreadsheet_id: str,
113
- range: str,
114
- values: list[list[Any]],
115
- value_input_option: str = "RAW",
116
- ) -> dict[str, Any]:
117
- """
118
- Updates cell values in a specified range of a Google Spreadsheet using the Sheets API
119
-
120
- Args:
121
- spreadsheet_id: The unique identifier of the target Google Spreadsheet
122
- range: The A1 notation range where values will be updated (e.g., 'Sheet1!A1:B2')
123
- values: A list of lists containing the data to write, where each inner list represents a row of values
124
- value_input_option: Determines how input data should be interpreted: 'RAW' (as-is) or 'USER_ENTERED' (parsed as UI input). Defaults to 'RAW'
125
-
126
- Returns:
127
- A dictionary containing the Google Sheets API response with update details
128
-
129
- Raises:
130
- RequestError: When the API request fails due to invalid parameters or network issues
131
- AuthenticationError: When authentication with the Google Sheets API fails
132
-
133
- Tags:
134
- update, write, sheets, api, important, data-modification, google-sheets
135
- """
136
- url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}"
137
- params = {"valueInputOption": value_input_option}
138
- data = {"range": range, "values": values}
139
- response = self._put(url, data=data, params=params)
140
- return response.json()
141
-
142
- def list_tools(self):
143
- """Returns a list of methods exposed as tools."""
144
- return [
145
- self.create_spreadsheet,
146
- self.get_spreadsheet,
147
- self.batch_get_values,
148
- self.clear_values,
149
- self.update_values,
150
- ]
@@ -1,81 +0,0 @@
1
- from gql import gql
2
-
3
- from universal_mcp.applications import GraphQLApplication
4
- from universal_mcp.integrations import Integration
5
-
6
-
7
- class HashnodeApp(GraphQLApplication):
8
- def __init__(self, integration: Integration | None = None, **kwargs) -> None:
9
- super().__init__(name="hashnode", base_url="https://gql.hashnode.com", **kwargs)
10
- self.integration = integration
11
-
12
- def publish_post(
13
- self,
14
- publication_id: str,
15
- title: str,
16
- content: str,
17
- tags: list[str] = None,
18
- slug: str = None,
19
- subtitle: str = None,
20
- cover_image: str = None,
21
- ) -> str:
22
- """
23
- Publishes a post to Hashnode using the GraphQL API.
24
-
25
- Args:
26
- publication_id: The ID of the publication to publish the post to
27
- title: The title of the post
28
- content: The markdown content of the post
29
- tags: Optional list of tag names to add to the post. Example: ["blog", "release-notes", "python", "ai"]
30
- slug: Optional custom URL slug for the post. Example: "my-post"
31
- subtitle: Optional subtitle for the post. Example: "A subtitle for my post"
32
- cover_image: Optional cover image for the post. Example: "https://example.com/cover-image.jpg"
33
- Returns:
34
- The URL of the published post
35
-
36
- Raises:
37
- GraphQLError: If the API request fails
38
-
39
- Tags:
40
- publish, post, hashnode, api, important
41
- """
42
- publish_post_mutation = gql("""
43
- mutation PublishPost($input: PublishPostInput!) {
44
- publishPost(input: $input) {
45
- post {
46
- url
47
- }
48
- }
49
- }
50
- """)
51
-
52
- variables = {
53
- "input": {
54
- "publicationId": publication_id,
55
- "title": title,
56
- "contentMarkdown": content,
57
- }
58
- }
59
-
60
- if tags:
61
- variables["input"]["tags"] = [
62
- {"name": tag, "slug": tag.replace(" ", "-").lower()} for tag in tags
63
- ]
64
-
65
- if slug:
66
- variables["input"]["slug"] = slug
67
-
68
- if subtitle:
69
- variables["input"]["subtitle"] = subtitle
70
-
71
- if cover_image:
72
- variables["input"]["bannerImageOptions"] = {
73
- "url": cover_image,
74
- "potrait": False,
75
- }
76
-
77
- result = self.mutate(publish_post_mutation, variables)
78
- return result["publishPost"]["post"]["url"]
79
-
80
- def list_tools(self):
81
- return [self.publish_post]
@@ -1,23 +0,0 @@
1
- Generate a blog post for given topic for agentr in a formal tone. Use perplexity to research for the topic and put up to date content. Once done publish the post to hashnode blog with publication id: 68077ed7fe54cfc2a84b253b
2
-
3
- Specifically, provide:
4
- - Slug (a concise, URL-friendly version of the title, ideally lowercase and using hyphens between words)
5
- - Title: Craft a catchy, SEO-friendly title (e.g., "5 JavaScript Tips to Boost Your Code’s Performance")
6
- - Subtitle
7
- - Content (the full blog post, aiming for [desired length or detail level, e.g., 500 words, a comprehensive overview, etc.], written in the specified tone and following best practices for readability such as clear headings, subheadings, and concise paragraphs)
8
- - Tags (a comma-separated list of relevant keywords or phrases, around [number, e.g., 3-5] tags, that categorize the blog post). Always include "blog"
9
-
10
- ## Writing Guidelines:
11
- - Divide the content into clear sections with descriptive subheadings (use ## for main sections, ### for subsections)
12
- - Use short paragraphs (2-4 sentences) for readability
13
- - Include practical examples, code snippets (in ``` code blocks), or visuals where applicable
14
- - Add 1-2 external links to credible sources for credibility.
15
- - Conclusion: Summarize key points and include a call-to-action (e.g., “Try these tips and share your results!”).
16
-
17
- Tone: Keep it conversational, professional, and approachable. Length: Aim for 800-1,500 words.
18
-
19
- Markdown Formatting: Use proper Markdown syntax Embed images with Alt text and code with language . Create inline links wherever possible
20
-
21
- Cover Image: Use fal ai tool to generate a cover image for the blog. Use landscape format
22
-
23
- The topic is: "Grok3 vs Gemini2.5 vs GPT4.1 vs Sonnect 3.7"
@@ -1,69 +0,0 @@
1
-
2
- # Heygen MCP Server
3
-
4
- An MCP Server for the Heygen API.
5
-
6
- ## Supported Integrations
7
-
8
- - AgentR
9
- - API Key (Coming Soon)
10
- - OAuth (Coming Soon)
11
-
12
- ## Tools
13
-
14
- This is automatically generated from OpenAPI schema for the Heygen API.
15
-
16
- ## Supported Integrations
17
-
18
- This tool can be integrated with any service that supports HTTP requests.
19
-
20
- ## Tool List
21
-
22
- | Tool | Description |
23
- |------|-------------|
24
- | get_v1_voice_list | Retrieves the list of available voices from the v1 voice API endpoint. |
25
- | get_v1_avatar_list | Retrieves a list of available avatars from the v1 API endpoint. |
26
- | get_v2_voices | Retrieves the list of available v2 voices from the API endpoint. |
27
- | get_v2_avatars | Retrieves a list of avatar objects from the /v2/avatars API endpoint. |
28
- | get_v1_video_list | Retrieves a list of videos from the v1 API endpoint. |
29
- | post_v2_video_generate | Submits a request to generate a video using specified input parameters via the v2 video generate API endpoint. |
30
- | delete_v1_video | Deletes a video using the v1 API endpoint with the specified video ID. |
31
- | get_v2_templates | Retrieves the list of v2 templates from the API endpoint. |
32
- | get_v2_template_by_id | Retrieves a v2 template resource by its unique identifier. |
33
- | post_v2_template_generate_by_id | Generates content from a template specified by ID using the provided title and variables, and returns the generation result. |
34
- | get_v2_video_translate_target_languages | Retrieves the list of supported target languages for video translation via the v2 API. |
35
- | post_v2_video_translate | Submits a video translation request and returns the API response as JSON. |
36
- | get_v2_video_translate_status_by_id | Retrieves the status of a video translation job by its unique identifier. |
37
- | post_streaming_new | Initiates a new streaming session with optional quality parameter and returns the server's JSON response. |
38
- | get_streaming_list | Retrieves the list of available streaming resources from the remote API. |
39
- | post_streaming_ice | Sends an ICE candidate for a streaming session to the server and returns the JSON response. |
40
- | post_streaming_task | Submits a streaming task for the specified session and text input, returning the response from the remote API. |
41
- | post_streaming_stop | Stops an ongoing streaming session by sending a stop request for the specified session ID. |
42
- | post_streaming_interrupt | Sends a request to interrupt an active streaming session identified by the given session ID. |
43
- | post_streaming_create_token | Creates a new streaming token with an optional expiry time by sending a POST request to the streaming token API endpoint. |
44
- | get_streaming_avatar_list | Retrieves a list of available streaming avatars from the API endpoint. |
45
- | get_v1_webhook_list | Retrieves a list of all registered webhooks via the v1 API endpoint. |
46
- | post_v1_webhook_endpoint_add | Registers a new webhook endpoint with the specified URL and events. |
47
- | delete_v1_webhook_endpoint_by_id | Deletes a webhook endpoint identified by its ID via a DELETE request to the v1 API. |
48
- | get_v1_webhook_endpoint_list | Retrieves a list of webhook endpoints from the v1 API. |
49
- | get_v1_talking_photo_list | Retrieves the list of talking photos from the v1 API endpoint. |
50
- | delete_v2_talking_photo_by_id | Deletes a v2 talking photo resource identified by its unique ID. |
51
- | post_personalized_video_add_contact | Adds a new contact to a personalized video project by sending the contact variables to the server. |
52
- | get_personalized_video_audience_detail | Retrieves detailed information about a personalized video audience by ID. |
53
- | get_personalized_video_project_detail | Retrieves the details of a personalized video project by its unique identifier. |
54
- | get_v2_user_remaining_quota | Retrieves the current remaining quota information for the user from the v2 API endpoint. |
55
- | post_v1_asset_upload | Uploads an asset to the server using a POST request to the '/v1/asset' endpoint. |
56
- | get_v1_video_status | Retrieves the status of a video by making a GET request to the v1 video_status endpoint. |
57
-
58
-
59
-
60
- ## Usage
61
-
62
- - Login to AgentR
63
- - Follow the quickstart guide to setup MCP Server for your client
64
- - Visit Apps Store and enable the Heygen app
65
- - Restart the MCP Server
66
-
67
- ### Local Development
68
-
69
- - Follow the README to test with the local MCP Server
File without changes