universal-mcp 0.1.13rc1__py3-none-any.whl → 0.1.13rc3__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.
- universal_mcp/utils/installation.py +8 -8
- {universal_mcp-0.1.13rc1.dist-info → universal_mcp-0.1.13rc3.dist-info}/METADATA +40 -1
- universal_mcp-0.1.13rc3.dist-info/RECORD +38 -0
- universal_mcp/applications/ahrefs/README.md +0 -76
- universal_mcp/applications/ahrefs/__init__.py +0 -0
- universal_mcp/applications/ahrefs/app.py +0 -2291
- universal_mcp/applications/cal_com_v2/README.md +0 -175
- universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- universal_mcp/applications/cal_com_v2/app.py +0 -5390
- universal_mcp/applications/calendly/README.md +0 -78
- universal_mcp/applications/calendly/__init__.py +0 -0
- universal_mcp/applications/calendly/app.py +0 -1195
- universal_mcp/applications/clickup/README.md +0 -160
- universal_mcp/applications/clickup/__init__.py +0 -0
- universal_mcp/applications/clickup/app.py +0 -5009
- universal_mcp/applications/coda/README.md +0 -133
- universal_mcp/applications/coda/__init__.py +0 -0
- universal_mcp/applications/coda/app.py +0 -3671
- universal_mcp/applications/curstdata/README.md +0 -50
- universal_mcp/applications/curstdata/__init__.py +0 -0
- universal_mcp/applications/curstdata/app.py +0 -551
- universal_mcp/applications/e2b/README.md +0 -37
- universal_mcp/applications/e2b/app.py +0 -65
- universal_mcp/applications/elevenlabs/README.md +0 -84
- universal_mcp/applications/elevenlabs/__init__.py +0 -0
- universal_mcp/applications/elevenlabs/app.py +0 -1402
- universal_mcp/applications/falai/README.md +0 -42
- universal_mcp/applications/falai/__init__.py +0 -0
- universal_mcp/applications/falai/app.py +0 -332
- universal_mcp/applications/figma/README.md +0 -74
- universal_mcp/applications/figma/__init__.py +0 -0
- universal_mcp/applications/figma/app.py +0 -1261
- universal_mcp/applications/firecrawl/README.md +0 -45
- universal_mcp/applications/firecrawl/app.py +0 -268
- universal_mcp/applications/github/README.md +0 -47
- universal_mcp/applications/github/app.py +0 -429
- universal_mcp/applications/gong/README.md +0 -88
- universal_mcp/applications/gong/__init__.py +0 -0
- universal_mcp/applications/gong/app.py +0 -2297
- universal_mcp/applications/google_calendar/app.py +0 -442
- universal_mcp/applications/google_docs/README.md +0 -40
- universal_mcp/applications/google_docs/app.py +0 -88
- universal_mcp/applications/google_drive/README.md +0 -44
- universal_mcp/applications/google_drive/app.py +0 -286
- universal_mcp/applications/google_mail/README.md +0 -47
- universal_mcp/applications/google_mail/app.py +0 -664
- universal_mcp/applications/google_sheet/README.md +0 -42
- universal_mcp/applications/google_sheet/app.py +0 -150
- universal_mcp/applications/heygen/README.md +0 -69
- universal_mcp/applications/heygen/__init__.py +0 -0
- universal_mcp/applications/heygen/app.py +0 -956
- universal_mcp/applications/mailchimp/README.md +0 -306
- universal_mcp/applications/mailchimp/__init__.py +0 -0
- universal_mcp/applications/mailchimp/app.py +0 -10937
- universal_mcp/applications/markitdown/app.py +0 -44
- universal_mcp/applications/neon/README.md +0 -99
- universal_mcp/applications/neon/__init__.py +0 -0
- universal_mcp/applications/neon/app.py +0 -1924
- universal_mcp/applications/notion/README.md +0 -55
- universal_mcp/applications/notion/__init__.py +0 -0
- universal_mcp/applications/notion/app.py +0 -527
- universal_mcp/applications/perplexity/README.md +0 -37
- universal_mcp/applications/perplexity/app.py +0 -65
- universal_mcp/applications/reddit/README.md +0 -45
- universal_mcp/applications/reddit/app.py +0 -379
- universal_mcp/applications/replicate/README.md +0 -65
- universal_mcp/applications/replicate/__init__.py +0 -0
- universal_mcp/applications/replicate/app.py +0 -980
- universal_mcp/applications/resend/README.md +0 -38
- universal_mcp/applications/resend/app.py +0 -37
- universal_mcp/applications/retell_ai/README.md +0 -46
- universal_mcp/applications/retell_ai/__init__.py +0 -0
- universal_mcp/applications/retell_ai/app.py +0 -333
- universal_mcp/applications/rocketlane/README.md +0 -42
- universal_mcp/applications/rocketlane/__init__.py +0 -0
- universal_mcp/applications/rocketlane/app.py +0 -194
- universal_mcp/applications/serpapi/README.md +0 -37
- universal_mcp/applications/serpapi/app.py +0 -73
- universal_mcp/applications/shortcut/README.md +0 -153
- universal_mcp/applications/shortcut/__init__.py +0 -0
- universal_mcp/applications/shortcut/app.py +0 -3880
- universal_mcp/applications/spotify/README.md +0 -116
- universal_mcp/applications/spotify/__init__.py +0 -0
- universal_mcp/applications/spotify/app.py +0 -2526
- universal_mcp/applications/supabase/README.md +0 -112
- universal_mcp/applications/supabase/__init__.py +0 -0
- universal_mcp/applications/supabase/app.py +0 -2970
- universal_mcp/applications/tavily/README.md +0 -38
- universal_mcp/applications/tavily/app.py +0 -51
- universal_mcp/applications/wrike/README.md +0 -71
- universal_mcp/applications/wrike/__init__.py +0 -0
- universal_mcp/applications/wrike/app.py +0 -1372
- universal_mcp/applications/youtube/README.md +0 -82
- universal_mcp/applications/youtube/__init__.py +0 -0
- universal_mcp/applications/youtube/app.py +0 -1428
- universal_mcp/applications/zenquotes/README.md +0 -37
- universal_mcp/applications/zenquotes/app.py +0 -31
- universal_mcp-0.1.13rc1.dist-info/RECORD +0 -132
- {universal_mcp-0.1.13rc1.dist-info → universal_mcp-0.1.13rc3.dist-info}/WHEEL +0 -0
- {universal_mcp-0.1.13rc1.dist-info → universal_mcp-0.1.13rc3.dist-info}/entry_points.txt +0 -0
@@ -1,429 +0,0 @@
|
|
1
|
-
from typing import Any, ClassVar
|
2
|
-
|
3
|
-
from loguru import logger
|
4
|
-
|
5
|
-
from universal_mcp.applications.application import APIApplication
|
6
|
-
from universal_mcp.integrations import Integration
|
7
|
-
|
8
|
-
|
9
|
-
class GithubApp(APIApplication):
|
10
|
-
APP_TAGS: ClassVar[list[str]] = ["developers-tools"]
|
11
|
-
|
12
|
-
def __init__(self, integration: Integration) -> None:
|
13
|
-
super().__init__(name="github", integration=integration)
|
14
|
-
self.base_api_url = "https://api.github.com/repos"
|
15
|
-
|
16
|
-
def _get_headers(self):
|
17
|
-
if not self.integration:
|
18
|
-
raise ValueError("Integration not configured")
|
19
|
-
credentials = self.integration.get_credentials()
|
20
|
-
if "headers" in credentials:
|
21
|
-
return credentials["headers"]
|
22
|
-
return {
|
23
|
-
"Authorization": f"Bearer {credentials['access_token']}",
|
24
|
-
"Accept": "application/vnd.github.v3+json",
|
25
|
-
}
|
26
|
-
|
27
|
-
def star_repository(self, repo_full_name: str) -> str:
|
28
|
-
"""
|
29
|
-
Stars a GitHub repository using the GitHub API and returns a status message.
|
30
|
-
|
31
|
-
Args:
|
32
|
-
repo_full_name: The full name of the repository in 'owner/repo' format (e.g., 'octocat/Hello-World')
|
33
|
-
|
34
|
-
Returns:
|
35
|
-
A string message indicating whether the starring operation was successful, the repository was not found, or an error occurred
|
36
|
-
|
37
|
-
Raises:
|
38
|
-
RequestException: If there are network connectivity issues or API request failures
|
39
|
-
ValueError: If the repository name format is invalid
|
40
|
-
|
41
|
-
Tags:
|
42
|
-
star, github, api, action, social, repository, important
|
43
|
-
"""
|
44
|
-
url = f"https://api.github.com/user/starred/{repo_full_name}"
|
45
|
-
response = self._put(url, data={})
|
46
|
-
if response.status_code == 204:
|
47
|
-
return f"Successfully starred repository {repo_full_name}"
|
48
|
-
elif response.status_code == 404:
|
49
|
-
return f"Repository {repo_full_name} not found"
|
50
|
-
else:
|
51
|
-
logger.error(response.text)
|
52
|
-
return f"Error starring repository: {response.text}"
|
53
|
-
|
54
|
-
def list_commits(self, repo_full_name: str) -> str:
|
55
|
-
"""
|
56
|
-
Retrieves and formats a list of recent commits from a GitHub repository
|
57
|
-
|
58
|
-
Args:
|
59
|
-
repo_full_name: The full name of the repository in 'owner/repo' format
|
60
|
-
|
61
|
-
Returns:
|
62
|
-
A formatted string containing the most recent 12 commits, including commit hash, message, and author
|
63
|
-
|
64
|
-
Raises:
|
65
|
-
requests.exceptions.HTTPError: When the GitHub API request fails (e.g., repository not found, rate limit exceeded)
|
66
|
-
requests.exceptions.RequestException: When network issues or other request-related problems occur
|
67
|
-
|
68
|
-
Tags:
|
69
|
-
list, read, commits, github, history, api, important
|
70
|
-
"""
|
71
|
-
repo_full_name = repo_full_name.strip()
|
72
|
-
url = f"{self.base_api_url}/{repo_full_name}/commits"
|
73
|
-
response = self._get(url)
|
74
|
-
response.raise_for_status()
|
75
|
-
commits = response.json()
|
76
|
-
if not commits:
|
77
|
-
return f"No commits found for repository {repo_full_name}"
|
78
|
-
result = f"Recent commits for {repo_full_name}:\n\n"
|
79
|
-
for commit in commits[:12]: # Limit to 12 commits
|
80
|
-
sha = commit.get("sha", "")[:7]
|
81
|
-
message = commit.get("commit", {}).get("message", "").split("\n")[0]
|
82
|
-
author = commit.get("commit", {}).get("author", {}).get("name", "Unknown")
|
83
|
-
|
84
|
-
result += f"- {sha}: {message} (by {author})\n"
|
85
|
-
return result
|
86
|
-
|
87
|
-
def list_branches(self, repo_full_name: str) -> str:
|
88
|
-
"""
|
89
|
-
Lists all branches for a specified GitHub repository and returns them in a formatted string representation.
|
90
|
-
|
91
|
-
Args:
|
92
|
-
repo_full_name: The full name of the repository in 'owner/repo' format (e.g., 'octocat/Hello-World')
|
93
|
-
|
94
|
-
Returns:
|
95
|
-
A formatted string containing the list of branches, or a message indicating no branches were found
|
96
|
-
|
97
|
-
Raises:
|
98
|
-
HTTPError: When the GitHub API request fails (e.g., repository not found, authentication error)
|
99
|
-
RequestException: When there are network connectivity issues or API communication problems
|
100
|
-
|
101
|
-
Tags:
|
102
|
-
list, branches, github, read, api, repository, important
|
103
|
-
"""
|
104
|
-
repo_full_name = repo_full_name.strip()
|
105
|
-
url = f"{self.base_api_url}/{repo_full_name}/branches"
|
106
|
-
response = self._get(url)
|
107
|
-
response.raise_for_status()
|
108
|
-
branches = response.json()
|
109
|
-
if not branches:
|
110
|
-
return f"No branches found for repository {repo_full_name}"
|
111
|
-
result = f"Branches for {repo_full_name}:\n\n"
|
112
|
-
for branch in branches:
|
113
|
-
branch_name = branch.get("name", "Unknown")
|
114
|
-
result += f"- {branch_name}\n"
|
115
|
-
return result
|
116
|
-
|
117
|
-
def list_pull_requests(self, repo_full_name: str, state: str = "open") -> str:
|
118
|
-
"""
|
119
|
-
Retrieves and formats a list of pull requests for a specified GitHub repository.
|
120
|
-
|
121
|
-
Args:
|
122
|
-
repo_full_name: The full name of the repository in the format 'owner/repo' (e.g., 'tensorflow/tensorflow')
|
123
|
-
state: Filter for pull request state. Can be 'open', 'closed', or 'all'. Defaults to 'open'
|
124
|
-
|
125
|
-
Returns:
|
126
|
-
A formatted string containing the list of pull requests, including PR number, title, author, and status. Returns a message if no pull requests are found.
|
127
|
-
|
128
|
-
Raises:
|
129
|
-
HTTPError: Raised when the GitHub API request fails (e.g., invalid repository name, rate limiting, or authentication issues)
|
130
|
-
|
131
|
-
Tags:
|
132
|
-
list, pull-request, github, api, read, important, fetch, query
|
133
|
-
"""
|
134
|
-
repo_full_name = repo_full_name.strip()
|
135
|
-
url = f"{self.base_api_url}/{repo_full_name}/pulls"
|
136
|
-
params = {"state": state}
|
137
|
-
response = self._get(url, params=params)
|
138
|
-
response.raise_for_status()
|
139
|
-
pull_requests = response.json()
|
140
|
-
if not pull_requests:
|
141
|
-
return f"No pull requests found for repository {repo_full_name} with state '{state}'"
|
142
|
-
result = f"Pull requests for {repo_full_name} (State: {state}):\n\n"
|
143
|
-
for pr in pull_requests:
|
144
|
-
pr_title = pr.get("title", "No Title")
|
145
|
-
pr_number = pr.get("number", "Unknown")
|
146
|
-
pr_state = pr.get("state", "Unknown")
|
147
|
-
pr_user = pr.get("user", {}).get("login", "Unknown")
|
148
|
-
|
149
|
-
result += (
|
150
|
-
f"- PR #{pr_number}: {pr_title} (by {pr_user}, Status: {pr_state})\n"
|
151
|
-
)
|
152
|
-
return result
|
153
|
-
|
154
|
-
def list_issues(
|
155
|
-
self,
|
156
|
-
repo_full_name: str,
|
157
|
-
state: str = "open",
|
158
|
-
assignee: str = None,
|
159
|
-
labels: str = None,
|
160
|
-
per_page: int = 30,
|
161
|
-
page: int = 1,
|
162
|
-
) -> list[dict[str, Any]]:
|
163
|
-
"""
|
164
|
-
Retrieves a list of issues from a specified GitHub repository with optional filtering parameters.
|
165
|
-
|
166
|
-
Args:
|
167
|
-
repo_full_name: The full name of the repository in 'owner/repo' format
|
168
|
-
state: Filter issues by state ('open', 'closed', 'all'). Defaults to 'open'
|
169
|
-
assignee: Filter by assignee username. Use 'none' for unassigned issues, '*' for assigned issues
|
170
|
-
labels: Comma-separated string of label names to filter by (e.g., 'bug,ui,@high')
|
171
|
-
per_page: Number of results per page (max 100). Defaults to 30
|
172
|
-
page: Page number for pagination. Defaults to 1
|
173
|
-
|
174
|
-
Returns:
|
175
|
-
List of dictionaries containing issue data from the GitHub API response
|
176
|
-
|
177
|
-
Raises:
|
178
|
-
HTTPError: When the GitHub API request fails (e.g., invalid repository name, authentication failure)
|
179
|
-
RequestException: When there are network connectivity issues or other request-related problems
|
180
|
-
|
181
|
-
Tags:
|
182
|
-
list, issues, github, api, read, filter, pagination, important, project-management
|
183
|
-
"""
|
184
|
-
repo_full_name = repo_full_name.strip()
|
185
|
-
url = f"{self.base_api_url}/{repo_full_name}/issues"
|
186
|
-
params = {"state": state, "per_page": per_page, "page": page}
|
187
|
-
if assignee:
|
188
|
-
params["assignee"] = assignee
|
189
|
-
if labels:
|
190
|
-
params["labels"] = labels
|
191
|
-
response = self._get(url, params=params)
|
192
|
-
response.raise_for_status()
|
193
|
-
return response.json()
|
194
|
-
|
195
|
-
def get_pull_request(self, repo_full_name: str, pull_number: int) -> str:
|
196
|
-
"""
|
197
|
-
Retrieves and formats detailed information about a specific GitHub pull request from a repository
|
198
|
-
|
199
|
-
Args:
|
200
|
-
repo_full_name: The full repository name in 'owner/repo' format (e.g., 'octocat/Hello-World')
|
201
|
-
pull_number: The numeric identifier of the pull request to retrieve
|
202
|
-
|
203
|
-
Returns:
|
204
|
-
A formatted string containing pull request details including title, creator, status, and description
|
205
|
-
|
206
|
-
Raises:
|
207
|
-
HTTPError: Raised when the GitHub API request fails (e.g., invalid repository name, non-existent PR number, or authentication issues)
|
208
|
-
RequestException: Raised when there are network connectivity issues or other request-related problems
|
209
|
-
|
210
|
-
Tags:
|
211
|
-
get, read, github, pull-request, api, fetch, format, important
|
212
|
-
"""
|
213
|
-
repo_full_name = repo_full_name.strip()
|
214
|
-
url = f"{self.base_api_url}/{repo_full_name}/pulls/{pull_number}"
|
215
|
-
response = self._get(url)
|
216
|
-
response.raise_for_status()
|
217
|
-
pr = response.json()
|
218
|
-
pr_title = pr.get("title", "No Title")
|
219
|
-
pr_number = pr.get("number", "Unknown")
|
220
|
-
pr_state = pr.get("state", "Unknown")
|
221
|
-
pr_user = pr.get("user", {}).get("login", "Unknown")
|
222
|
-
pr_body = pr.get("body", "No description provided.")
|
223
|
-
result = (
|
224
|
-
f"Pull Request #{pr_number}: {pr_title}\n"
|
225
|
-
f"Created by: {pr_user}\n"
|
226
|
-
f"Status: {pr_state}\n"
|
227
|
-
f"Description: {pr_body}\n"
|
228
|
-
)
|
229
|
-
return result
|
230
|
-
|
231
|
-
def create_pull_request(
|
232
|
-
self,
|
233
|
-
repo_full_name: str,
|
234
|
-
head: str,
|
235
|
-
base: str,
|
236
|
-
title: str = None,
|
237
|
-
body: str = None,
|
238
|
-
issue: int = None,
|
239
|
-
maintainer_can_modify: bool = True,
|
240
|
-
draft: bool = False,
|
241
|
-
) -> dict[str, Any]:
|
242
|
-
"""
|
243
|
-
Creates a new pull request in a GitHub repository, optionally converting an existing issue into a pull request.
|
244
|
-
|
245
|
-
Args:
|
246
|
-
repo_full_name: The full name of the repository (e.g. 'owner/repo')
|
247
|
-
head: The name of the branch where your changes are implemented
|
248
|
-
base: The name of the branch you want the changes pulled into
|
249
|
-
title: The title of the new pull request (required if issue is not specified)
|
250
|
-
body: The contents of the pull request
|
251
|
-
issue: An issue number to convert to a pull request. If specified, the issue's title, body, and comments will be used
|
252
|
-
maintainer_can_modify: Indicates whether maintainers can modify the pull request
|
253
|
-
draft: Indicates whether the pull request is a draft
|
254
|
-
|
255
|
-
Returns:
|
256
|
-
A dictionary containing the complete GitHub API response
|
257
|
-
|
258
|
-
Raises:
|
259
|
-
ValueError: Raised when neither 'title' nor 'issue' parameter is specified
|
260
|
-
HTTPError: Raised when the GitHub API request fails
|
261
|
-
|
262
|
-
Tags:
|
263
|
-
create, pull-request, github, api, write, important
|
264
|
-
"""
|
265
|
-
repo_full_name = repo_full_name.strip()
|
266
|
-
url = f"{self.base_api_url}/{repo_full_name}/pulls"
|
267
|
-
pull_request_data = {
|
268
|
-
"head": head,
|
269
|
-
"base": base,
|
270
|
-
"maintainer_can_modify": maintainer_can_modify,
|
271
|
-
"draft": draft,
|
272
|
-
}
|
273
|
-
if issue is not None:
|
274
|
-
pull_request_data["issue"] = issue
|
275
|
-
else:
|
276
|
-
if title is None:
|
277
|
-
raise ValueError("Either 'title' or 'issue' must be specified")
|
278
|
-
pull_request_data["title"] = title
|
279
|
-
if body is not None:
|
280
|
-
pull_request_data["body"] = body
|
281
|
-
response = self._post(url, pull_request_data)
|
282
|
-
response.raise_for_status()
|
283
|
-
return response.json()
|
284
|
-
|
285
|
-
def create_issue(
|
286
|
-
self, repo_full_name: str, title: str, body: str = "", labels=None
|
287
|
-
) -> str:
|
288
|
-
"""
|
289
|
-
Creates a new issue in a specified GitHub repository with a title, body content, and optional labels.
|
290
|
-
|
291
|
-
Args:
|
292
|
-
repo_full_name: The full name of the repository in 'owner/repo' format
|
293
|
-
title: The title of the issue
|
294
|
-
body: The contents/description of the issue (defaults to empty string)
|
295
|
-
labels: Labels to associate with the issue, as a comma-separated string or list. Only users with push access can set labels
|
296
|
-
|
297
|
-
Returns:
|
298
|
-
A string containing a confirmation message with the issue number, title, and URL
|
299
|
-
|
300
|
-
Raises:
|
301
|
-
HTTPError: When the GitHub API request fails (e.g., invalid repository name, authentication issues, or insufficient permissions)
|
302
|
-
|
303
|
-
Tags:
|
304
|
-
create, issues, github, api, project-management, write, important
|
305
|
-
"""
|
306
|
-
repo_full_name = repo_full_name.strip()
|
307
|
-
url = f"{self.base_api_url}/{repo_full_name}/issues"
|
308
|
-
issue_data = {"title": title, "body": body}
|
309
|
-
if labels:
|
310
|
-
if isinstance(labels, str):
|
311
|
-
labels_list = [
|
312
|
-
label.strip() for label in labels.split(",") if label.strip()
|
313
|
-
]
|
314
|
-
issue_data["labels"] = labels_list
|
315
|
-
else:
|
316
|
-
issue_data["labels"] = labels
|
317
|
-
response = self._post(url, issue_data)
|
318
|
-
response.raise_for_status()
|
319
|
-
issue = response.json()
|
320
|
-
issue_number = issue.get("number", "Unknown")
|
321
|
-
issue_url = issue.get("html_url", "")
|
322
|
-
return (
|
323
|
-
f"Successfully created issue #{issue_number}:\n"
|
324
|
-
f"Title: {title}\n"
|
325
|
-
f"URL: {issue_url}"
|
326
|
-
)
|
327
|
-
|
328
|
-
def list_repo_activities(
|
329
|
-
self, repo_full_name: str, direction: str = "desc", per_page: int = 30
|
330
|
-
) -> str:
|
331
|
-
"""
|
332
|
-
Retrieves and formats a list of activities for a specified GitHub repository.
|
333
|
-
|
334
|
-
Args:
|
335
|
-
repo_full_name: The full name of the repository in 'owner/repo' format
|
336
|
-
direction: The sort direction for results ('asc' or 'desc'). Defaults to 'desc'
|
337
|
-
per_page: Number of activities to return per page (1-100). Defaults to 30
|
338
|
-
|
339
|
-
Returns:
|
340
|
-
A formatted string containing a list of repository activities, including timestamps and actor names. Returns a 'No activities' message if no activities are found.
|
341
|
-
|
342
|
-
Raises:
|
343
|
-
HTTPError: Raised when the GitHub API request fails
|
344
|
-
ValueError: May be raised if repo_full_name is invalid or empty after stripping
|
345
|
-
|
346
|
-
Tags:
|
347
|
-
list, activity, github, read, events, api, query, format
|
348
|
-
"""
|
349
|
-
repo_full_name = repo_full_name.strip()
|
350
|
-
url = f"{self.base_api_url}/{repo_full_name}/activity"
|
351
|
-
params = {"direction": direction, "per_page": per_page}
|
352
|
-
response = self._get(url, params=params)
|
353
|
-
response.raise_for_status()
|
354
|
-
activities = response.json()
|
355
|
-
if not activities:
|
356
|
-
return f"No activities found for repository {repo_full_name}"
|
357
|
-
result = f"Repository activities for {repo_full_name}:\n\n"
|
358
|
-
for activity in activities:
|
359
|
-
# Extract common fields
|
360
|
-
timestamp = activity.get("timestamp", "Unknown time")
|
361
|
-
actor_name = "Unknown user"
|
362
|
-
if "actor" in activity and activity["actor"]:
|
363
|
-
actor_name = activity["actor"].get("login", "Unknown user")
|
364
|
-
|
365
|
-
# Create a simple description of the activity
|
366
|
-
result += f"- {actor_name} performed an activity at {timestamp}\n"
|
367
|
-
return result
|
368
|
-
|
369
|
-
def update_issue(
|
370
|
-
self,
|
371
|
-
repo_full_name: str,
|
372
|
-
issue_number: int,
|
373
|
-
title: str = None,
|
374
|
-
body: str = None,
|
375
|
-
assignee: str = None,
|
376
|
-
state: str = None,
|
377
|
-
state_reason: str = None,
|
378
|
-
) -> dict[str, Any]:
|
379
|
-
"""
|
380
|
-
Updates an existing GitHub issue with specified parameters including title, body, assignee, state, and state reason.
|
381
|
-
|
382
|
-
Args:
|
383
|
-
repo_full_name: The full name of the repository in 'owner/repo' format
|
384
|
-
issue_number: The unique identifier number of the issue to update
|
385
|
-
title: The new title of the issue (optional)
|
386
|
-
body: The new content/description of the issue (optional)
|
387
|
-
assignee: GitHub username to assign to the issue (optional)
|
388
|
-
state: The desired state of the issue ('open' or 'closed') (optional)
|
389
|
-
state_reason: The reason for state change ('completed', 'not_planned', 'reopened', or null) (optional)
|
390
|
-
|
391
|
-
Returns:
|
392
|
-
A dictionary containing the complete GitHub API response with updated issue details
|
393
|
-
|
394
|
-
Raises:
|
395
|
-
HTTPError: Raised when the GitHub API request fails (e.g., invalid repository, non-existent issue, insufficient permissions)
|
396
|
-
RequestException: Raised when there's a network error or API connectivity issue
|
397
|
-
|
398
|
-
Tags:
|
399
|
-
github, issues, update, api, project-management, write, important
|
400
|
-
"""
|
401
|
-
url = f"{self.base_api_url}/{repo_full_name}/issues/{issue_number}"
|
402
|
-
update_data = {}
|
403
|
-
if title is not None:
|
404
|
-
update_data["title"] = title
|
405
|
-
if body is not None:
|
406
|
-
update_data["body"] = body
|
407
|
-
if assignee is not None:
|
408
|
-
update_data["assignee"] = assignee
|
409
|
-
if state is not None:
|
410
|
-
update_data["state"] = state
|
411
|
-
if state_reason is not None:
|
412
|
-
update_data["state_reason"] = state_reason
|
413
|
-
response = self._patch(url, update_data)
|
414
|
-
response.raise_for_status()
|
415
|
-
return response.json()
|
416
|
-
|
417
|
-
def list_tools(self):
|
418
|
-
return [
|
419
|
-
self.star_repository,
|
420
|
-
self.list_commits,
|
421
|
-
self.list_branches,
|
422
|
-
self.list_pull_requests,
|
423
|
-
self.list_issues,
|
424
|
-
self.get_pull_request,
|
425
|
-
self.create_pull_request,
|
426
|
-
self.create_issue,
|
427
|
-
self.update_issue,
|
428
|
-
self.list_repo_activities,
|
429
|
-
]
|
@@ -1,88 +0,0 @@
|
|
1
|
-
|
2
|
-
# Gong MCP Server
|
3
|
-
|
4
|
-
An MCP Server for the Gong 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 Gong 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
|
-
| list_calls | Retrieves a list of call records within the specified date range, with optional pagination and workspace filtering. |
|
25
|
-
| add_call | Creates and submits a new call record with detailed metadata to the remote service. |
|
26
|
-
| get_call | Retrieves details for a specific call by its identifier. |
|
27
|
-
| list_calls_extensive | Retrieves a list of extensive call records matching the specified filter criteria, with optional pagination and content selection. |
|
28
|
-
| get_permission_profile | Retrieve the details of a permission profile by its profile ID. |
|
29
|
-
| update_permission_profile | Updates an existing permission profile with the specified access settings and permissions. |
|
30
|
-
| create_permission_profile | Creates a new permission profile in the specified workspace with customizable access and permission settings. |
|
31
|
-
| update_meeting | Updates the details of an existing meeting with new information such as time, invitees, and title. |
|
32
|
-
| delete_meeting | Deletes a meeting by its ID, optionally specifying the organizer's email. |
|
33
|
-
| content_viewed | Reports a content view event to the customer engagement system with detailed metadata about the event and content. |
|
34
|
-
| content_shared | Reports a content sharing event to the customer engagement system with detailed metadata about the shared content, sharer, and recipients. |
|
35
|
-
| custom_action | Submits a custom customer engagement action event with detailed reporting and context information to the server. |
|
36
|
-
| list_generic_crm_integration | Retrieves a list of generic CRM integrations from the API. |
|
37
|
-
| register_generic_crm_integration | Registers a generic CRM integration for a given owner email and integration name. |
|
38
|
-
| delete_generic_crm_integration | Deletes a generic CRM integration using the provided integration and client request IDs. |
|
39
|
-
| add_users_access_to_calls | Updates user access permissions for calls by sending a PUT request with the specified access list. |
|
40
|
-
| get_users_access_to_calls | Retrieves user access information for calls based on the provided filter criteria. |
|
41
|
-
| delete_users_access_to_calls | Deletes a list of users' access permissions to calls. |
|
42
|
-
| list_multiple_users | Retrieves a list of users based on a provided filter and optional pagination cursor. |
|
43
|
-
| list_interaction_stats | Retrieves interaction statistics based on specified filter criteria, with optional pagination support. |
|
44
|
-
| list_answered_scorecards | Retrieves a paginated list of answered scorecards based on the provided filter criteria. |
|
45
|
-
| list_multiple_users_day_by_day_activity | Retrieves day-by-day activity statistics for multiple users based on a provided filter. |
|
46
|
-
| list_multiple_users_aggregate_activity | Aggregates and returns activity statistics for multiple users based on specified filters. |
|
47
|
-
| list_multiple_users_aggregate_by_period | Aggregates activity statistics for multiple users over a specified period using given filter criteria. |
|
48
|
-
| add_meeting | Creates a new meeting with the specified details and returns the server's response as a dictionary. |
|
49
|
-
| integration_status | Retrieves the integration status for specified email addresses via the meetings API. |
|
50
|
-
| integration_settings | Sends integration type settings to the integration settings API endpoint and returns the server's response as a dictionary. |
|
51
|
-
| get_flows_for_prospects | Fetches flow data for the specified CRM prospect IDs from the API. |
|
52
|
-
| assign_prospects | Assigns a list of CRM prospect IDs to a specified flow instance and owner via an API POST request. |
|
53
|
-
| add_digital_interaction | Submits a digital interaction event record to the API with required metadata and content. |
|
54
|
-
| purge_phone_number | Erases all data associated with the specified phone number via the data privacy API. |
|
55
|
-
| purge_email_address | Permanently erases all data associated with the specified email address from the system. |
|
56
|
-
| list_crm_schema_fields | Retrieves the schema fields for a specified CRM object type associated with a given integration. |
|
57
|
-
| upload_crm_schema_field | Uploads CRM entity schema fields to the integration service for the specified CRM object type. |
|
58
|
-
| get_crm_objects | Retrieves CRM objects by their CRM IDs from a specified integration and object type. |
|
59
|
-
| get_call_transcripts | Retrieves call transcripts based on the specified filter and optional pagination cursor. |
|
60
|
-
| list_workspaces | Retrieves a list of all available workspaces from the API. |
|
61
|
-
| list_users | Retrieves a paginated list of users from the API, with optional filtering by cursor and inclusion of avatar data. |
|
62
|
-
| get_user | Retrieves user information by user ID from the API. |
|
63
|
-
| get_user_history | Retrieves the settings history for a specific user by user ID. |
|
64
|
-
| list_trackers | Retrieves a list of trackers for the specified workspace from the API. |
|
65
|
-
| list_scorecards | Retrieves a list of scorecard settings from the API. |
|
66
|
-
| list_permission_profile_users | Retrieves a list of users associated with a specified permission profile. |
|
67
|
-
| list_logs | Retrieves a list of logs for the specified log type and time range, with optional cursor-based pagination. |
|
68
|
-
| get_library_structure | Retrieves the hierarchical structure of library folders, optionally filtered by workspace ID. |
|
69
|
-
| get_calls_in_specific_folder | Retrieves the list of calls contained within a specified folder from the remote library API. |
|
70
|
-
| list_flows | Retrieves a list of flows owned by the specified user, with optional pagination and workspace filtering. |
|
71
|
-
| find_all_references_to_phone_number | Fetches all references to a specified phone number from the data privacy API. |
|
72
|
-
| find_all_references_to_email_address | Finds and returns all data references associated with a given email address. |
|
73
|
-
| get_request_status | Retrieves the status of a CRM request using the provided integration and client request IDs. |
|
74
|
-
| list_crmcalls_manual_association | Retrieves a list of manually associated CRM call records, with optional filtering by date and pagination. |
|
75
|
-
| list_permission_profile | Retrieves the list of permission profiles for the specified workspace. |
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
## Usage
|
80
|
-
|
81
|
-
- Login to AgentR
|
82
|
-
- Follow the quickstart guide to setup MCP Server for your client
|
83
|
-
- Visit Apps Store and enable the Gong app
|
84
|
-
- Restart the MCP Server
|
85
|
-
|
86
|
-
### Local Development
|
87
|
-
|
88
|
-
- Follow the README to test with the local MCP Server
|
File without changes
|