@jgardner04/ghost-mcp-server 1.12.1 → 1.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +8 -8
- package/src/__tests__/mcp_server.test.js +1165 -251
- package/src/__tests__/mcp_server_pages.test.js +12 -12
- package/src/errors/index.js +7 -0
- package/src/index.js +3 -16
- package/src/mcp_server.js +1655 -407
- package/src/mcp_server_enhanced.js +1 -1
- package/src/services/__tests__/postService.test.js +1 -1
- package/src/__tests__/mcp_server_improved.test.js +0 -1299
- package/src/mcp_server_improved.js +0 -1718
|
@@ -125,12 +125,12 @@ vi.mock('path', async () => {
|
|
|
125
125
|
};
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
-
describe('
|
|
128
|
+
describe('mcp_server - ghost_get_pages tool', () => {
|
|
129
129
|
beforeEach(async () => {
|
|
130
130
|
vi.clearAllMocks();
|
|
131
131
|
// Import the module to register tools (only first time)
|
|
132
132
|
if (mockTools.size === 0) {
|
|
133
|
-
await import('../
|
|
133
|
+
await import('../mcp_server.js');
|
|
134
134
|
}
|
|
135
135
|
});
|
|
136
136
|
|
|
@@ -206,11 +206,11 @@ describe('mcp_server_improved - ghost_get_pages tool', () => {
|
|
|
206
206
|
});
|
|
207
207
|
});
|
|
208
208
|
|
|
209
|
-
describe('
|
|
209
|
+
describe('mcp_server - ghost_get_page tool', () => {
|
|
210
210
|
beforeEach(async () => {
|
|
211
211
|
vi.clearAllMocks();
|
|
212
212
|
if (mockTools.size === 0) {
|
|
213
|
-
await import('../
|
|
213
|
+
await import('../mcp_server.js');
|
|
214
214
|
}
|
|
215
215
|
});
|
|
216
216
|
|
|
@@ -270,11 +270,11 @@ describe('mcp_server_improved - ghost_get_page tool', () => {
|
|
|
270
270
|
});
|
|
271
271
|
});
|
|
272
272
|
|
|
273
|
-
describe('
|
|
273
|
+
describe('mcp_server - ghost_create_page tool', () => {
|
|
274
274
|
beforeEach(async () => {
|
|
275
275
|
vi.clearAllMocks();
|
|
276
276
|
if (mockTools.size === 0) {
|
|
277
|
-
await import('../
|
|
277
|
+
await import('../mcp_server.js');
|
|
278
278
|
}
|
|
279
279
|
});
|
|
280
280
|
|
|
@@ -345,11 +345,11 @@ describe('mcp_server_improved - ghost_create_page tool', () => {
|
|
|
345
345
|
});
|
|
346
346
|
});
|
|
347
347
|
|
|
348
|
-
describe('
|
|
348
|
+
describe('mcp_server - ghost_update_page tool', () => {
|
|
349
349
|
beforeEach(async () => {
|
|
350
350
|
vi.clearAllMocks();
|
|
351
351
|
if (mockTools.size === 0) {
|
|
352
|
-
await import('../
|
|
352
|
+
await import('../mcp_server.js');
|
|
353
353
|
}
|
|
354
354
|
});
|
|
355
355
|
|
|
@@ -411,11 +411,11 @@ describe('mcp_server_improved - ghost_update_page tool', () => {
|
|
|
411
411
|
});
|
|
412
412
|
});
|
|
413
413
|
|
|
414
|
-
describe('
|
|
414
|
+
describe('mcp_server - ghost_delete_page tool', () => {
|
|
415
415
|
beforeEach(async () => {
|
|
416
416
|
vi.clearAllMocks();
|
|
417
417
|
if (mockTools.size === 0) {
|
|
418
|
-
await import('../
|
|
418
|
+
await import('../mcp_server.js');
|
|
419
419
|
}
|
|
420
420
|
});
|
|
421
421
|
|
|
@@ -451,11 +451,11 @@ describe('mcp_server_improved - ghost_delete_page tool', () => {
|
|
|
451
451
|
});
|
|
452
452
|
});
|
|
453
453
|
|
|
454
|
-
describe('
|
|
454
|
+
describe('mcp_server - ghost_search_pages tool', () => {
|
|
455
455
|
beforeEach(async () => {
|
|
456
456
|
vi.clearAllMocks();
|
|
457
457
|
if (mockTools.size === 0) {
|
|
458
|
-
await import('../
|
|
458
|
+
await import('../mcp_server.js');
|
|
459
459
|
}
|
|
460
460
|
});
|
|
461
461
|
|
package/src/errors/index.js
CHANGED
|
@@ -40,6 +40,13 @@ export class ValidationError extends BaseError {
|
|
|
40
40
|
this.errors = errors;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
toJSON() {
|
|
44
|
+
return {
|
|
45
|
+
...super.toJSON(),
|
|
46
|
+
...(this.errors.length > 0 && { errors: this.errors }),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
43
50
|
static fromJoi(joiError) {
|
|
44
51
|
const errors = joiError.details.map((detail) => ({
|
|
45
52
|
field: detail.path.join('.'),
|
package/src/index.js
CHANGED
|
@@ -5,7 +5,6 @@ import dotenv from 'dotenv';
|
|
|
5
5
|
import postRoutes from './routes/postRoutes.js'; // Import post routes
|
|
6
6
|
import imageRoutes from './routes/imageRoutes.js'; // Import image routes
|
|
7
7
|
import tagRoutes from './routes/tagRoutes.js'; // Import tag routes
|
|
8
|
-
import { startMCPServer } from './mcp_server.js'; // Import MCP server start function
|
|
9
8
|
import { createContextLogger } from './utils/logger.js';
|
|
10
9
|
|
|
11
10
|
// Load environment variables from .env file
|
|
@@ -16,7 +15,6 @@ const logger = createContextLogger('main');
|
|
|
16
15
|
|
|
17
16
|
const app = express();
|
|
18
17
|
const restApiPort = process.env.PORT || 3000;
|
|
19
|
-
const mcpPort = process.env.MCP_PORT || 3001; // Allow configuring MCP port
|
|
20
18
|
|
|
21
19
|
// Apply security headers with Helmet (OWASP recommended)
|
|
22
20
|
app.use(
|
|
@@ -91,9 +89,8 @@ app.use((err, req, res, _next) => {
|
|
|
91
89
|
});
|
|
92
90
|
});
|
|
93
91
|
|
|
94
|
-
// Start
|
|
95
|
-
const
|
|
96
|
-
// Start Express server
|
|
92
|
+
// Start Express server
|
|
93
|
+
const startServer = () => {
|
|
97
94
|
app.listen(restApiPort, () => {
|
|
98
95
|
logger.info('Express REST API server started', {
|
|
99
96
|
port: restApiPort,
|
|
@@ -101,16 +98,6 @@ const startServers = async () => {
|
|
|
101
98
|
type: 'server_start',
|
|
102
99
|
});
|
|
103
100
|
});
|
|
104
|
-
|
|
105
|
-
// Start MCP server
|
|
106
|
-
await startMCPServer(mcpPort);
|
|
107
101
|
};
|
|
108
102
|
|
|
109
|
-
|
|
110
|
-
logger.error('Failed to start servers', {
|
|
111
|
-
error: error.message,
|
|
112
|
-
stack: error.stack,
|
|
113
|
-
type: 'server_start_error',
|
|
114
|
-
});
|
|
115
|
-
process.exit(1);
|
|
116
|
-
});
|
|
103
|
+
startServer();
|