bitbucket-mcp-server 1.0.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/LICENSE +15 -0
- package/README.md +236 -0
- package/build/bitbucket-api.d.ts +163 -0
- package/build/bitbucket-api.js +230 -0
- package/build/bitbucket-api.js.map +1 -0
- package/build/bitbucket-api.test.d.ts +1 -0
- package/build/bitbucket-api.test.js +203 -0
- package/build/bitbucket-api.test.js.map +1 -0
- package/build/cache.d.ts +150 -0
- package/build/cache.js +361 -0
- package/build/cache.js.map +1 -0
- package/build/config.d.ts +102 -0
- package/build/config.js +199 -0
- package/build/config.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +790 -0
- package/build/index.js.map +1 -0
- package/build/metrics.d.ts +81 -0
- package/build/metrics.js +199 -0
- package/build/metrics.js.map +1 -0
- package/build/pipelines.d.ts +1 -0
- package/build/pipelines.js +2 -0
- package/build/pipelines.js.map +1 -0
- package/build/rate-limiting.d.ts +53 -0
- package/build/rate-limiting.js +268 -0
- package/build/rate-limiting.js.map +1 -0
- package/build/validation.d.ts +7 -0
- package/build/validation.js +40 -0
- package/build/validation.js.map +1 -0
- package/build/validation.test.d.ts +1 -0
- package/build/validation.test.js +59 -0
- package/build/validation.test.js.map +1 -0
- package/build/webhooks.d.ts +168 -0
- package/build/webhooks.js +305 -0
- package/build/webhooks.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
// Mock node-fetch using vi.hoisted to avoid hoisting issues
|
|
3
|
+
const mockFetch = vi.hoisted(() => vi.fn());
|
|
4
|
+
vi.mock('node-fetch', () => ({
|
|
5
|
+
default: mockFetch,
|
|
6
|
+
}));
|
|
7
|
+
import { BitbucketAPI } from './bitbucket-api.js';
|
|
8
|
+
describe('BitbucketAPI', () => {
|
|
9
|
+
let api;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
// Mock console.error to avoid noise in tests before creating the API instance
|
|
12
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
13
|
+
api = new BitbucketAPI();
|
|
14
|
+
vi.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
vi.restoreAllMocks();
|
|
18
|
+
});
|
|
19
|
+
describe('listRepositories', () => {
|
|
20
|
+
it('should return repositories for a workspace', async () => {
|
|
21
|
+
const mockResponse = {
|
|
22
|
+
ok: true,
|
|
23
|
+
status: 200,
|
|
24
|
+
json: vi.fn().mockResolvedValue({
|
|
25
|
+
values: [
|
|
26
|
+
{
|
|
27
|
+
uuid: 'test-uuid',
|
|
28
|
+
name: 'test-repo',
|
|
29
|
+
full_name: 'workspace/test-repo',
|
|
30
|
+
description: 'A test repository',
|
|
31
|
+
is_private: false,
|
|
32
|
+
created_on: '2023-01-01T00:00:00Z',
|
|
33
|
+
updated_on: '2023-01-02T00:00:00Z',
|
|
34
|
+
size: 1024,
|
|
35
|
+
language: 'TypeScript',
|
|
36
|
+
owner: {
|
|
37
|
+
display_name: 'Test User',
|
|
38
|
+
username: 'testuser',
|
|
39
|
+
},
|
|
40
|
+
links: {
|
|
41
|
+
html: { href: 'https://bitbucket.org/workspace/test-repo' },
|
|
42
|
+
clone: [
|
|
43
|
+
{ name: 'https', href: 'https://bitbucket.org/workspace/test-repo.git' },
|
|
44
|
+
{ name: 'ssh', href: 'git@bitbucket.org:workspace/test-repo.git' },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
next: null,
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
mockFetch.mockResolvedValue(mockResponse);
|
|
53
|
+
const result = await api.listRepositories('testworkspace');
|
|
54
|
+
expect(result.repositories).toHaveLength(1);
|
|
55
|
+
expect(result.repositories[0].name).toBe('test-repo');
|
|
56
|
+
expect(result.hasMore).toBe(false);
|
|
57
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace', expect.objectContaining({
|
|
58
|
+
headers: expect.objectContaining({
|
|
59
|
+
'Accept': 'application/json',
|
|
60
|
+
'User-Agent': 'bitbucket-mcp-server/1.0',
|
|
61
|
+
}),
|
|
62
|
+
signal: expect.any(AbortSignal),
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
it('should handle authentication when credentials are provided', async () => {
|
|
66
|
+
// Set up authenticated API
|
|
67
|
+
const authenticatedApi = new BitbucketAPI('testuser', 'testpass');
|
|
68
|
+
const mockResponse = {
|
|
69
|
+
ok: true,
|
|
70
|
+
status: 200,
|
|
71
|
+
json: vi.fn().mockResolvedValue({ values: [], next: null }),
|
|
72
|
+
};
|
|
73
|
+
mockFetch.mockResolvedValue(mockResponse);
|
|
74
|
+
await authenticatedApi.listRepositories('testworkspace');
|
|
75
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace', expect.objectContaining({
|
|
76
|
+
headers: expect.objectContaining({
|
|
77
|
+
'Authorization': 'Basic dGVzdHVzZXI6dGVzdHBhc3M=', // base64 of testuser:testpass
|
|
78
|
+
}),
|
|
79
|
+
}));
|
|
80
|
+
});
|
|
81
|
+
it('should handle API errors gracefully', async () => {
|
|
82
|
+
const errorResponse = {
|
|
83
|
+
ok: false,
|
|
84
|
+
status: 404,
|
|
85
|
+
statusText: 'Not Found',
|
|
86
|
+
json: vi.fn().mockResolvedValue({ error: { message: 'Workspace not found' } }),
|
|
87
|
+
};
|
|
88
|
+
mockFetch.mockResolvedValue(errorResponse);
|
|
89
|
+
await expect(api.listRepositories('nonexistent')).rejects.toThrow();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('getRepository', () => {
|
|
93
|
+
it('should return repository details', async () => {
|
|
94
|
+
const mockRepo = {
|
|
95
|
+
uuid: 'test-uuid',
|
|
96
|
+
name: 'test-repo',
|
|
97
|
+
full_name: 'workspace/test-repo',
|
|
98
|
+
description: 'A test repository',
|
|
99
|
+
is_private: false,
|
|
100
|
+
created_on: '2023-01-01T00:00:00Z',
|
|
101
|
+
updated_on: '2023-01-02T00:00:00Z',
|
|
102
|
+
size: 1024,
|
|
103
|
+
language: 'TypeScript',
|
|
104
|
+
owner: {
|
|
105
|
+
display_name: 'Test User',
|
|
106
|
+
username: 'testuser',
|
|
107
|
+
},
|
|
108
|
+
links: {
|
|
109
|
+
html: { href: 'https://bitbucket.org/workspace/test-repo' },
|
|
110
|
+
clone: [
|
|
111
|
+
{ name: 'https', href: 'https://bitbucket.org/workspace/test-repo.git' },
|
|
112
|
+
{ name: 'ssh', href: 'git@bitbucket.org:workspace/test-repo.git' },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
const mockResponse = {
|
|
117
|
+
ok: true,
|
|
118
|
+
status: 200,
|
|
119
|
+
json: vi.fn().mockResolvedValue(mockRepo),
|
|
120
|
+
};
|
|
121
|
+
mockFetch.mockResolvedValue(mockResponse);
|
|
122
|
+
const result = await api.getRepository('testworkspace', 'test-repo');
|
|
123
|
+
expect(result).toEqual(mockRepo);
|
|
124
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo', expect.any(Object));
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('getPullRequest', () => {
|
|
128
|
+
it('should return pull request details', async () => {
|
|
129
|
+
const mockPullRequest = {
|
|
130
|
+
id: 123,
|
|
131
|
+
title: 'Fix critical bug',
|
|
132
|
+
state: 'OPEN',
|
|
133
|
+
author: {
|
|
134
|
+
display_name: 'John Doe',
|
|
135
|
+
username: 'johndoe',
|
|
136
|
+
},
|
|
137
|
+
created_on: '2023-12-01T10:00:00Z',
|
|
138
|
+
updated_on: '2023-12-01T15:30:00Z',
|
|
139
|
+
source: {
|
|
140
|
+
branch: {
|
|
141
|
+
name: 'feature/fix-bug',
|
|
142
|
+
},
|
|
143
|
+
repository: {
|
|
144
|
+
name: 'test-repo',
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
destination: {
|
|
148
|
+
branch: {
|
|
149
|
+
name: 'main',
|
|
150
|
+
},
|
|
151
|
+
repository: {
|
|
152
|
+
name: 'test-repo',
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
links: {
|
|
156
|
+
html: {
|
|
157
|
+
href: 'https://bitbucket.org/workspace/test-repo/pull-requests/123',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
description: 'This PR fixes a critical bug in the authentication system.',
|
|
161
|
+
};
|
|
162
|
+
const mockResponse = {
|
|
163
|
+
ok: true,
|
|
164
|
+
status: 200,
|
|
165
|
+
json: vi.fn().mockResolvedValue(mockPullRequest),
|
|
166
|
+
};
|
|
167
|
+
mockFetch.mockResolvedValue(mockResponse);
|
|
168
|
+
const result = await api.getPullRequest('testworkspace', 'test-repo', 123);
|
|
169
|
+
expect(result).toEqual(mockPullRequest);
|
|
170
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo/pullrequests/123', expect.any(Object));
|
|
171
|
+
});
|
|
172
|
+
it('should handle pull request not found error', async () => {
|
|
173
|
+
const errorResponse = {
|
|
174
|
+
ok: false,
|
|
175
|
+
status: 404,
|
|
176
|
+
statusText: 'Not Found',
|
|
177
|
+
json: vi.fn().mockResolvedValue({ error: { message: 'Pull request not found' } }),
|
|
178
|
+
};
|
|
179
|
+
mockFetch.mockResolvedValue(errorResponse);
|
|
180
|
+
await expect(api.getPullRequest('testworkspace', 'test-repo', 999)).rejects.toThrow();
|
|
181
|
+
});
|
|
182
|
+
it('should handle authentication when getting pull request', async () => {
|
|
183
|
+
const authenticatedApi = new BitbucketAPI('testuser', 'testpass');
|
|
184
|
+
const mockResponse = {
|
|
185
|
+
ok: true,
|
|
186
|
+
status: 200,
|
|
187
|
+
json: vi.fn().mockResolvedValue({
|
|
188
|
+
id: 123,
|
|
189
|
+
title: 'Test PR',
|
|
190
|
+
state: 'OPEN',
|
|
191
|
+
}),
|
|
192
|
+
};
|
|
193
|
+
mockFetch.mockResolvedValue(mockResponse);
|
|
194
|
+
await authenticatedApi.getPullRequest('testworkspace', 'test-repo', 123);
|
|
195
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.bitbucket.org/2.0/repositories/testworkspace/test-repo/pullrequests/123', expect.objectContaining({
|
|
196
|
+
headers: expect.objectContaining({
|
|
197
|
+
'Authorization': 'Basic dGVzdHVzZXI6dGVzdHBhc3M=',
|
|
198
|
+
}),
|
|
199
|
+
}));
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=bitbucket-api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-api.test.js","sourceRoot":"","sources":["../src/bitbucket-api.test.ts"],"names":[],"mappings":"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"}
|
package/build/cache.d.ts
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caching system for the Bitbucket MCP server
|
|
3
|
+
*/
|
|
4
|
+
export interface CacheEntry<T = any> {
|
|
5
|
+
data: T;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
ttl: number;
|
|
8
|
+
key: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CacheOptions {
|
|
11
|
+
maxSize: number;
|
|
12
|
+
defaultTtl: number;
|
|
13
|
+
cleanupInterval: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CacheStats {
|
|
16
|
+
hits: number;
|
|
17
|
+
misses: number;
|
|
18
|
+
totalRequests: number;
|
|
19
|
+
hitRate: number;
|
|
20
|
+
cacheSize: number;
|
|
21
|
+
maxSize: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* LRU Cache implementation with TTL support
|
|
25
|
+
*/
|
|
26
|
+
export declare class LRUCache<T = any> {
|
|
27
|
+
private options;
|
|
28
|
+
private cache;
|
|
29
|
+
private accessOrder;
|
|
30
|
+
private accessCounter;
|
|
31
|
+
private stats;
|
|
32
|
+
private cleanupTimer?;
|
|
33
|
+
constructor(options: CacheOptions);
|
|
34
|
+
/**
|
|
35
|
+
* Get an item from the cache
|
|
36
|
+
*/
|
|
37
|
+
get(key: string): T | null;
|
|
38
|
+
/**
|
|
39
|
+
* Set an item in the cache
|
|
40
|
+
*/
|
|
41
|
+
set(key: string, data: T, ttl?: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Delete an item from the cache
|
|
44
|
+
*/
|
|
45
|
+
delete(key: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a key exists in the cache (without affecting access order)
|
|
48
|
+
*/
|
|
49
|
+
has(key: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Clear all cache entries
|
|
52
|
+
*/
|
|
53
|
+
clear(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Get cache statistics
|
|
56
|
+
*/
|
|
57
|
+
getStats(): CacheStats;
|
|
58
|
+
/**
|
|
59
|
+
* Reset cache statistics
|
|
60
|
+
*/
|
|
61
|
+
resetStats(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get all cache keys
|
|
64
|
+
*/
|
|
65
|
+
keys(): string[];
|
|
66
|
+
/**
|
|
67
|
+
* Get cache size
|
|
68
|
+
*/
|
|
69
|
+
size(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Get cache configuration
|
|
72
|
+
*/
|
|
73
|
+
getConfig(): CacheOptions;
|
|
74
|
+
/**
|
|
75
|
+
* Update cache configuration
|
|
76
|
+
*/
|
|
77
|
+
updateConfig(newOptions: Partial<CacheOptions>): void;
|
|
78
|
+
/**
|
|
79
|
+
* Cleanup expired entries
|
|
80
|
+
*/
|
|
81
|
+
private cleanup;
|
|
82
|
+
/**
|
|
83
|
+
* Evict least recently used item
|
|
84
|
+
*/
|
|
85
|
+
private evictLRU;
|
|
86
|
+
/**
|
|
87
|
+
* Update hit rate calculation
|
|
88
|
+
*/
|
|
89
|
+
private updateHitRate;
|
|
90
|
+
/**
|
|
91
|
+
* Update cache size in stats
|
|
92
|
+
*/
|
|
93
|
+
private updateCacheSize;
|
|
94
|
+
/**
|
|
95
|
+
* Cleanup resources
|
|
96
|
+
*/
|
|
97
|
+
destroy(): void;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Cache key generator for API requests
|
|
101
|
+
*/
|
|
102
|
+
export declare class CacheKeyGenerator {
|
|
103
|
+
static forRepository(workspace: string, repoSlug: string): string;
|
|
104
|
+
static forRepositories(workspace: string, options?: Record<string, any>): string;
|
|
105
|
+
static forPullRequests(workspace: string, repoSlug: string, state?: string): string;
|
|
106
|
+
static forIssues(workspace: string, repoSlug: string, state?: string): string;
|
|
107
|
+
static forBranches(workspace: string, repoSlug: string): string;
|
|
108
|
+
static forCommits(workspace: string, repoSlug: string, branch?: string): string;
|
|
109
|
+
static forSearch(workspace: string, query: string, types: string[], limit: number): string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Cache decorator for API methods
|
|
113
|
+
*/
|
|
114
|
+
export declare function cached<T extends (...args: any[]) => Promise<any>>(cache: LRUCache, keyGenerator: (...args: any[]) => string, ttl?: number): (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<T>) => void;
|
|
115
|
+
/**
|
|
116
|
+
* Cache management utilities
|
|
117
|
+
*/
|
|
118
|
+
export declare class CacheManager {
|
|
119
|
+
private caches;
|
|
120
|
+
/**
|
|
121
|
+
* Create a new cache instance
|
|
122
|
+
*/
|
|
123
|
+
createCache(name: string, options: CacheOptions): LRUCache;
|
|
124
|
+
/**
|
|
125
|
+
* Get a cache instance by name
|
|
126
|
+
*/
|
|
127
|
+
getCache(name: string): LRUCache | undefined;
|
|
128
|
+
/**
|
|
129
|
+
* Remove a cache instance
|
|
130
|
+
*/
|
|
131
|
+
removeCache(name: string): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Get statistics for all caches
|
|
134
|
+
*/
|
|
135
|
+
getAllStats(): Record<string, CacheStats>;
|
|
136
|
+
/**
|
|
137
|
+
* Clear all caches
|
|
138
|
+
*/
|
|
139
|
+
clearAll(): void;
|
|
140
|
+
/**
|
|
141
|
+
* Reset statistics for all caches
|
|
142
|
+
*/
|
|
143
|
+
resetAllStats(): void;
|
|
144
|
+
/**
|
|
145
|
+
* Destroy all caches
|
|
146
|
+
*/
|
|
147
|
+
destroyAll(): void;
|
|
148
|
+
}
|
|
149
|
+
export declare const cacheManager: CacheManager;
|
|
150
|
+
export declare const apiCache: LRUCache<any>;
|