@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.
@@ -9,146 +9,222 @@ const axios_1 = __importDefault(require("axios"));
9
9
  class GitPullsTool {
10
10
  constructor() {
11
11
  this.name = 'git-pulls';
12
- this.description = 'Pull request management for GitHub and Gitea';
12
+ this.description = 'Pull request management for GitHub and Gitea - automatic dual-provider execution';
13
13
  }
14
14
  async handle(params, ctx) {
15
15
  const action = params.action;
16
- const provider = params.provider;
17
16
  if (!action)
18
17
  throw new errors_1.MCPError('VALIDATION_ERROR', 'action is required');
19
- if (!provider)
20
- throw new errors_1.MCPError('VALIDATION_ERROR', 'provider is required');
21
- const owner = params.owner || process.env.GITHUB_USERNAME || process.env.GITEA_USERNAME;
18
+ const githubOwner = params.owner || process.env.GITHUB_USERNAME;
19
+ const giteaOwner = params.owner || process.env.GITEA_USERNAME;
22
20
  const repo = params.repo;
23
21
  switch (action) {
24
22
  case 'create': {
25
23
  if (!params.title || !params.head || !params.base) {
26
24
  throw new errors_1.MCPError('VALIDATION_ERROR', 'title, head, and base are required');
27
25
  }
28
- if (provider === 'github' && ctx.providerManager.github) {
29
- const result = await ctx.providerManager.github.rest.pulls.create({
30
- owner: owner,
31
- repo: repo,
32
- title: params.title,
33
- head: params.head,
34
- base: params.base,
35
- body: params.body,
36
- });
37
- return { success: true, pull: result.data };
38
- }
39
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
40
- const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls`, {
41
- title: params.title,
42
- head: params.head,
43
- base: params.base,
44
- body: params.body,
45
- }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
46
- return { success: true, pull: result.data };
47
- }
48
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
26
+ const results = { success: true, providers: {} };
27
+ // GitHub
28
+ if (ctx.providerManager.github) {
29
+ try {
30
+ const result = await ctx.providerManager.github.rest.pulls.create({
31
+ owner: githubOwner,
32
+ repo: repo,
33
+ title: params.title,
34
+ head: params.head,
35
+ base: params.base,
36
+ body: params.body,
37
+ });
38
+ results.providers.github = { success: true, pull: result.data };
39
+ }
40
+ catch (err) {
41
+ results.providers.github = { success: false, error: err.message };
42
+ }
43
+ }
44
+ // Gitea
45
+ if (ctx.providerManager.giteaBaseUrl) {
46
+ try {
47
+ const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls`, {
48
+ title: params.title,
49
+ head: params.head,
50
+ base: params.base,
51
+ body: params.body,
52
+ }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
53
+ results.providers.gitea = { success: true, pull: result.data };
54
+ }
55
+ catch (err) {
56
+ results.providers.gitea = { success: false, error: err.message };
57
+ }
58
+ }
59
+ return results;
49
60
  }
50
61
  case 'list': {
51
- if (provider === 'github' && ctx.providerManager.github) {
52
- const result = await ctx.providerManager.github.rest.pulls.list({
53
- owner: owner,
54
- repo: repo,
55
- state: params.state_filter || 'open',
56
- sort: params.sort || 'created',
57
- direction: params.direction || 'desc',
58
- });
59
- return { success: true, pulls: result.data };
60
- }
61
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
62
- const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls`, {
63
- params: { state: params.state_filter || 'open' },
64
- headers: { Authorization: `token ${ctx.providerManager.giteaToken}` }
65
- });
66
- return { success: true, pulls: result.data };
67
- }
68
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
62
+ const results = { success: true, providers: {} };
63
+ // GitHub
64
+ if (ctx.providerManager.github) {
65
+ try {
66
+ const result = await ctx.providerManager.github.rest.pulls.list({
67
+ owner: githubOwner,
68
+ repo: repo,
69
+ state: params.state_filter || 'open',
70
+ sort: params.sort || 'created',
71
+ direction: params.direction || 'desc',
72
+ });
73
+ results.providers.github = { success: true, pulls: result.data };
74
+ }
75
+ catch (err) {
76
+ results.providers.github = { success: false, error: err.message };
77
+ }
78
+ }
79
+ // Gitea
80
+ if (ctx.providerManager.giteaBaseUrl) {
81
+ try {
82
+ const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls`, {
83
+ params: { state: params.state_filter || 'open' },
84
+ headers: { Authorization: `token ${ctx.providerManager.giteaToken}` }
85
+ });
86
+ results.providers.gitea = { success: true, pulls: result.data };
87
+ }
88
+ catch (err) {
89
+ results.providers.gitea = { success: false, error: err.message };
90
+ }
91
+ }
92
+ return results;
69
93
  }
