@voxburst/mcp-server 0.1.0 → 0.2.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/dist/__tests__/rate-limiter.test.d.ts +5 -0
- package/dist/__tests__/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limiter.test.js +56 -0
- package/dist/__tests__/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +5 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +195 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/client.js +9 -9
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +135 -24
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.d.ts +29 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +39 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +12 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logger.d.ts +38 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +77 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +27 -0
- package/dist/middleware/rate-limiter.d.ts.map +1 -0
- package/dist/middleware/rate-limiter.js +69 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rate-limiter.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unit tests for RateLimiter
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const rate_limiter_js_1 = require("../middleware/rate-limiter.js");
|
|
8
|
+
(0, vitest_1.describe)('RateLimiter', () => {
|
|
9
|
+
let limiter;
|
|
10
|
+
(0, vitest_1.afterEach)(() => {
|
|
11
|
+
limiter?.destroy();
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.it)('allows requests within limit', () => {
|
|
14
|
+
limiter = new rate_limiter_js_1.RateLimiter({ maxRequests: 5, windowMs: 60000 });
|
|
15
|
+
for (let i = 0; i < 5; i++) {
|
|
16
|
+
const result = limiter.check('test-key');
|
|
17
|
+
(0, vitest_1.expect)(result.allowed).toBe(true);
|
|
18
|
+
(0, vitest_1.expect)(result.remaining).toBe(4 - i);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('blocks requests exceeding limit', () => {
|
|
22
|
+
limiter = new rate_limiter_js_1.RateLimiter({ maxRequests: 3, windowMs: 60000 });
|
|
23
|
+
limiter.check('test-key');
|
|
24
|
+
limiter.check('test-key');
|
|
25
|
+
limiter.check('test-key');
|
|
26
|
+
const result = limiter.check('test-key');
|
|
27
|
+
(0, vitest_1.expect)(result.allowed).toBe(false);
|
|
28
|
+
(0, vitest_1.expect)(result.remaining).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('tracks keys independently', () => {
|
|
31
|
+
limiter = new rate_limiter_js_1.RateLimiter({ maxRequests: 2, windowMs: 60000 });
|
|
32
|
+
limiter.check('key-a');
|
|
33
|
+
limiter.check('key-a');
|
|
34
|
+
const resultA = limiter.check('key-a');
|
|
35
|
+
const resultB = limiter.check('key-b');
|
|
36
|
+
(0, vitest_1.expect)(resultA.allowed).toBe(false);
|
|
37
|
+
(0, vitest_1.expect)(resultB.allowed).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.it)('provides resetAt timestamp', () => {
|
|
40
|
+
limiter = new rate_limiter_js_1.RateLimiter({ maxRequests: 1, windowMs: 60000 });
|
|
41
|
+
const result = limiter.check('test-key');
|
|
42
|
+
(0, vitest_1.expect)(result.resetAt).toBeGreaterThan(Date.now());
|
|
43
|
+
(0, vitest_1.expect)(result.resetAt).toBeLessThanOrEqual(Date.now() + 60000);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('resets after window expires', async () => {
|
|
46
|
+
limiter = new rate_limiter_js_1.RateLimiter({ maxRequests: 1, windowMs: 50 });
|
|
47
|
+
limiter.check('test-key');
|
|
48
|
+
const blocked = limiter.check('test-key');
|
|
49
|
+
(0, vitest_1.expect)(blocked.allowed).toBe(false);
|
|
50
|
+
// Wait for window to expire
|
|
51
|
+
await new Promise(resolve => setTimeout(resolve, 60));
|
|
52
|
+
const afterReset = limiter.check('test-key');
|
|
53
|
+
(0, vitest_1.expect)(afterReset.allowed).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=rate-limiter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limiter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unit tests for MCP Server tool handlers
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const posts_js_1 = require("../tools/posts.js");
|
|
8
|
+
const accounts_js_1 = require("../tools/accounts.js");
|
|
9
|
+
const analytics_js_1 = require("../tools/analytics.js");
|
|
10
|
+
// Mock client factory
|
|
11
|
+
function createMockClient() {
|
|
12
|
+
return {
|
|
13
|
+
listAccounts: vitest_1.vi.fn().mockResolvedValue([
|
|
14
|
+
{
|
|
15
|
+
id: 'acc_1',
|
|
16
|
+
platform: 'twitter',
|
|
17
|
+
handle: '@test',
|
|
18
|
+
displayName: 'Test User',
|
|
19
|
+
connected: true,
|
|
20
|
+
lastSync: '2026-03-03T00:00:00Z',
|
|
21
|
+
},
|
|
22
|
+
]),
|
|
23
|
+
getAccount: vitest_1.vi.fn().mockResolvedValue({
|
|
24
|
+
id: 'acc_1',
|
|
25
|
+
platform: 'twitter',
|
|
26
|
+
handle: '@test',
|
|
27
|
+
displayName: 'Test User',
|
|
28
|
+
connected: true,
|
|
29
|
+
}),
|
|
30
|
+
createPost: vitest_1.vi.fn().mockResolvedValue({
|
|
31
|
+
id: 'post_1',
|
|
32
|
+
content: 'Hello World',
|
|
33
|
+
status: 'draft',
|
|
34
|
+
accounts: ['acc_1'],
|
|
35
|
+
createdAt: '2026-03-03T00:00:00Z',
|
|
36
|
+
updatedAt: '2026-03-03T00:00:00Z',
|
|
37
|
+
}),
|
|
38
|
+
listPosts: vitest_1.vi.fn().mockResolvedValue([
|
|
39
|
+
{
|
|
40
|
+
id: 'post_1',
|
|
41
|
+
content: 'Hello World',
|
|
42
|
+
status: 'published',
|
|
43
|
+
accounts: ['acc_1'],
|
|
44
|
+
createdAt: '2026-03-03T00:00:00Z',
|
|
45
|
+
updatedAt: '2026-03-03T00:00:00Z',
|
|
46
|
+
},
|
|
47
|
+
]),
|
|
48
|
+
getPost: vitest_1.vi.fn().mockResolvedValue({
|
|
49
|
+
id: 'post_1',
|
|
50
|
+
content: 'Hello World',
|
|
51
|
+
status: 'published',
|
|
52
|
+
accounts: ['acc_1'],
|
|
53
|
+
createdAt: '2026-03-03T00:00:00Z',
|
|
54
|
+
updatedAt: '2026-03-03T00:00:00Z',
|
|
55
|
+
}),
|
|
56
|
+
deletePost: vitest_1.vi.fn().mockResolvedValue(undefined),
|
|
57
|
+
validateContent: vitest_1.vi.fn().mockResolvedValue({
|
|
58
|
+
valid: true,
|
|
59
|
+
errors: [],
|
|
60
|
+
warnings: [],
|
|
61
|
+
}),
|
|
62
|
+
getPostMetrics: vitest_1.vi.fn().mockResolvedValue({
|
|
63
|
+
postId: 'post_1',
|
|
64
|
+
impressions: 1000,
|
|
65
|
+
engagements: 50,
|
|
66
|
+
likes: 30,
|
|
67
|
+
shares: 10,
|
|
68
|
+
comments: 5,
|
|
69
|
+
clicks: 5,
|
|
70
|
+
collectedAt: '2026-03-03T00:00:00Z',
|
|
71
|
+
}),
|
|
72
|
+
getAccountMetrics: vitest_1.vi.fn().mockResolvedValue({
|
|
73
|
+
accountId: 'acc_1',
|
|
74
|
+
followers: 500,
|
|
75
|
+
following: 200,
|
|
76
|
+
totalPosts: 100,
|
|
77
|
+
avgEngagementRate: 3.5,
|
|
78
|
+
collectedAt: '2026-03-03T00:00:00Z',
|
|
79
|
+
}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
(0, vitest_1.describe)('Post Tools', () => {
|
|
83
|
+
let client;
|
|
84
|
+
(0, vitest_1.beforeEach)(() => {
|
|
85
|
+
client = createMockClient();
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.describe)('handleCreatePost', () => {
|
|
88
|
+
(0, vitest_1.it)('creates a post with valid input', async () => {
|
|
89
|
+
const result = await (0, posts_js_1.handleCreatePost)(client, {
|
|
90
|
+
content: 'Hello World',
|
|
91
|
+
accountIds: ['acc_1'],
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.expect)(result).toHaveProperty('id', 'post_1');
|
|
94
|
+
(0, vitest_1.expect)(client.createPost).toHaveBeenCalledWith({
|
|
95
|
+
content: 'Hello World',
|
|
96
|
+
accountIds: ['acc_1'],
|
|
97
|
+
mediaUrls: undefined,
|
|
98
|
+
scheduledFor: undefined,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.it)('creates a scheduled post', async () => {
|
|
102
|
+
await (0, posts_js_1.handleCreatePost)(client, {
|
|
103
|
+
content: 'Scheduled post',
|
|
104
|
+
accountIds: ['acc_1'],
|
|
105
|
+
scheduledFor: '2026-03-04T09:00:00Z',
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.expect)(client.createPost).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ scheduledFor: '2026-03-04T09:00:00Z' }));
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)('rejects empty content', async () => {
|
|
110
|
+
await (0, vitest_1.expect)((0, posts_js_1.handleCreatePost)(client, { content: '', accountIds: ['acc_1'] })).rejects.toThrow();
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)('rejects missing accountIds', async () => {
|
|
113
|
+
await (0, vitest_1.expect)((0, posts_js_1.handleCreatePost)(client, { content: 'Hello' })).rejects.toThrow();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.describe)('handleListPosts', () => {
|
|
117
|
+
(0, vitest_1.it)('lists posts with default params', async () => {
|
|
118
|
+
const result = await (0, posts_js_1.handleListPosts)(client, {});
|
|
119
|
+
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
|
|
120
|
+
(0, vitest_1.expect)(client.listPosts).toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
(0, vitest_1.it)('filters by status', async () => {
|
|
123
|
+
await (0, posts_js_1.handleListPosts)(client, { status: 'published' });
|
|
124
|
+
(0, vitest_1.expect)(client.listPosts).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ status: 'published' }));
|
|
125
|
+
});
|
|
126
|
+
(0, vitest_1.it)('rejects invalid status', async () => {
|
|
127
|
+
await (0, vitest_1.expect)((0, posts_js_1.handleListPosts)(client, { status: 'invalid_status' })).rejects.toThrow();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.describe)('handleGetPost', () => {
|
|
131
|
+
(0, vitest_1.it)('gets a post by ID', async () => {
|
|
132
|
+
const result = await (0, posts_js_1.handleGetPost)(client, { postId: 'post_1' });
|
|
133
|
+
(0, vitest_1.expect)(result).toHaveProperty('id', 'post_1');
|
|
134
|
+
});
|
|
135
|
+
(0, vitest_1.it)('rejects missing postId', async () => {
|
|
136
|
+
await (0, vitest_1.expect)((0, posts_js_1.handleGetPost)(client, {})).rejects.toThrow();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
(0, vitest_1.describe)('handleDeletePost', () => {
|
|
140
|
+
(0, vitest_1.it)('deletes a post and returns success', async () => {
|
|
141
|
+
const result = await (0, posts_js_1.handleDeletePost)(client, { postId: 'post_1' });
|
|
142
|
+
(0, vitest_1.expect)(result).toEqual({ success: true, message: 'Post post_1 deleted successfully' });
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.describe)('handleValidateContent', () => {
|
|
146
|
+
(0, vitest_1.it)('validates content', async () => {
|
|
147
|
+
const result = await (0, posts_js_1.handleValidateContent)(client, {
|
|
148
|
+
content: 'Test content',
|
|
149
|
+
accountIds: ['acc_1'],
|
|
150
|
+
});
|
|
151
|
+
(0, vitest_1.expect)(result).toHaveProperty('valid', true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.describe)('Account Tools', () => {
|
|
156
|
+
let client;
|
|
157
|
+
(0, vitest_1.beforeEach)(() => {
|
|
158
|
+
client = createMockClient();
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.describe)('handleListAccounts', () => {
|
|
161
|
+
(0, vitest_1.it)('lists all accounts', async () => {
|
|
162
|
+
const result = await (0, accounts_js_1.handleListAccounts)(client);
|
|
163
|
+
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
|
|
164
|
+
(0, vitest_1.expect)(result[0]).toHaveProperty('platform', 'twitter');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.describe)('handleGetAccount', () => {
|
|
168
|
+
(0, vitest_1.it)('gets an account by ID', async () => {
|
|
169
|
+
const result = await (0, accounts_js_1.handleGetAccount)(client, { accountId: 'acc_1' });
|
|
170
|
+
(0, vitest_1.expect)(result).toHaveProperty('id', 'acc_1');
|
|
171
|
+
});
|
|
172
|
+
(0, vitest_1.it)('rejects missing accountId', async () => {
|
|
173
|
+
await (0, vitest_1.expect)((0, accounts_js_1.handleGetAccount)(client, {})).rejects.toThrow();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.describe)('Analytics Tools', () => {
|
|
178
|
+
let client;
|
|
179
|
+
(0, vitest_1.beforeEach)(() => {
|
|
180
|
+
client = createMockClient();
|
|
181
|
+
});
|
|
182
|
+
(0, vitest_1.describe)('handleGetPostMetrics', () => {
|
|
183
|
+
(0, vitest_1.it)('gets post metrics', async () => {
|
|
184
|
+
const result = await (0, analytics_js_1.handleGetPostMetrics)(client, { postId: 'post_1' });
|
|
185
|
+
(0, vitest_1.expect)(result).toHaveProperty('impressions', 1000);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
(0, vitest_1.describe)('handleGetAccountMetrics', () => {
|
|
189
|
+
(0, vitest_1.it)('gets account metrics', async () => {
|
|
190
|
+
const result = await (0, analytics_js_1.handleGetAccountMetrics)(client, { accountId: 'acc_1' });
|
|
191
|
+
(0, vitest_1.expect)(result).toHaveProperty('followers', 500);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -57,14 +57,14 @@ class VoxBurstClient {
|
|
|
57
57
|
}
|
|
58
58
|
// Account Methods
|
|
59
59
|
async listAccounts() {
|
|
60
|
-
return this.request('GET', '/
|
|
60
|
+
return this.request('GET', '/v1/accounts');
|
|
61
61
|
}
|
|
62
62
|
async getAccount(accountId) {
|
|
63
|
-
return this.request('GET', `/
|
|
63
|
+
return this.request('GET', `/v1/accounts/${accountId}`);
|
|
64
64
|
}
|
|
65
65
|
// Post Methods
|
|
66
66
|
async createPost(request) {
|
|
67
|
-
return this.request('POST', '/
|
|
67
|
+
return this.request('POST', '/v1/posts', request);
|
|
68
68
|
}
|
|
69
69
|
async listPosts(params) {
|
|
70
70
|
const queryParams = new URLSearchParams();
|
|
@@ -77,27 +77,27 @@ class VoxBurstClient {
|
|
|
77
77
|
if (params?.offset)
|
|
78
78
|
queryParams.set('offset', params.offset.toString());
|
|
79
79
|
const query = queryParams.toString();
|
|
80
|
-
const path = query ? `/
|
|
80
|
+
const path = query ? `/v1/posts?${query}` : '/v1/posts';
|
|
81
81
|
return this.request('GET', path);
|
|
82
82
|
}
|
|
83
83
|
async getPost(postId) {
|
|
84
|
-
return this.request('GET', `/
|
|
84
|
+
return this.request('GET', `/v1/posts/${postId}`);
|
|
85
85
|
}
|
|
86
86
|
async deletePost(postId) {
|
|
87
|
-
await this.request('DELETE', `/
|
|
87
|
+
await this.request('DELETE', `/v1/posts/${postId}`);
|
|
88
88
|
}
|
|
89
89
|
async validateContent(content, accountIds) {
|
|
90
|
-
return this.request('POST', '/
|
|
90
|
+
return this.request('POST', '/v1/posts/validate', {
|
|
91
91
|
content,
|
|
92
92
|
accountIds,
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
// Analytics Methods
|
|
96
96
|
async getPostMetrics(postId) {
|
|
97
|
-
return this.request('GET', `/
|
|
97
|
+
return this.request('GET', `/v1/analytics/posts/${postId}`);
|
|
98
98
|
}
|
|
99
99
|
async getAccountMetrics(accountId) {
|
|
100
|
-
return this.request('GET', `/
|
|
100
|
+
return this.request('GET', `/v1/analytics/accounts/${accountId}`);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
exports.VoxBurstClient = VoxBurstClient;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAyMH,kDAYC;AApID,MAAa,gBAAiB,SAAQ,KAAK;IAGhC;IACA;IAHT,YACE,OAAe,EACR,UAAkB,EAClB,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AATD,4CASC;AAED,MAAa,cAAc;IACjB,MAAM,CAAS;IACf,MAAM,CAAS;IAEvB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;IAC1E,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAEpC,MAAM,OAAO,GAA2B;YACtC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,2BAA2B;SAC1C,CAAC;QAEF,MAAM,OAAO,GAAgB;YAC3B,MAAM;YACN,OAAO;SACR,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,YAAY,GAAG,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5D,IAAI,SAA6B,CAAC;YAElC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACxC,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,YAAY,CAAC;gBACjD,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;YAED,MAAM,IAAI,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* VoxBurst MCP Server
|
|
4
4
|
*
|
|
5
|
-
* Model Context Protocol server that enables
|
|
6
|
-
* social media posts through VoxBurst.
|
|
5
|
+
* Production-hardened Model Context Protocol server that enables
|
|
6
|
+
* AI agents to manage social media posts through VoxBurst.
|
|
7
7
|
*
|
|
8
8
|
* @see https://modelcontextprotocol.io
|
|
9
9
|
*/
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* VoxBurst MCP Server
|
|
5
5
|
*
|
|
6
|
-
* Model Context Protocol server that enables
|
|
7
|
-
* social media posts through VoxBurst.
|
|
6
|
+
* Production-hardened Model Context Protocol server that enables
|
|
7
|
+
* AI agents to manage social media posts through VoxBurst.
|
|
8
8
|
*
|
|
9
9
|
* @see https://modelcontextprotocol.io
|
|
10
10
|
*/
|
|
@@ -15,12 +15,15 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
15
15
|
const client_js_1 = require("./client.js");
|
|
16
16
|
const index_js_2 = require("./tools/index.js");
|
|
17
17
|
const index_js_3 = require("./resources/index.js");
|
|
18
|
+
const rate_limiter_js_1 = require("./middleware/rate-limiter.js");
|
|
19
|
+
const auth_js_1 = require("./middleware/auth.js");
|
|
20
|
+
const logger_js_1 = require("./middleware/logger.js");
|
|
18
21
|
const SERVER_NAME = 'voxburst';
|
|
19
|
-
const SERVER_VERSION = '0.
|
|
22
|
+
const SERVER_VERSION = '0.2.0';
|
|
20
23
|
/**
|
|
21
|
-
* Create and configure the MCP server
|
|
24
|
+
* Create and configure the MCP server with production hardening
|
|
22
25
|
*/
|
|
23
|
-
function createServer(client) {
|
|
26
|
+
function createServer(client, logger, rateLimiter) {
|
|
24
27
|
const server = new index_js_1.Server({
|
|
25
28
|
name: SERVER_NAME,
|
|
26
29
|
version: SERVER_VERSION,
|
|
@@ -32,12 +35,33 @@ function createServer(client) {
|
|
|
32
35
|
});
|
|
33
36
|
// Register tool handlers
|
|
34
37
|
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
38
|
+
logger.debug('Listing tools');
|
|
35
39
|
return {
|
|
36
40
|
tools: (0, index_js_2.getAllTools)(),
|
|
37
41
|
};
|
|
38
42
|
});
|
|
39
43
|
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
40
44
|
const { name, arguments: args } = request.params;
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
// Rate limiting
|
|
47
|
+
const rateLimitKey = `tool:${name}`;
|
|
48
|
+
const rateResult = rateLimiter.check(rateLimitKey);
|
|
49
|
+
if (!rateResult.allowed) {
|
|
50
|
+
logger.warn('Rate limit exceeded', { tool: name, resetAt: new Date(rateResult.resetAt).toISOString() });
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: 'text',
|
|
55
|
+
text: JSON.stringify({
|
|
56
|
+
error: 'RATE_LIMIT_EXCEEDED',
|
|
57
|
+
message: `Rate limit exceeded for tool "${name}". Try again after ${new Date(rateResult.resetAt).toISOString()}.`,
|
|
58
|
+
retryAfterMs: rateResult.resetAt - Date.now(),
|
|
59
|
+
}),
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
41
65
|
try {
|
|
42
66
|
let result;
|
|
43
67
|
switch (name) {
|
|
@@ -72,16 +96,21 @@ function createServer(client) {
|
|
|
72
96
|
result = await (0, index_js_2.handleGetAccountMetrics)(client, args);
|
|
73
97
|
break;
|
|
74
98
|
default:
|
|
99
|
+
logger.warn('Unknown tool called', { tool: name });
|
|
75
100
|
return {
|
|
76
101
|
content: [
|
|
77
102
|
{
|
|
78
103
|
type: 'text',
|
|
79
|
-
text:
|
|
104
|
+
text: JSON.stringify({
|
|
105
|
+
error: 'UNKNOWN_TOOL',
|
|
106
|
+
message: `Unknown tool: ${name}. Use list_tools to see available tools.`,
|
|
107
|
+
}),
|
|
80
108
|
},
|
|
81
109
|
],
|
|
82
110
|
isError: true,
|
|
83
111
|
};
|
|
84
112
|
}
|
|
113
|
+
logger.toolCall(name, startTime);
|
|
85
114
|
return {
|
|
86
115
|
content: [
|
|
87
116
|
{
|
|
@@ -92,12 +121,13 @@ function createServer(client) {
|
|
|
92
121
|
};
|
|
93
122
|
}
|
|
94
123
|
catch (error) {
|
|
95
|
-
const
|
|
124
|
+
const errorResponse = formatErrorResponse(error);
|
|
125
|
+
logger.toolCall(name, startTime, errorResponse.message);
|
|
96
126
|
return {
|
|
97
127
|
content: [
|
|
98
128
|
{
|
|
99
129
|
type: 'text',
|
|
100
|
-
text:
|
|
130
|
+
text: JSON.stringify(errorResponse),
|
|
101
131
|
},
|
|
102
132
|
],
|
|
103
133
|
isError: true,
|
|
@@ -106,22 +136,32 @@ function createServer(client) {
|
|
|
106
136
|
});
|
|
107
137
|
// Register resource handlers
|
|
108
138
|
server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
|
|
139
|
+
logger.debug('Listing resources');
|
|
109
140
|
return {
|
|
110
141
|
resources: (0, index_js_3.getAllResources)(),
|
|
111
142
|
};
|
|
112
143
|
});
|
|
113
144
|
server.setRequestHandler(types_js_1.ListResourceTemplatesRequestSchema, async () => {
|
|
145
|
+
logger.debug('Listing resource templates');
|
|
114
146
|
return {
|
|
115
147
|
resourceTemplates: (0, index_js_3.getAllResourceTemplates)(),
|
|
116
148
|
};
|
|
117
149
|
});
|
|
118
150
|
server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
|
|
119
151
|
const { uri } = request.params;
|
|
152
|
+
const startTime = Date.now();
|
|
153
|
+
// Rate limiting for resource reads
|
|
154
|
+
const rateResult = rateLimiter.check(`resource:${uri}`);
|
|
155
|
+
if (!rateResult.allowed) {
|
|
156
|
+
logger.warn('Rate limit exceeded for resource', { resource: uri });
|
|
157
|
+
throw new Error(`Rate limit exceeded. Try again after ${new Date(rateResult.resetAt).toISOString()}.`);
|
|
158
|
+
}
|
|
120
159
|
try {
|
|
121
160
|
// Try account resources
|
|
122
161
|
if (uri.startsWith(index_js_3.ACCOUNT_URI_PREFIX) || uri === 'accounts://list') {
|
|
123
162
|
const content = await (0, index_js_3.readAccountResource)(client, uri);
|
|
124
163
|
if (content) {
|
|
164
|
+
logger.resourceRead(uri, startTime);
|
|
125
165
|
return { contents: [content] };
|
|
126
166
|
}
|
|
127
167
|
}
|
|
@@ -129,21 +169,59 @@ function createServer(client) {
|
|
|
129
169
|
if (uri.startsWith(index_js_3.POST_URI_PREFIX) || uri === 'posts://recent') {
|
|
130
170
|
const content = await (0, index_js_3.readPostResource)(client, uri);
|
|
131
171
|
if (content) {
|
|
172
|
+
logger.resourceRead(uri, startTime);
|
|
132
173
|
return { contents: [content] };
|
|
133
174
|
}
|
|
134
175
|
}
|
|
176
|
+
logger.resourceRead(uri, startTime, 'Resource not found');
|
|
135
177
|
throw new Error(`Resource not found: ${uri}`);
|
|
136
178
|
}
|
|
137
179
|
catch (error) {
|
|
138
|
-
|
|
180
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
181
|
+
logger.resourceRead(uri, startTime, msg);
|
|
182
|
+
throw new Error(formatErrorMessage(error));
|
|
139
183
|
}
|
|
140
184
|
});
|
|
141
185
|
return server;
|
|
142
186
|
}
|
|
143
187
|
/**
|
|
144
|
-
* Format error for MCP response
|
|
188
|
+
* Format error for MCP response — structured, no stack traces
|
|
145
189
|
*/
|
|
146
|
-
function
|
|
190
|
+
function formatErrorResponse(error) {
|
|
191
|
+
if (error instanceof client_js_1.VoxBurstAPIError) {
|
|
192
|
+
return {
|
|
193
|
+
error: error.code || 'API_ERROR',
|
|
194
|
+
message: error.message,
|
|
195
|
+
statusCode: error.statusCode,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (error instanceof SyntaxError || (error instanceof Error && error.name === 'ZodError')) {
|
|
199
|
+
return {
|
|
200
|
+
error: 'INVALID_INPUT',
|
|
201
|
+
message: 'Invalid input parameters. Check tool schema for required fields and types.',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (error instanceof TypeError && error.message.includes('fetch')) {
|
|
205
|
+
return {
|
|
206
|
+
error: 'NETWORK_ERROR',
|
|
207
|
+
message: 'Unable to connect to VoxBurst API. Check your network connection and API URL.',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (error instanceof Error) {
|
|
211
|
+
return {
|
|
212
|
+
error: 'INTERNAL_ERROR',
|
|
213
|
+
message: error.message,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
error: 'UNKNOWN_ERROR',
|
|
218
|
+
message: 'An unexpected error occurred.',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Format error message string (no stack traces)
|
|
223
|
+
*/
|
|
224
|
+
function formatErrorMessage(error) {
|
|
147
225
|
if (error instanceof client_js_1.VoxBurstAPIError) {
|
|
148
226
|
return `VoxBurst API Error (${error.statusCode}): ${error.message}${error.code ? ` [${error.code}]` : ''}`;
|
|
149
227
|
}
|
|
@@ -156,29 +234,62 @@ function formatError(error) {
|
|
|
156
234
|
* Main entry point
|
|
157
235
|
*/
|
|
158
236
|
async function main() {
|
|
237
|
+
const logger = (0, logger_js_1.createLoggerFromEnv)();
|
|
159
238
|
try {
|
|
239
|
+
// Validate authentication
|
|
240
|
+
const authConfig = (0, auth_js_1.createAuthConfigFromEnv)();
|
|
241
|
+
const authResult = (0, auth_js_1.validateAuth)(authConfig);
|
|
242
|
+
if (!authResult.authenticated) {
|
|
243
|
+
logger.error('Authentication failed', { error: authResult.error });
|
|
244
|
+
console.error(`Authentication error: ${authResult.error}`);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
logger.info('Authentication validated', { method: authResult.method });
|
|
160
248
|
// Create API client from environment
|
|
161
249
|
const client = (0, client_js_1.createClientFromEnv)();
|
|
250
|
+
// Create rate limiter
|
|
251
|
+
const rateLimiter = new rate_limiter_js_1.RateLimiter({
|
|
252
|
+
maxRequests: parseInt(process.env.VOXBURST_RATE_LIMIT || '100', 10),
|
|
253
|
+
windowMs: parseInt(process.env.VOXBURST_RATE_WINDOW_MS || '60000', 10),
|
|
254
|
+
});
|
|
162
255
|
// Create and start server
|
|
163
|
-
const server = createServer(client);
|
|
256
|
+
const server = createServer(client, logger, rateLimiter);
|
|
164
257
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
165
258
|
await server.connect(transport);
|
|
166
|
-
|
|
167
|
-
|
|
259
|
+
logger.info(`VoxBurst MCP Server v${SERVER_VERSION} started`, {
|
|
260
|
+
authMethod: authResult.method,
|
|
261
|
+
rateLimit: process.env.VOXBURST_RATE_LIMIT || '100',
|
|
262
|
+
});
|
|
263
|
+
// Graceful shutdown handler
|
|
264
|
+
const shutdown = async (signal) => {
|
|
265
|
+
logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
266
|
+
rateLimiter.destroy();
|
|
267
|
+
// Give in-flight requests time to complete
|
|
268
|
+
setTimeout(() => {
|
|
269
|
+
logger.info('Shutdown complete');
|
|
270
|
+
process.exit(0);
|
|
271
|
+
}, 1000);
|
|
272
|
+
};
|
|
273
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
274
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
275
|
+
process.on('SIGHUP', () => shutdown('SIGHUP'));
|
|
276
|
+
// Handle uncaught errors gracefully
|
|
277
|
+
process.on('uncaughtException', (error) => {
|
|
278
|
+
logger.error('Uncaught exception', { error: error.message });
|
|
279
|
+
process.exit(1);
|
|
280
|
+
});
|
|
281
|
+
process.on('unhandledRejection', (reason) => {
|
|
282
|
+
logger.error('Unhandled rejection', {
|
|
283
|
+
error: reason instanceof Error ? reason.message : String(reason),
|
|
284
|
+
});
|
|
285
|
+
});
|
|
168
286
|
}
|
|
169
287
|
catch (error) {
|
|
170
|
-
|
|
288
|
+
logger.error('Failed to start VoxBurst MCP Server', {
|
|
289
|
+
error: error instanceof Error ? error.message : String(error),
|
|
290
|
+
});
|
|
171
291
|
process.exit(1);
|
|
172
292
|
}
|
|
173
293
|
}
|
|
174
|
-
// Handle graceful shutdown
|
|
175
|
-
process.on('SIGINT', () => {
|
|
176
|
-
console.error('Shutting down VoxBurst MCP Server...');
|
|
177
|
-
process.exit(0);
|
|
178
|
-
});
|
|
179
|
-
process.on('SIGTERM', () => {
|
|
180
|
-
console.error('Shutting down VoxBurst MCP Server...');
|
|
181
|
-
process.exit(0);
|
|
182
|
-
});
|
|
183
294
|
main();
|
|
184
295
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;GAOG;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,iEAM4C;AAE5C,2CAAoF;AACpF,+CAW0B;AAC1B,mDAO8B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication middleware for MCP Server
|
|
3
|
+
* Validates API keys and optional Cognito tokens
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthConfig {
|
|
6
|
+
/** Required API key for access */
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
/** Optional: Cognito User Pool ID for token validation */
|
|
9
|
+
cognitoUserPoolId?: string;
|
|
10
|
+
/** Optional: Cognito region */
|
|
11
|
+
cognitoRegion?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthResult {
|
|
14
|
+
authenticated: boolean;
|
|
15
|
+
method: 'api-key' | 'cognito' | 'none';
|
|
16
|
+
userId?: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validate authentication from environment.
|
|
21
|
+
* For stdio transport, auth is done via environment variables.
|
|
22
|
+
* For HTTP transport, auth would be via headers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateAuth(config: AuthConfig): AuthResult;
|
|
25
|
+
/**
|
|
26
|
+
* Create auth config from environment variables
|
|
27
|
+
*/
|
|
28
|
+
export declare function createAuthConfigFromEnv(): AuthConfig;
|
|
29
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAe3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAMpD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication middleware for MCP Server
|
|
4
|
+
* Validates API keys and optional Cognito tokens
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateAuth = validateAuth;
|
|
8
|
+
exports.createAuthConfigFromEnv = createAuthConfigFromEnv;
|
|
9
|
+
/**
|
|
10
|
+
* Validate authentication from environment.
|
|
11
|
+
* For stdio transport, auth is done via environment variables.
|
|
12
|
+
* For HTTP transport, auth would be via headers.
|
|
13
|
+
*/
|
|
14
|
+
function validateAuth(config) {
|
|
15
|
+
// For stdio transport: if API key is configured, it's already validated
|
|
16
|
+
// (client.ts checks VOXBURST_API_KEY on startup)
|
|
17
|
+
if (config.apiKey) {
|
|
18
|
+
return {
|
|
19
|
+
authenticated: true,
|
|
20
|
+
method: 'api-key',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
authenticated: false,
|
|
25
|
+
method: 'none',
|
|
26
|
+
error: 'No authentication configured. Set VOXBURST_API_KEY environment variable.',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create auth config from environment variables
|
|
31
|
+
*/
|
|
32
|
+
function createAuthConfigFromEnv() {
|
|
33
|
+
return {
|
|
34
|
+
apiKey: process.env.VOXBURST_API_KEY,
|
|
35
|
+
cognitoUserPoolId: process.env.VOXBURST_COGNITO_USER_POOL_ID,
|
|
36
|
+
cognitoRegion: process.env.VOXBURST_COGNITO_REGION || 'us-east-1',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAuBH,oCAeC;AAKD,0DAMC;AA/BD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAkB;IAC7C,wEAAwE;IACxE,iDAAiD;IACjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,0EAA0E;KAClF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QACpC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B;QAC5D,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,WAAW;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RateLimiter, type RateLimitConfig } from './rate-limiter.js';
|
|
2
|
+
export { validateAuth, createAuthConfigFromEnv, type AuthConfig, type AuthResult } from './auth.js';
|
|
3
|
+
export { Logger, createLoggerFromEnv, type LogLevel, type LogEntry } from './logger.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACpG,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLoggerFromEnv = exports.Logger = exports.createAuthConfigFromEnv = exports.validateAuth = exports.RateLimiter = void 0;
|
|
4
|
+
var rate_limiter_js_1 = require("./rate-limiter.js");
|
|
5
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiter; } });
|
|
6
|
+
var auth_js_1 = require("./auth.js");
|
|
7
|
+
Object.defineProperty(exports, "validateAuth", { enumerable: true, get: function () { return auth_js_1.validateAuth; } });
|
|
8
|
+
Object.defineProperty(exports, "createAuthConfigFromEnv", { enumerable: true, get: function () { return auth_js_1.createAuthConfigFromEnv; } });
|
|
9
|
+
var logger_js_1 = require("./logger.js");
|
|
10
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_js_1.Logger; } });
|
|
11
|
+
Object.defineProperty(exports, "createLoggerFromEnv", { enumerable: true, get: function () { return logger_js_1.createLoggerFromEnv; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;AAAA,qDAAsE;AAA7D,8GAAA,WAAW,OAAA;AACpB,qCAAoG;AAA3F,uGAAA,YAAY,OAAA;AAAE,kHAAA,uBAAuB,OAAA;AAC9C,yCAAwF;AAA/E,mGAAA,MAAM,OAAA;AAAE,gHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logger for MCP Server
|
|
3
|
+
* Logs to stderr (stdout reserved for MCP protocol)
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
6
|
+
export interface LogEntry {
|
|
7
|
+
timestamp: string;
|
|
8
|
+
level: LogLevel;
|
|
9
|
+
message: string;
|
|
10
|
+
tool?: string;
|
|
11
|
+
resource?: string;
|
|
12
|
+
durationMs?: number;
|
|
13
|
+
error?: string;
|
|
14
|
+
errorCode?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare class Logger {
|
|
18
|
+
private minLevel;
|
|
19
|
+
constructor(level?: LogLevel);
|
|
20
|
+
private log;
|
|
21
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
22
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
23
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
24
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Log a tool call with timing
|
|
27
|
+
*/
|
|
28
|
+
toolCall(name: string, startTime: number, error?: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Log a resource read with timing
|
|
31
|
+
*/
|
|
32
|
+
resourceRead(uri: string, startTime: number, error?: string): void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create logger from environment
|
|
36
|
+
*/
|
|
37
|
+
export declare function createLoggerFromEnv(): Logger;
|
|
38
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAS;gBAEb,KAAK,GAAE,QAAiB;IAIpC,OAAO,CAAC,GAAG;IAcX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/D;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;CAQnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structured logger for MCP Server
|
|
4
|
+
* Logs to stderr (stdout reserved for MCP protocol)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Logger = void 0;
|
|
8
|
+
exports.createLoggerFromEnv = createLoggerFromEnv;
|
|
9
|
+
const LOG_LEVELS = {
|
|
10
|
+
debug: 0,
|
|
11
|
+
info: 1,
|
|
12
|
+
warn: 2,
|
|
13
|
+
error: 3,
|
|
14
|
+
};
|
|
15
|
+
class Logger {
|
|
16
|
+
minLevel;
|
|
17
|
+
constructor(level = 'info') {
|
|
18
|
+
this.minLevel = LOG_LEVELS[level];
|
|
19
|
+
}
|
|
20
|
+
log(level, message, meta) {
|
|
21
|
+
if (LOG_LEVELS[level] < this.minLevel)
|
|
22
|
+
return;
|
|
23
|
+
const entry = {
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
level,
|
|
26
|
+
message,
|
|
27
|
+
...meta,
|
|
28
|
+
};
|
|
29
|
+
// Log as JSON to stderr (stdout is MCP protocol)
|
|
30
|
+
console.error(JSON.stringify(entry));
|
|
31
|
+
}
|
|
32
|
+
debug(message, meta) {
|
|
33
|
+
this.log('debug', message, meta);
|
|
34
|
+
}
|
|
35
|
+
info(message, meta) {
|
|
36
|
+
this.log('info', message, meta);
|
|
37
|
+
}
|
|
38
|
+
warn(message, meta) {
|
|
39
|
+
this.log('warn', message, meta);
|
|
40
|
+
}
|
|
41
|
+
error(message, meta) {
|
|
42
|
+
this.log('error', message, meta);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Log a tool call with timing
|
|
46
|
+
*/
|
|
47
|
+
toolCall(name, startTime, error) {
|
|
48
|
+
const durationMs = Date.now() - startTime;
|
|
49
|
+
if (error) {
|
|
50
|
+
this.error('Tool call failed', { tool: name, durationMs, error });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.info('Tool call completed', { tool: name, durationMs });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Log a resource read with timing
|
|
58
|
+
*/
|
|
59
|
+
resourceRead(uri, startTime, error) {
|
|
60
|
+
const durationMs = Date.now() - startTime;
|
|
61
|
+
if (error) {
|
|
62
|
+
this.error('Resource read failed', { resource: uri, durationMs, error });
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.info('Resource read completed', { resource: uri, durationMs });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.Logger = Logger;
|
|
70
|
+
/**
|
|
71
|
+
* Create logger from environment
|
|
72
|
+
*/
|
|
73
|
+
function createLoggerFromEnv() {
|
|
74
|
+
const level = (process.env.VOXBURST_LOG_LEVEL || 'info');
|
|
75
|
+
return new Logger(level);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAwFH,kDAGC;AAvFD,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAcF,MAAa,MAAM;IACT,QAAQ,CAAS;IAEzB,YAAY,QAAkB,MAAM;QAClC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;QAC1E,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE9C,MAAM,KAAK,GAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO;YACP,GAAG,IAAI;SACR,CAAC;QAEF,iDAAiD;QACjD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,SAAiB,EAAE,KAAc;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAAW,EAAE,SAAiB,EAAE,KAAc;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AA5DD,wBA4DC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAa,CAAC;IACrE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory rate limiter for MCP Server
|
|
3
|
+
* Limits requests per API key and per workspace
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
/** Max requests per window */
|
|
7
|
+
maxRequests: number;
|
|
8
|
+
/** Window size in milliseconds */
|
|
9
|
+
windowMs: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class RateLimiter {
|
|
12
|
+
private entries;
|
|
13
|
+
private config;
|
|
14
|
+
private cleanupInterval;
|
|
15
|
+
constructor(config?: Partial<RateLimitConfig>);
|
|
16
|
+
/**
|
|
17
|
+
* Check if a request is allowed. Returns remaining requests or throws.
|
|
18
|
+
*/
|
|
19
|
+
check(key: string): {
|
|
20
|
+
allowed: boolean;
|
|
21
|
+
remaining: number;
|
|
22
|
+
resetAt: number;
|
|
23
|
+
};
|
|
24
|
+
private cleanup;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAiC;gBAE5C,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAOjD;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAmC5E,OAAO,CAAC,OAAO;IASf,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory rate limiter for MCP Server
|
|
4
|
+
* Limits requests per API key and per workspace
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RateLimiter = void 0;
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
maxRequests: 100,
|
|
10
|
+
windowMs: 60_000, // 1 minute
|
|
11
|
+
};
|
|
12
|
+
class RateLimiter {
|
|
13
|
+
entries = new Map();
|
|
14
|
+
config;
|
|
15
|
+
cleanupInterval;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
18
|
+
// Clean up expired entries every 5 minutes
|
|
19
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60_000);
|
|
20
|
+
this.cleanupInterval.unref();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if a request is allowed. Returns remaining requests or throws.
|
|
24
|
+
*/
|
|
25
|
+
check(key) {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const entry = this.entries.get(key);
|
|
28
|
+
if (!entry || now >= entry.resetAt) {
|
|
29
|
+
// New window
|
|
30
|
+
const newEntry = {
|
|
31
|
+
count: 1,
|
|
32
|
+
resetAt: now + this.config.windowMs,
|
|
33
|
+
};
|
|
34
|
+
this.entries.set(key, newEntry);
|
|
35
|
+
return {
|
|
36
|
+
allowed: true,
|
|
37
|
+
remaining: this.config.maxRequests - 1,
|
|
38
|
+
resetAt: newEntry.resetAt,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
entry.count++;
|
|
42
|
+
if (entry.count > this.config.maxRequests) {
|
|
43
|
+
return {
|
|
44
|
+
allowed: false,
|
|
45
|
+
remaining: 0,
|
|
46
|
+
resetAt: entry.resetAt,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
allowed: true,
|
|
51
|
+
remaining: this.config.maxRequests - entry.count,
|
|
52
|
+
resetAt: entry.resetAt,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
cleanup() {
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
for (const [key, entry] of this.entries) {
|
|
58
|
+
if (now >= entry.resetAt) {
|
|
59
|
+
this.entries.delete(key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
destroy() {
|
|
64
|
+
clearInterval(this.cleanupInterval);
|
|
65
|
+
this.entries.clear();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.RateLimiter = RateLimiter;
|
|
69
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/middleware/rate-limiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAcH,MAAM,cAAc,GAAoB;IACtC,WAAW,EAAE,GAAG;IAChB,QAAQ,EAAE,MAAM,EAAE,WAAW;CAC9B,CAAC;AAEF,MAAa,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,MAAM,CAAkB;IACxB,eAAe,CAAiC;IAExD,YAAY,SAAmC,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,2CAA2C;QAC3C,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,aAAa;YACb,MAAM,QAAQ,GAAmB;gBAC/B,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;aACpC,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC;gBACtC,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK;YAChD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AA/DD,kCA+DC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voxburst/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP Server for VoxBurst - Enable AI agents to manage social media posts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
],
|
|
46
46
|
"repository": {
|
|
47
47
|
"type": "git",
|
|
48
|
-
"url": "https://github.com/
|
|
48
|
+
"url": "https://github.com/fortheanprojects/voxburst.git",
|
|
49
49
|
"directory": "packages/mcp-server"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|