@andrebuzeli/git-mcp 5.5.2 → 5.8.0
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.
- package/README.md +69 -6
- package/dist/index.js +65 -9
- package/dist/resources/toolsGuide.d.ts +12 -0
- package/dist/resources/toolsGuide.js +1491 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.js +33 -0
- package/dist/tools/gitBranches.d.ts +2 -2
- package/dist/tools/gitBranches.js +2 -1
- package/dist/tools/gitFiles.d.ts +6 -0
- package/dist/tools/gitFiles.js +10 -8
- package/dist/tools/gitHistory.d.ts +17 -0
- package/dist/tools/gitHistory.js +365 -0
- package/dist/tools/gitIssues.d.ts +1 -16
- package/dist/tools/gitIssues.js +208 -122
- package/dist/tools/gitPulls.d.ts +1 -69
- package/dist/tools/gitPulls.js +225 -127
- package/dist/tools/gitRelease.d.ts +1 -29
- package/dist/tools/gitRelease.js +277 -55
- package/dist/tools/gitUpdate.d.ts +14 -0
- package/dist/tools/gitUpdate.js +374 -0
- package/dist/tools/gitUpload.d.ts +11 -0
- package/dist/tools/gitUpload.js +342 -0
- package/dist/tools/gitWorkflow.d.ts +1 -64
- package/dist/tools/gitWorkflow.js +224 -50
- package/dist/types.d.ts +7 -0
- package/package.json +2 -2
|
@@ -10,7 +10,7 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
10
10
|
class GitWorkflowTool {
|
|
11
11
|
constructor() {
|
|
12
12
|
this.name = 'git-workflow';
|
|
13
|
-
this.description = 'Core Git operations including init, status, commit, sync, backup, and remote operations';
|
|
13
|
+
this.description = 'Core Git operations including init, status, commit, sync, backup, and remote operations - automatic dual-provider for remote ops';
|
|
14
14
|
}
|
|
15
15
|
async handle(params, ctx) {
|
|
16
16
|
const action = params.action;
|
|
@@ -62,65 +62,239 @@ class GitWorkflowTool {
|
|
|
62
62
|
return { success: true, backupPath, message: 'Backup marked (simplified)' };
|
|
63
63
|
}
|
|
64
64
|
case 'create': {
|
|
65
|
-
const provider = params.provider;
|
|
66
65
|
const name = params.name;
|
|
67
|
-
if (!
|
|
68
|
-
throw new errors_1.MCPError('VALIDATION_ERROR', '
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
66
|
+
if (!name)
|
|
67
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'name is required');
|
|
68
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
69
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
70
|
+
const results = { success: true, providers: {} };
|
|
71
|
+
// GitHub
|
|
72
|
+
if (ctx.providerManager.github) {
|
|
73
|
+
try {
|
|
74
|
+
const result = await ctx.providerManager.github.rest.repos.createForAuthenticatedUser({
|
|
75
|
+
name,
|
|
76
|
+
description: params.description,
|
|
77
|
+
private: params.private || false,
|
|
78
|
+
});
|
|
79
|
+
results.providers.github = { success: true, repo: result.data };
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
results.providers.github = { success: false, error: err.message };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Gitea
|
|
86
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
87
|
+
try {
|
|
88
|
+
const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/user/repos`, {
|
|
89
|
+
name,
|
|
90
|
+
description: params.description,
|
|
91
|
+
private: params.private || false,
|
|
92
|
+
}, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
93
|
+
results.providers.gitea = { success: true, repo: result.data };
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
87
100
|
}
|
|
88
101
|
case 'list': {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
102
|
+
const results = { success: true, providers: {} };
|
|
103
|
+
// GitHub
|
|
104
|
+
if (ctx.providerManager.github) {
|
|
105
|
+
try {
|
|
106
|
+
const result = await ctx.providerManager.github.rest.repos.listForAuthenticatedUser();
|
|
107
|
+
results.providers.github = { success: true, repos: result.data };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
results.providers.github = { success: false, error: err.message };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Gitea
|
|
114
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
115
|
+
try {
|
|
116
|
+
const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/user/repos`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
117
|
+
results.providers.gitea = { success: true, repos: result.data };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return results;
|
|
101
124
|
}
|
|
102
125
|
case 'get': {
|
|
103
|
-
const
|
|
104
|
-
const
|
|
126
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
127
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
128
|
+
const repo = params.repo;
|
|
129
|
+
if (!githubOwner || !repo) {
|
|
130
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'owner and repo are required');
|
|
131
|
+
}
|
|
132
|
+
const results = { success: true, providers: {} };
|
|
133
|
+
// GitHub
|
|
134
|
+
if (ctx.providerManager.github) {
|
|
135
|
+
try {
|
|
136
|
+
const result = await ctx.providerManager.github.rest.repos.get({ owner: githubOwner, repo });
|
|
137
|
+
results.providers.github = { success: true, repo: result.data };
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
results.providers.github = { success: false, error: err.message };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Gitea
|
|
144
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
145
|
+
try {
|
|
146
|
+
const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
147
|
+
results.providers.gitea = { success: true, repo: result.data };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return results;
|
|
154
|
+
}
|
|
155
|
+
case 'update': {
|
|
156
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
157
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
158
|
+
const repo = params.repo;
|
|
159
|
+
if (!githubOwner || !repo) {
|
|
160
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'owner and repo are required');
|
|
161
|
+
}
|
|
162
|
+
const results = { success: true, providers: {} };
|
|
163
|
+
// GitHub
|
|
164
|
+
if (ctx.providerManager.github) {
|
|
165
|
+
try {
|
|
166
|
+
const result = await ctx.providerManager.github.rest.repos.update({
|
|
167
|
+
owner: githubOwner,
|
|
168
|
+
repo,
|
|
169
|
+
description: params.description,
|
|
170
|
+
private: params.private,
|
|
171
|
+
has_issues: params.has_issues,
|
|
172
|
+
has_projects: params.has_projects,
|
|
173
|
+
has_wiki: params.has_wiki,
|
|
174
|
+
});
|
|
175
|
+
results.providers.github = { success: true, repo: result.data };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
results.providers.github = { success: false, error: err.message };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Gitea
|
|
182
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
183
|
+
try {
|
|
184
|
+
const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}`, {
|
|
185
|
+
description: params.description,
|
|
186
|
+
private: params.private,
|
|
187
|
+
has_issues: params.has_issues,
|
|
188
|
+
has_projects: params.has_projects,
|
|
189
|
+
has_wiki: params.has_wiki,
|
|
190
|
+
}, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
191
|
+
results.providers.gitea = { success: true, repo: result.data };
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return results;
|
|
198
|
+
}
|
|
199
|
+
case 'delete': {
|
|
200
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
201
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
105
202
|
const repo = params.repo;
|
|
106
|
-
if (!
|
|
107
|
-
throw new errors_1.MCPError('VALIDATION_ERROR', '
|
|
203
|
+
if (!githubOwner || !repo) {
|
|
204
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'owner and repo are required');
|
|
108
205
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
206
|
+
const results = { success: true, providers: {} };
|
|
207
|
+
// GitHub
|
|
208
|
+
if (ctx.providerManager.github) {
|
|
209
|
+
try {
|
|
210
|
+
await ctx.providerManager.github.rest.repos.delete({ owner: githubOwner, repo });
|
|
211
|
+
results.providers.github = { success: true, deleted: true };
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
results.providers.github = { success: false, error: err.message };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Gitea
|
|
218
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
219
|
+
try {
|
|
220
|
+
await axios_1.default.delete(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
221
|
+
results.providers.gitea = { success: true, deleted: true };
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return results;
|
|
228
|
+
}
|
|
229
|
+
case 'fork': {
|
|
230
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
231
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
232
|
+
const repo = params.repo;
|
|
233
|
+
if (!githubOwner || !repo) {
|
|
234
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'owner and repo are required');
|
|
235
|
+
}
|
|
236
|
+
const results = { success: true, providers: {} };
|
|
237
|
+
// GitHub
|
|
238
|
+
if (ctx.providerManager.github) {
|
|
239
|
+
try {
|
|
240
|
+
const result = await ctx.providerManager.github.rest.repos.createFork({
|
|
241
|
+
owner: githubOwner,
|
|
242
|
+
repo,
|
|
243
|
+
organization: params.organization,
|
|
244
|
+
});
|
|
245
|
+
results.providers.github = { success: true, fork: result.data };
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
results.providers.github = { success: false, error: err.message };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Gitea
|
|
252
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
253
|
+
try {
|
|
254
|
+
const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/forks`, { organization: params.organization }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
255
|
+
results.providers.gitea = { success: true, fork: result.data };
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return results;
|
|
262
|
+
}
|
|
263
|
+
case 'search': {
|
|
264
|
+
const query = params.query;
|
|
265
|
+
if (!query)
|
|
266
|
+
throw new errors_1.MCPError('VALIDATION_ERROR', 'query is required');
|
|
267
|
+
const results = { success: true, providers: {} };
|
|
268
|
+
// GitHub
|
|
269
|
+
if (ctx.providerManager.github) {
|
|
270
|
+
try {
|
|
271
|
+
const result = await ctx.providerManager.github.rest.search.repos({
|
|
272
|
+
q: query,
|
|
273
|
+
sort: params.sort,
|
|
274
|
+
order: params.order,
|
|
275
|
+
per_page: params.limit || 30,
|
|
276
|
+
});
|
|
277
|
+
results.providers.github = { success: true, repos: result.data.items, total: result.data.total_count };
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
results.providers.github = { success: false, error: err.message };
|
|
281
|
+
}
|
|
112
282
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
283
|
+
// Gitea
|
|
284
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
285
|
+
try {
|
|
286
|
+
const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/search`, {
|
|
287
|
+
params: { q: query, limit: params.limit || 30, sort: params.sort },
|
|
288
|
+
headers: { Authorization: `token ${ctx.providerManager.giteaToken}` }
|
|
289
|
+
});
|
|
290
|
+
results.providers.gitea = { success: true, repos: result.data.data, total: result.data.ok ? result.data.data.length : 0 };
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
294
|
+
}
|
|
116
295
|
}
|
|
117
|
-
|
|
296
|
+
return results;
|
|
118
297
|
}
|
|
119
|
-
case 'update':
|
|
120
|
-
case 'delete':
|
|
121
|
-
case 'fork':
|
|
122
|
-
case 'search':
|
|
123
|
-
throw new errors_1.MCPError('NOT_IMPLEMENTED', `Action ${action} not yet fully implemented`);
|
|
124
298
|
default:
|
|
125
299
|
throw new errors_1.MCPError('VALIDATION_ERROR', `Unsupported action: ${action}`);
|
|
126
300
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,3 +8,10 @@ export interface Tool {
|
|
|
8
8
|
description?: string;
|
|
9
9
|
handle(params: Record<string, any>, ctx: MCPContext): Promise<ToolHandleResult>;
|
|
10
10
|
}
|
|
11
|
+
export interface Resource {
|
|
12
|
+
uri: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
mimeType: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrebuzeli/git-mcp",
|
|
3
|
-
"version": "5.
|
|
4
|
-
"description": "Professional MCP server for Git operations
|
|
3
|
+
"version": "5.8.0",
|
|
4
|
+
"description": "Professional MCP server for Git operations - automatic dual-provider execution (GitHub + Gitea), no provider parameter needed, organized responses by provider, enhanced security and safety features",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|