70
94
  case 'get': {
71
95
  const pull_number = params.pull_number;
72
96
  if (!pull_number)
73
97
  throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
74
- if (provider === 'github' && ctx.providerManager.github) {
75
- const result = await ctx.providerManager.github.rest.pulls.get({
76
- owner: owner,
77
- repo: repo,
78
- pull_number,
79
- });
80
- return { success: true, pull: result.data };
81
- }
82
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
83
- const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls/${pull_number}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
84
- return { success: true, pull: result.data };
85
- }
86
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
98
+ const results = { success: true, providers: {} };
99
+ // GitHub
100
+ if (ctx.providerManager.github) {
101
+ try {
102
+ const result = await ctx.providerManager.github.rest.pulls.get({
103
+ owner: githubOwner,
104
+ repo: repo,
105
+ pull_number,
106
+ });
107
+ results.providers.github = { success: true, pull: 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/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
117
+ results.providers.gitea = { success: true, pull: result.data };
118
+ }
119
+ catch (err) {
120
+ results.providers.gitea = { success: false, error: err.message };
121
+ }
122
+ }
123
+ return results;
87
124
  }
88
125
  case 'update': {
89
126
  const pull_number = params.pull_number;
90
127
  if (!pull_number)
91
128
  throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
92
- if (provider === 'github' && ctx.providerManager.github) {
93
- const result = await ctx.providerManager.github.rest.pulls.update({
94
- owner: owner,
95
- repo: repo,
96
- pull_number,
97
- title: params.title,
98
- body: params.body,
99
- state: params.state,
100
- });
101
- return { success: true, pull: result.data };
102
- }
103
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
104
- const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls/${pull_number}`, { title: params.title, body: params.body }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
105
- return { success: true, pull: result.data };
106
- }
107
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
129
+ const results = { success: true, providers: {} };
130
+ // GitHub
131
+ if (ctx.providerManager.github) {
132
+ try {
133
+ const result = await ctx.providerManager.github.rest.pulls.update({
134
+ owner: githubOwner,
135
+ repo: repo,
136
+ pull_number,
137
+ title: params.title,
138
+ body: params.body,
139
+ state: params.state,
140
+ });
141
+ results.providers.github = { success: true, pull: result.data };
142
+ }
143
+ catch (err) {
144
+ results.providers.github = { success: false, error: err.message };
145
+ }
146
+ }
147
+ // Gitea
148
+ if (ctx.providerManager.giteaBaseUrl) {
149
+ try {
150
+ const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { title: params.title, body: params.body }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
151
+ results.providers.gitea = { success: true, pull: result.data };
152
+ }
153
+ catch (err) {
154
+ results.providers.gitea = { success: false, error: err.message };
155
+ }
156
+ }
157
+ return results;
108
158
  }
109
159
  case 'merge': {
110
160
  const pull_number = params.pull_number;
111
161
  if (!pull_number)
112
162
  throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
113
- if (provider === 'github' && ctx.providerManager.github) {
114
- const result = await ctx.providerManager.github.rest.pulls.merge({
115
- owner: owner,
116
- repo: repo,
117
- pull_number,
118
- commit_title: params.commit_title,
119
- commit_message: params.commit_message,
120
- merge_method: params.merge_method || 'merge',
121
- });
122
- return { success: true, merged: result.data };
123
- }
124
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
125
- const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls/${pull_number}/merge`, {
126
- Do: params.merge_method || 'merge',
127
- MergeTitleField: params.commit_title,
128
- MergeMessageField: params.commit_message,
129
- }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
130
- return { success: true, merged: result.data };
131
- }
132
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
163
+ const results = { success: true, providers: {} };
164
+ // GitHub
165
+ if (ctx.providerManager.github) {
166
+ try {
167
+ const result = await ctx.providerManager.github.rest.pulls.merge({
168
+ owner: githubOwner,
169
+ repo: repo,
170
+ pull_number,
171
+ commit_title: params.commit_title,
172
+ commit_message: params.commit_message,
173
+ merge_method: params.merge_method || 'merge',
174
+ });
175
+ results.providers.github = { success: true, merged: 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.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}/merge`, {
185
+ Do: params.merge_method || 'merge',
186
+ MergeTitleField: params.commit_title,
187
+ MergeMessageField: params.commit_message,
188
+ }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
189
+ results.providers.gitea = { success: true, merged: result.data };
190
+ }
191
+ catch (err) {
192
+ results.providers.gitea = { success: false, error: err.message };
193
+ }
194
+ }
195
+ return results;
133
196
  }
134
197
  case 'close': {
135
198
  const pull_number = params.pull_number;
136
199
  if (!pull_number)
137
200
  throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
138
- if (provider === 'github' && ctx.providerManager.github) {
139
- const result = await ctx.providerManager.github.rest.pulls.update({
140
- owner: owner,
141
- repo: repo,
142
- pull_number,
143
- state: 'closed',
144
- });
145
- return { success: true, pull: result.data };
146
- }
147
- if (provider === 'gitea' && ctx.providerManager.giteaBaseUrl) {
148
- const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${owner}/${repo}/pulls/${pull_number}`, { state: 'closed' }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
149
- return { success: true, pull: result.data };
150
- }
151
- throw new errors_1.MCPError('PROVIDER_NOT_CONFIGURED', `Provider ${provider} is not configured`);
201
+ const results = { success: true, providers: {} };
202
+ // GitHub
203
+ if (ctx.providerManager.github) {
204
+ try {
205
+ const result = await ctx.providerManager.github.rest.pulls.update({
206
+ owner: githubOwner,
207
+ repo: repo,
208
+ pull_number,
209
+ state: 'closed',
210
+ });
211
+ results.providers.github = { success: true, pull: result.data };
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
+ const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { state: 'closed' }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
221
+ results.providers.gitea = { success: true, pull: result.data };
222
+ }
223
+ catch (err) {
224
+ results.providers.gitea = { success: false, error: err.message };
225
+ }
226
+ }
227
+ return results;
152
228
  }
