@testomatio/mcp 2.0.0 → 2.0.1-beta.1
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 +76 -13
- package/package.json +3 -2
- package/src/api/http-client.js +12 -3
- package/src/api/testomatio-client.js +89 -8
- package/src/index.js +23 -2
- package/src/mcp/configs/entity-crud-config.js +12 -4
- package/src/mcp/definitions/labels.js +0 -25
- package/src/mcp/definitions/milestones.js +43 -0
- package/src/mcp/definitions/plans.js +38 -2
- package/src/mcp/definitions/requirements.js +163 -0
- package/src/mcp/definitions/rungroups.js +0 -25
- package/src/mcp/definitions/runs.js +18 -18
- package/src/mcp/definitions/snippets.js +2 -25
- package/src/mcp/definitions/steps.js +2 -25
- package/src/mcp/definitions/suites.js +6 -8
- package/src/mcp/definitions/testruns.js +194 -2
- package/src/mcp/definitions/tests.js +12 -36
- package/src/mcp/definitions/tql-reference.js +133 -0
- package/src/mcp/registry/handlers.js +17 -2
- package/src/mcp/registry/listings.js +101 -43
- package/src/mcp/registry/payloads.js +89 -8
- package/src/mcp/server.js +47 -4
- package/src/mcp/tool-definitions.js +4 -0
- package/src/mcp/tool-registry.js +7 -2
package/src/mcp/server.js
CHANGED
|
@@ -7,14 +7,30 @@ import { createLogger } from '../core/logger.js';
|
|
|
7
7
|
import { getPackageVersion } from '../config/package-version.js';
|
|
8
8
|
|
|
9
9
|
export class TestomatioMCPServer {
|
|
10
|
-
constructor({
|
|
10
|
+
constructor({
|
|
11
|
+
config,
|
|
12
|
+
apiClient,
|
|
13
|
+
logger,
|
|
14
|
+
tools = TOOL_DEFINITIONS,
|
|
15
|
+
name = 'testomatio-mcp-server',
|
|
16
|
+
registryOptions = {},
|
|
17
|
+
}) {
|
|
11
18
|
this.config = config;
|
|
19
|
+
this.apiClient = apiClient;
|
|
12
20
|
this.logger = logger || createLogger();
|
|
13
|
-
this.
|
|
21
|
+
this.tools = tools;
|
|
22
|
+
this.toolRegistry = new ToolRegistry({
|
|
23
|
+
config,
|
|
24
|
+
apiClient,
|
|
25
|
+
logger: this.logger,
|
|
26
|
+
tools,
|
|
27
|
+
...registryOptions,
|
|
28
|
+
});
|
|
29
|
+
this.cleanupStarted = false;
|
|
14
30
|
|
|
15
31
|
this.server = new Server(
|
|
16
32
|
{
|
|
17
|
-
name
|
|
33
|
+
name,
|
|
18
34
|
version: getPackageVersion(),
|
|
19
35
|
},
|
|
20
36
|
{
|
|
@@ -29,7 +45,7 @@ export class TestomatioMCPServer {
|
|
|
29
45
|
|
|
30
46
|
setupHandlers() {
|
|
31
47
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
32
|
-
tools:
|
|
48
|
+
tools: this.tools,
|
|
33
49
|
}));
|
|
34
50
|
|
|
35
51
|
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -44,6 +60,33 @@ export class TestomatioMCPServer {
|
|
|
44
60
|
async run() {
|
|
45
61
|
const transport = new StdioServerTransport();
|
|
46
62
|
await this.server.connect(transport);
|
|
63
|
+
this.installSessionCleanup();
|
|
47
64
|
this.logger.info('Testomatio MCP server started');
|
|
48
65
|
}
|
|
66
|
+
|
|
67
|
+
installSessionCleanup() {
|
|
68
|
+
const cleanup = async () => {
|
|
69
|
+
if (this.cleanupStarted) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
this.cleanupStarted = true;
|
|
74
|
+
await this.apiClient?.stopSession?.();
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
this.server.onclose = () => {
|
|
78
|
+
void cleanup();
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
process.once('beforeExit', () => {
|
|
82
|
+
void cleanup();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
for (const signal of ['SIGINT', 'SIGTERM']) {
|
|
86
|
+
process.once(signal, async () => {
|
|
87
|
+
await cleanup();
|
|
88
|
+
process.exit(0);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
49
92
|
}
|
|
@@ -8,8 +8,10 @@ import { STEPS_TOOLS } from './definitions/steps.js';
|
|
|
8
8
|
import { SNIPPETS_TOOLS } from './definitions/snippets.js';
|
|
9
9
|
import { LABELS_TOOLS } from './definitions/labels.js';
|
|
10
10
|
import { TAGS_TOOLS } from './definitions/tags.js';
|
|
11
|
+
import { MILESTONES_TOOLS } from './definitions/milestones.js';
|
|
11
12
|
import { ISSUES_TOOLS } from './definitions/issues.js';
|
|
12
13
|
import { PLANS_TOOLS } from './definitions/plans.js';
|
|
14
|
+
import { REQUIREMENTS_TOOLS } from './definitions/requirements.js';
|
|
13
15
|
|
|
14
16
|
export const TOOL_DEFINITIONS = [
|
|
15
17
|
...SYSTEM_TOOLS,
|
|
@@ -22,6 +24,8 @@ export const TOOL_DEFINITIONS = [
|
|
|
22
24
|
...SNIPPETS_TOOLS,
|
|
23
25
|
...LABELS_TOOLS,
|
|
24
26
|
...TAGS_TOOLS,
|
|
27
|
+
...MILESTONES_TOOLS,
|
|
25
28
|
...ISSUES_TOOLS,
|
|
26
29
|
...PLANS_TOOLS,
|
|
30
|
+
...REQUIREMENTS_TOOLS,
|
|
27
31
|
];
|
package/src/mcp/tool-registry.js
CHANGED
|
@@ -12,10 +12,12 @@ function formatJson(payload) {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export class ToolRegistry {
|
|
15
|
-
constructor({ config, apiClient, logger }) {
|
|
15
|
+
constructor({ config, apiClient, logger, tools = TOOL_DEFINITIONS, handlerRegistrars = [] }) {
|
|
16
16
|
this.config = config;
|
|
17
17
|
this.apiClient = apiClient;
|
|
18
18
|
this.logger = logger;
|
|
19
|
+
this.tools = tools;
|
|
20
|
+
this.handlerRegistrars = handlerRegistrars;
|
|
19
21
|
this.handlers = this.buildHandlers();
|
|
20
22
|
}
|
|
21
23
|
|
|
@@ -37,8 +39,11 @@ export class ToolRegistry {
|
|
|
37
39
|
this.registerEntityCrudHandlers(handlers);
|
|
38
40
|
this.registerScopedIssueHandlers(handlers);
|
|
39
41
|
this.registerGlobalHandlers(handlers);
|
|
42
|
+
for (const registerHandlers of this.handlerRegistrars) {
|
|
43
|
+
registerHandlers.call(this, handlers);
|
|
44
|
+
}
|
|
40
45
|
|
|
41
|
-
for (const tool of
|
|
46
|
+
for (const tool of this.tools) {
|
|
42
47
|
if (tool.name === 'system_ping') continue;
|
|
43
48
|
if (!handlers[tool.name]) {
|
|
44
49
|
handlers[tool.name] = async () => textResponse(`${DEFAULT_TOOL_RESPONSE} (${tool.name})`);
|