@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.
@@ -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 (!provider || !name)
68
- throw new errors_1.MCPError('VALIDATION_ERROR', 'provider and name are required');
69
- const owner = params.owner || process.env.GITHUB_USERNAME || process.env.GITEA_USERNAME;
70
- if (provider === 'github' && ctx.providerManager.github) {
71
- const result = await ctx.providerManager.github.rest.repos.createForAuthenticatedUser({
72
- name,
73
- description: params.description,
74
- private: params.private || false,
75
- });
76
- return { success: true, repo: result.data };
77
- }
78
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
79
- const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/user/repos`, {
80
- name,
81
- description: params.description,
82
- private: params.private || false,
83
- }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
84
- return { success: true, repo: result.data };
85
- }
86
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
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 provider = params.provider;
90
- if (!provider)
91
- throw new errors_1.MCPError('VALIDATION_ERROR', 'provider is required');
92
- if (provider === 'github' && ctx.providerManager.github) {
93
- const result = await ctx.providerManager.github.rest.repos.listForAuthenticatedUser();
94
- return { success: true, repos: result.data };
95
- }
96
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
97
- const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/user/repos`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
98
- return { success: true, repos: result.data };
99
- }
100
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
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 provider = params.provider;
104
- const owner = params.owner;
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 (!provider || !owner || !repo) {
107
- throw new errors_1.MCPError('VALIDATION_ERROR', 'provider, owner, and repo are required');
203
+ if (!githubOwner || !repo) {
204
+ throw new errors_1.MCPError('VALIDATION_ERROR', 'owner and repo are required');
108
205
  }
109
- if (provider === 'github' && ctx.providerManager.github) {
110
- const result = await ctx.providerManager.github.rest.repos.get({ owner, repo });
111
- return { success: true, repo: result.data };
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
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
114
- const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
115
- return { success: true, repo: result.data };
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
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
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.5.2",
4
- "description": "Professional MCP server for Git operations with Universal Mode - automatic multi-provider support (GitHub + Gitea), enhanced security, and comprehensive safety features",
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": {