153
229
  case 'review': {
154
230
  const pull_number = params.pull_number;
@@ -156,31 +232,53 @@ class GitPullsTool {
156
232
  if (!pull_number || !event) {
157
233
  throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number and event are required');
158
234
  }
159
- if (provider === 'github' && ctx.providerManager.github) {
160
- const result = await ctx.providerManager.github.rest.pulls.createReview({
161
- owner: owner,
162
- repo: repo,
163
- pull_number,
164
- event,
165
- body: params.review_body,
166
- });
167
- return { success: true, review: result.data };
168
- }
169
- throw new errors_1.MCPError('VALIDATION_ERROR', 'Review not fully implemented for Gitea');
235
+ const results = { success: true, providers: {} };
236
+ // GitHub
237
+ if (ctx.providerManager.github) {
238
+ try {
239
+ const result = await ctx.providerManager.github.rest.pulls.createReview({
240
+ owner: githubOwner,
241
+ repo: repo,
242
+ pull_number,
243
+ event,
244
+ body: params.review_body,
245
+ });
246
+ results.providers.github = { success: true, review: result.data };
247
+ }
248
+ catch (err) {
249
+ results.providers.github = { success: false, error: err.message };
250
+ }
251
+ }
252
+ // Gitea
253
+ if (ctx.providerManager.giteaBaseUrl) {
254
+ results.providers.gitea = { success: false, error: 'Review not fully implemented for Gitea' };
255
+ }
256
+ return results;
170
257
  }
171
258
  case 'search': {
172
259
  const query = params.query;
173
260
  if (!query)
174
261
  throw new errors_1.MCPError('VALIDATION_ERROR', 'query is required');
175
- if (provider === 'github' && ctx.providerManager.github) {
176
- const result = await ctx.providerManager.github.rest.search.issuesAndPullRequests({
177
- q: `${query} repo:${owner}/${repo} type:pr`,
178
- sort: params.search_sort || 'created',
179
- order: params.search_order || 'desc',
180
- });
181
- return { success: true, pulls: result.data.items };
182
- }
183
- throw new errors_1.MCPError('VALIDATION_ERROR', 'Search not fully implemented for Gitea');
262
+ const results = { success: true, providers: {} };
263
+ // GitHub
264
+ if (ctx.providerManager.github) {
265
+ try {
266
+ const result = await ctx.providerManager.github.rest.search.issuesAndPullRequests({
267
+ q: `${query} repo:${giteaOwner}/${repo} type:pr`,
268
+ sort: params.search_sort || 'created',
269
+ order: params.search_order || 'desc',
270
+ });
271
+ results.providers.github = { success: true, pulls: result.data.items };
272
+ }
273
+ catch (err) {
274
+ results.providers.github = { success: false, error: err.message };
275
+ }
276
+ }
277
+ // Gitea
278
+ if (ctx.providerManager.giteaBaseUrl) {
279
+ results.providers.gitea = { success: false, error: 'Search not fully implemented for Gitea' };
280
+ }
281
+ return results;
184
282
  }
185
283
  default:
186
284
  throw new errors_1.MCPError('VALIDATION_ERROR', `Unsupported action: ${action}`);
@@ -2,33 +2,5 @@ import { Tool, MCPContext } from '../types';
2
2
  export declare class GitReleaseTool implements Tool {
3
3
  name: string;
4
4
  description: string;
5
- handle(params: Record<string, any>, ctx: MCPContext): Promise<{
6
- success: boolean;
7
- release: any;
8
- tag?: undefined;
9
- message?: undefined;
10
- releases?: undefined;
11
- tags?: undefined;
12
- } | {
13
- success: boolean;
14
- tag: any;
15
- message: string;
16
- release?: undefined;
17
- releases?: undefined;
18
- tags?: undefined;
19
- } | {
20
- success: boolean;
21
- releases: any;
22
- release?: undefined;
23
- tag?: undefined;
24
- message?: undefined;
25
- tags?: undefined;
26
- } | {
27
- success: boolean;
28
- tags: string[];
29
- release?: undefined;
30
- tag?: undefined;
31
- message?: undefined;
32
- releases?: undefined;
33
- }>;
5
+ handle(params: Record<string, any>, ctx: MCPContext): Promise<any>;
34
6
  }