@taiga-ai/mcp-server 0.2.3-dev.267 → 0.2.3-dev.59
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/index.js +495 -62
- package/package.json +8 -6
- package/scripts/build.mjs +37 -0
- package/scripts/prepare-publish.cjs +15 -7
- package/src/client.ts +13 -5
- package/src/index.ts +19 -7
- package/src/server.integration.test.ts +99 -45
- package/src/tools/documents.ts +1 -1
- package/src/tools/index.ts +5 -1
- package/taiga-ai-mcp-server-0.2.3-dev.59.tgz +0 -0
- package/dist/client.d.ts +0 -109
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -228
- package/dist/client.test.d.ts +0 -2
- package/dist/client.test.d.ts.map +0 -1
- package/dist/client.test.js +0 -203
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/server.integration.test.d.ts +0 -2
- package/dist/server.integration.test.d.ts.map +0 -1
- package/dist/server.integration.test.js +0 -358
- package/dist/tools/backlogs.d.ts +0 -4
- package/dist/tools/backlogs.d.ts.map +0 -1
- package/dist/tools/backlogs.js +0 -6
- package/dist/tools/documents.d.ts +0 -4
- package/dist/tools/documents.d.ts.map +0 -1
- package/dist/tools/documents.js +0 -97
- package/dist/tools/index.d.ts +0 -12
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -18
- package/dist/tools/projects.d.ts +0 -4
- package/dist/tools/projects.d.ts.map +0 -1
- package/dist/tools/projects.js +0 -64
- package/dist/tools/skills.d.ts +0 -4
- package/dist/tools/skills.d.ts.map +0 -1
- package/dist/tools/skills.js +0 -45
- package/dist/tools/summarize.d.ts +0 -15
- package/dist/tools/summarize.d.ts.map +0 -1
- package/dist/tools/summarize.js +0 -26
- package/taiga-ai-mcp-server-0.2.3-dev.267.tgz +0 -0
|
@@ -5,10 +5,14 @@
|
|
|
5
5
|
*
|
|
6
6
|
* - Removes `private: true` so npm allows publishing
|
|
7
7
|
* - Sets publishConfig to public access
|
|
8
|
-
* - Strips workspace-only dependencies
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* - Strips workspace-only dependencies. `@taiga/types` is compile-time only
|
|
9
|
+
* (erased); `@taiga/feature-flags` is a runtime value but is bundled into
|
|
10
|
+
* dist/index.js by the rolldown build, so neither is a real runtime dep.
|
|
11
|
+
* - Drops the `types` entry points — the published artifact is a bundled CLI
|
|
12
|
+
* and ships no `.d.ts` (the build runs `tsc --noEmit`).
|
|
13
|
+
* - Marks the bin entry executable. The bundler emits dist/index.js with mode
|
|
14
|
+
* 0644, so without this `npx -y @taiga-ai/mcp-server` fails with EACCES
|
|
15
|
+
* because the kernel cannot exec a non-executable file despite the shebang.
|
|
12
16
|
*/
|
|
13
17
|
|
|
14
18
|
const fs = require('fs');
|
|
@@ -24,9 +28,13 @@ try {
|
|
|
24
28
|
delete pkg.private;
|
|
25
29
|
pkg.publishConfig = { access: 'public' };
|
|
26
30
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
// Workspace deps are inlined by the bundle — drop them from the published deps.
|
|
32
|
+
delete pkg.dependencies?.['@taiga/types'];
|
|
33
|
+
delete pkg.dependencies?.['@taiga/feature-flags'];
|
|
34
|
+
|
|
35
|
+
// No declarations are shipped for the bundled CLI.
|
|
36
|
+
delete pkg.types;
|
|
37
|
+
delete pkg.exports?.['.']?.types;
|
|
30
38
|
|
|
31
39
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
|
|
32
40
|
console.log('prepare-publish: package.json updated');
|
package/src/client.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ApiKeyIntrospection } from '@taiga/types';
|
|
2
|
+
import { featureFlags } from '@taiga/feature-flags';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* HTTP client for the Taiga API.
|
|
@@ -169,13 +170,17 @@ export class TaigaClient {
|
|
|
169
170
|
const project = await this.request<{ data: Record<string, unknown> }>('GET', `/projects/${projectId}`);
|
|
170
171
|
const teamId = project.data.teamId as string | undefined;
|
|
171
172
|
|
|
172
|
-
// Fetch everything in parallel
|
|
173
|
+
// Fetch everything in parallel. Skills is hidden behind a feature flag
|
|
174
|
+
// (user-facing surface only), so skip its fetch entirely when disabled —
|
|
175
|
+
// the endpoint would 404 otherwise.
|
|
173
176
|
const [projectDocs, teamDocs, skills] = await Promise.all([
|
|
174
177
|
this.listProjectDocuments(projectId, { limit: 20 }).catch(() => ({ data: [] })),
|
|
175
178
|
teamId
|
|
176
179
|
? this.listTeamDocuments(teamId, { limit: 20 }).catch(() => ({ data: [] }))
|
|
177
180
|
: Promise.resolve({ data: [] }),
|
|
178
|
-
|
|
181
|
+
featureFlags.skills
|
|
182
|
+
? this.listSkills({ limit: 100 }).catch(() => ({ data: [] }))
|
|
183
|
+
: Promise.resolve({ data: [] as unknown[] }),
|
|
179
184
|
]);
|
|
180
185
|
|
|
181
186
|
// Fetch full content for key documents (in parallel)
|
|
@@ -233,11 +238,14 @@ export class TaigaClient {
|
|
|
233
238
|
isDraft: d.isDraft,
|
|
234
239
|
})),
|
|
235
240
|
},
|
|
236
|
-
skills_summary: (skills.data as Record<string, unknown>[])
|
|
237
|
-
.filter((s) => !s.teamId || s.teamId === teamId)
|
|
238
|
-
.map((s) => ({ id: s.id, name: s.name, slug: s.slug, description: s.description })),
|
|
239
241
|
};
|
|
240
242
|
|
|
243
|
+
if (featureFlags.skills) {
|
|
244
|
+
context.skills_summary = (skills.data as Record<string, unknown>[])
|
|
245
|
+
.filter((s) => !s.teamId || s.teamId === teamId)
|
|
246
|
+
.map((s) => ({ id: s.id, name: s.name, slug: s.slug, description: s.description }));
|
|
247
|
+
}
|
|
248
|
+
|
|
241
249
|
return context;
|
|
242
250
|
}
|
|
243
251
|
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { featureFlags } from '@taiga/feature-flags';
|
|
5
6
|
import { TaigaClient } from './client.js';
|
|
6
7
|
import { registerAllTools } from './tools/index.js';
|
|
7
8
|
|
|
@@ -50,16 +51,27 @@ async function main() {
|
|
|
50
51
|
"Specification (what to build), architecture (how it's designed), threat model (security risks),",
|
|
51
52
|
'technology decisions, and data flow. Read these to understand the specific project context.',
|
|
52
53
|
'',
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
// Skills is hidden behind a feature flag (user-facing surface only).
|
|
55
|
+
...(featureFlags.skills
|
|
56
|
+
? [
|
|
57
|
+
'**Skills** (taiga_list_skills / taiga_get_skill):',
|
|
58
|
+
'Coding standards, security requirements, API design patterns, testing strategy, database patterns,',
|
|
59
|
+
'and more. These are detailed engineering guidelines with code examples.',
|
|
60
|
+
'',
|
|
61
|
+
]
|
|
62
|
+
: []),
|
|
57
63
|
"Workflow: Start with taiga_list_teams to find your team, then read the team's domain_context",
|
|
58
64
|
'and tech_preferences. For project-specific work, use taiga_list_projects to find the project,',
|
|
59
|
-
|
|
65
|
+
featureFlags.skills
|
|
66
|
+
? 'then read its specification and architecture. Use skills for coding patterns.'
|
|
67
|
+
: 'then read its specification and architecture.',
|
|
60
68
|
'',
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
featureFlags.skills
|
|
70
|
+
? 'When you notice a policy, skill, or team document is outdated, use the update tools'
|
|
71
|
+
: 'When you notice a policy or team document is outdated, use the update tools',
|
|
72
|
+
featureFlags.skills
|
|
73
|
+
? '(taiga_update_document, taiga_update_skill, taiga_update_team_document) to fix it.'
|
|
74
|
+
: '(taiga_update_document, taiga_update_team_document) to fix it.',
|
|
63
75
|
'This keeps the knowledge base accurate for everyone.',
|
|
64
76
|
].join('\n'),
|
|
65
77
|
}
|
|
@@ -5,6 +5,11 @@ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
|
5
5
|
import { TaigaClient } from './client.js';
|
|
6
6
|
import { registerAllTools } from './tools/index.js';
|
|
7
7
|
|
|
8
|
+
// Skills is hidden behind a feature flag. Mock the shared flag with a mutable
|
|
9
|
+
// object so tests can exercise both the default (off) and enabled states.
|
|
10
|
+
const { mockFeatureFlags } = vi.hoisted(() => ({ mockFeatureFlags: { skills: false } }));
|
|
11
|
+
vi.mock('@taiga/feature-flags', () => ({ featureFlags: mockFeatureFlags }));
|
|
12
|
+
|
|
8
13
|
// ---------------------------------------------------------------------------
|
|
9
14
|
// Helpers -- thin wrappers, not abstraction layers
|
|
10
15
|
// ---------------------------------------------------------------------------
|
|
@@ -18,20 +23,21 @@ const ALL_CAPABILITIES = [
|
|
|
18
23
|
'backlog:read',
|
|
19
24
|
];
|
|
20
25
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Tool names registered when the skills feature flag is OFF (the shipped
|
|
28
|
+
* default), sorted for deterministic comparison. The three skill tools
|
|
29
|
+
* (taiga_list_skills / taiga_get_skill / taiga_update_skill) are excluded.
|
|
30
|
+
*/
|
|
31
|
+
const BASE_TOOL_NAMES = [
|
|
23
32
|
'taiga_get_document',
|
|
24
33
|
'taiga_get_project_document',
|
|
25
|
-
'taiga_get_skill',
|
|
26
34
|
'taiga_get_team_document',
|
|
27
35
|
'taiga_list_documents',
|
|
28
36
|
'taiga_list_project_documents',
|
|
29
37
|
'taiga_list_projects',
|
|
30
|
-
'taiga_list_skills',
|
|
31
38
|
'taiga_list_team_documents',
|
|
32
39
|
'taiga_list_teams',
|
|
33
40
|
'taiga_update_document',
|
|
34
|
-
'taiga_update_skill',
|
|
35
41
|
'taiga_update_team_document',
|
|
36
42
|
];
|
|
37
43
|
|
|
@@ -120,6 +126,7 @@ function parseToolResult(result: Record<string, unknown>) {
|
|
|
120
126
|
describe('MCP server integration', () => {
|
|
121
127
|
beforeEach(() => {
|
|
122
128
|
vi.restoreAllMocks();
|
|
129
|
+
mockFeatureFlags.skills = false;
|
|
123
130
|
});
|
|
124
131
|
|
|
125
132
|
// -------------------------------------------------------------------------
|
|
@@ -129,12 +136,23 @@ describe('MCP server integration', () => {
|
|
|
129
136
|
// -------------------------------------------------------------------------
|
|
130
137
|
|
|
131
138
|
describe('tool discovery', () => {
|
|
132
|
-
it('should expose all
|
|
139
|
+
it('should expose all non-skill tools when API key has full capabilities', async () => {
|
|
133
140
|
const { client } = await bootMcpPair({ capabilities: ALL_CAPABILITIES });
|
|
134
141
|
|
|
135
142
|
const { tools } = await client.listTools();
|
|
136
143
|
|
|
137
|
-
|
|
144
|
+
// Skills is flag-off by default, so the skill tools are not registered.
|
|
145
|
+
expect(toolNames(tools)).toEqual(BASE_TOOL_NAMES);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should not register skill tools when the skills flag is off', async () => {
|
|
149
|
+
const { client } = await bootMcpPair({ capabilities: ALL_CAPABILITIES });
|
|
150
|
+
|
|
151
|
+
const names = toolNames((await client.listTools()).tools);
|
|
152
|
+
|
|
153
|
+
expect(names).not.toContain('taiga_list_skills');
|
|
154
|
+
expect(names).not.toContain('taiga_get_skill');
|
|
155
|
+
expect(names).not.toContain('taiga_update_skill');
|
|
138
156
|
});
|
|
139
157
|
|
|
140
158
|
it('should reject tools/list when API key has no capabilities', async () => {
|
|
@@ -167,8 +185,9 @@ describe('MCP server integration', () => {
|
|
|
167
185
|
|
|
168
186
|
expect(names).toContain('taiga_list_documents');
|
|
169
187
|
expect(names).toContain('taiga_get_document');
|
|
170
|
-
|
|
171
|
-
expect(names).toContain('
|
|
188
|
+
// Skills is flag-off by default.
|
|
189
|
+
expect(names).not.toContain('taiga_list_skills');
|
|
190
|
+
expect(names).not.toContain('taiga_get_skill');
|
|
172
191
|
expect(names).not.toContain('taiga_update_document');
|
|
173
192
|
});
|
|
174
193
|
|
|
@@ -181,7 +200,8 @@ describe('MCP server integration', () => {
|
|
|
181
200
|
const names = toolNames(tools);
|
|
182
201
|
|
|
183
202
|
expect(names).toContain('taiga_update_document');
|
|
184
|
-
|
|
203
|
+
// Skills is flag-off by default.
|
|
204
|
+
expect(names).not.toContain('taiga_update_skill');
|
|
185
205
|
});
|
|
186
206
|
|
|
187
207
|
it('should expose team document write when both teams:read and documents:write are granted', async () => {
|
|
@@ -209,7 +229,8 @@ describe('MCP server integration', () => {
|
|
|
209
229
|
expect(names).toContain('taiga_list_team_documents');
|
|
210
230
|
// tenant:documents:read tools present
|
|
211
231
|
expect(names).toContain('taiga_list_documents');
|
|
212
|
-
|
|
232
|
+
// skills flag-off by default
|
|
233
|
+
expect(names).not.toContain('taiga_list_skills');
|
|
213
234
|
// write tools absent
|
|
214
235
|
expect(names).not.toContain('taiga_update_document');
|
|
215
236
|
expect(names).not.toContain('taiga_update_skill');
|
|
@@ -238,8 +259,10 @@ describe('MCP server integration', () => {
|
|
|
238
259
|
const CONTRACT: Record<string, string[]> = {
|
|
239
260
|
'projects:read': ['taiga_list_projects', 'taiga_list_project_documents', 'taiga_get_project_document'],
|
|
240
261
|
'teams:read': ['taiga_list_teams', 'taiga_list_team_documents', 'taiga_get_team_document'],
|
|
241
|
-
|
|
242
|
-
'
|
|
262
|
+
// Skills tools are flag-off by default; their capability gating is covered
|
|
263
|
+
// in the 'when the skills feature flag is enabled' block below.
|
|
264
|
+
'tenant:documents:read': ['taiga_list_documents', 'taiga_get_document'],
|
|
265
|
+
'tenant:documents:write': ['taiga_update_document'],
|
|
243
266
|
};
|
|
244
267
|
|
|
245
268
|
for (const [capability, expectedTools] of Object.entries(CONTRACT)) {
|
|
@@ -280,25 +303,6 @@ describe('MCP server integration', () => {
|
|
|
280
303
|
expect(parseToolResult(result)).toEqual(teams);
|
|
281
304
|
});
|
|
282
305
|
|
|
283
|
-
it('should send PATCH when updating a skill', async () => {
|
|
284
|
-
const skillId = '00000000-0000-0000-0000-000000000001';
|
|
285
|
-
const updated = { id: skillId, name: 'Updated Skill', content: '# Updated' };
|
|
286
|
-
|
|
287
|
-
const { client, fetchSpy } = await bootMcpPair({
|
|
288
|
-
capabilities: ALL_CAPABILITIES,
|
|
289
|
-
routes: { [`PATCH /v1/agent-skills/${skillId}`]: { data: updated } },
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
await client.callTool({
|
|
293
|
-
name: 'taiga_update_skill',
|
|
294
|
-
arguments: { id: skillId, content: '# Updated' },
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
const patchCall = fetchSpy.mock.calls.find((c: unknown[]) => (c[1] as RequestInit)?.method === 'PATCH');
|
|
298
|
-
expect(patchCall).toBeDefined();
|
|
299
|
-
expect(patchCall![0]).toContain(`/v1/agent-skills/${skillId}`);
|
|
300
|
-
});
|
|
301
|
-
|
|
302
306
|
it('should return document content through MCP protocol', async () => {
|
|
303
307
|
const docs = [{ id: 'd1', title: 'Security Policy' }];
|
|
304
308
|
|
|
@@ -353,19 +357,6 @@ describe('MCP server integration', () => {
|
|
|
353
357
|
expect(putCall![0]).toContain(`/v1/teams/${teamId}/documents/${docType}/draft`);
|
|
354
358
|
});
|
|
355
359
|
|
|
356
|
-
it('should return skills through MCP protocol', async () => {
|
|
357
|
-
const skills = [{ id: 's1', name: 'React Standards' }];
|
|
358
|
-
|
|
359
|
-
const { client } = await bootMcpPair({
|
|
360
|
-
capabilities: ALL_CAPABILITIES,
|
|
361
|
-
routes: { 'GET /v1/agent-skills': { data: skills, nextCursor: null } },
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
const result = await client.callTool({ name: 'taiga_list_skills', arguments: {} });
|
|
365
|
-
|
|
366
|
-
expect(parseToolResult(result)).toEqual(skills);
|
|
367
|
-
});
|
|
368
|
-
|
|
369
360
|
it('should return teams through MCP protocol', async () => {
|
|
370
361
|
const teams = [{ id: 't1', name: 'Engineering' }];
|
|
371
362
|
|
|
@@ -438,4 +429,67 @@ describe('MCP server integration', () => {
|
|
|
438
429
|
expect(result.isError).toBe(true);
|
|
439
430
|
});
|
|
440
431
|
});
|
|
432
|
+
|
|
433
|
+
// -------------------------------------------------------------------------
|
|
434
|
+
// Skills feature flag -- when enabled, the skill tools register and behave
|
|
435
|
+
// exactly like the other knowledge-base tools. This preserves coverage of
|
|
436
|
+
// the skill tools for the day the flag is flipped back on.
|
|
437
|
+
// -------------------------------------------------------------------------
|
|
438
|
+
|
|
439
|
+
describe('when the skills feature flag is enabled', () => {
|
|
440
|
+
beforeEach(() => {
|
|
441
|
+
mockFeatureFlags.skills = true;
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
it('registers read skill tools for a documents:read key', async () => {
|
|
445
|
+
const { client } = await bootMcpPair({ capabilities: ['tenant:documents:read'] });
|
|
446
|
+
|
|
447
|
+
const names = toolNames((await client.listTools()).tools);
|
|
448
|
+
|
|
449
|
+
expect(names).toContain('taiga_list_skills');
|
|
450
|
+
expect(names).toContain('taiga_get_skill');
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('registers taiga_update_skill with documents:write', async () => {
|
|
454
|
+
const { client } = await bootMcpPair({
|
|
455
|
+
capabilities: ['tenant:documents:read', 'tenant:documents:write'],
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
const names = toolNames((await client.listTools()).tools);
|
|
459
|
+
|
|
460
|
+
expect(names).toContain('taiga_update_skill');
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
it('should return skills through MCP protocol', async () => {
|
|
464
|
+
const skills = [{ id: 's1', name: 'React Standards' }];
|
|
465
|
+
|
|
466
|
+
const { client } = await bootMcpPair({
|
|
467
|
+
capabilities: ALL_CAPABILITIES,
|
|
468
|
+
routes: { 'GET /v1/agent-skills': { data: skills, nextCursor: null } },
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
const result = await client.callTool({ name: 'taiga_list_skills', arguments: {} });
|
|
472
|
+
|
|
473
|
+
expect(parseToolResult(result)).toEqual(skills);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it('should send PATCH when updating a skill', async () => {
|
|
477
|
+
const skillId = '00000000-0000-0000-0000-000000000001';
|
|
478
|
+
const updated = { id: skillId, name: 'Updated Skill', content: '# Updated' };
|
|
479
|
+
|
|
480
|
+
const { client, fetchSpy } = await bootMcpPair({
|
|
481
|
+
capabilities: ALL_CAPABILITIES,
|
|
482
|
+
routes: { [`PATCH /v1/agent-skills/${skillId}`]: { data: updated } },
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
await client.callTool({
|
|
486
|
+
name: 'taiga_update_skill',
|
|
487
|
+
arguments: { id: skillId, content: '# Updated' },
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
const patchCall = fetchSpy.mock.calls.find((c: unknown[]) => (c[1] as RequestInit)?.method === 'PATCH');
|
|
491
|
+
expect(patchCall).toBeDefined();
|
|
492
|
+
expect(patchCall![0]).toContain(`/v1/agent-skills/${skillId}`);
|
|
493
|
+
});
|
|
494
|
+
});
|
|
441
495
|
});
|
package/src/tools/documents.ts
CHANGED
|
@@ -32,7 +32,7 @@ export function registerDocumentTools(server: McpServer, client: TaigaClient) {
|
|
|
32
32
|
'Use this when you need to understand security requirements, data handling rules, ' +
|
|
33
33
|
'architecture standards, or compliance controls that apply to your code. ' +
|
|
34
34
|
'Types: policy_security, policy_data, policy_sdlc, policy_ops, policy_tic, ' +
|
|
35
|
-
'policy_risk, policy_architecture, policy_supply_chain, policy_acceptable_use, policy_ip.',
|
|
35
|
+
'policy_risk, policy_architecture, policy_supply_chain, policy_cloud_governance, policy_acceptable_use, policy_ip.',
|
|
36
36
|
{
|
|
37
37
|
type: z
|
|
38
38
|
.string()
|
package/src/tools/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { featureFlags } from '@taiga/feature-flags';
|
|
2
3
|
import type { TaigaClient } from '../client.js';
|
|
3
4
|
import { registerProjectTools } from './projects.js';
|
|
4
5
|
import { registerDocumentTools } from './documents.js';
|
|
@@ -17,5 +18,8 @@ export function registerAllTools(server: McpServer, client: TaigaClient): void {
|
|
|
17
18
|
registerProjectTools(server, client);
|
|
18
19
|
registerDocumentTools(server, client);
|
|
19
20
|
registerBacklogTools(server, client);
|
|
20
|
-
|
|
21
|
+
// Skills is hidden behind a feature flag (user-facing surface only).
|
|
22
|
+
if (featureFlags.skills) {
|
|
23
|
+
registerSkillTools(server, client);
|
|
24
|
+
}
|
|
21
25
|
}
|
|
Binary file
|
package/dist/client.d.ts
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import type { ApiKeyIntrospection } from '@taiga/types';
|
|
2
|
-
/**
|
|
3
|
-
* HTTP client for the Taiga API.
|
|
4
|
-
* Used by the MCP server to proxy tool calls to the backend.
|
|
5
|
-
*/
|
|
6
|
-
export declare class TaigaClient {
|
|
7
|
-
private baseUrl;
|
|
8
|
-
private apiKey;
|
|
9
|
-
private introspection;
|
|
10
|
-
constructor(opts: {
|
|
11
|
-
baseUrl: string;
|
|
12
|
-
apiKey: string;
|
|
13
|
-
});
|
|
14
|
-
private request;
|
|
15
|
-
introspect(): Promise<ApiKeyIntrospection>;
|
|
16
|
-
getIntrospection(): ApiKeyIntrospection | null;
|
|
17
|
-
hasCapability(capability: string): boolean;
|
|
18
|
-
listProjects(opts?: {
|
|
19
|
-
teamId?: string;
|
|
20
|
-
status?: string;
|
|
21
|
-
limit?: number;
|
|
22
|
-
}): Promise<{
|
|
23
|
-
data: unknown[];
|
|
24
|
-
nextCursor: string | null;
|
|
25
|
-
}>;
|
|
26
|
-
getProject(id: string): Promise<{
|
|
27
|
-
data: unknown;
|
|
28
|
-
}>;
|
|
29
|
-
listTenantDocuments(opts?: {
|
|
30
|
-
limit?: number;
|
|
31
|
-
}): Promise<{
|
|
32
|
-
data: unknown[];
|
|
33
|
-
nextCursor: string | null;
|
|
34
|
-
}>;
|
|
35
|
-
getTenantDocument(type: string): Promise<{
|
|
36
|
-
data: unknown;
|
|
37
|
-
}>;
|
|
38
|
-
saveTenantDocumentDraft(type: string, body: {
|
|
39
|
-
data: Record<string, unknown>;
|
|
40
|
-
}): Promise<{
|
|
41
|
-
data: unknown;
|
|
42
|
-
}>;
|
|
43
|
-
listTeamDocuments(teamId: string, opts?: {
|
|
44
|
-
limit?: number;
|
|
45
|
-
}): Promise<{
|
|
46
|
-
data: unknown[];
|
|
47
|
-
nextCursor: string | null;
|
|
48
|
-
}>;
|
|
49
|
-
getTeamDocument(teamId: string, type: string): Promise<{
|
|
50
|
-
data: unknown;
|
|
51
|
-
}>;
|
|
52
|
-
saveTeamDocumentDraft(teamId: string, type: string, body: {
|
|
53
|
-
data: Record<string, unknown>;
|
|
54
|
-
}): Promise<{
|
|
55
|
-
data: unknown;
|
|
56
|
-
}>;
|
|
57
|
-
listProjectDocuments(projectId: string, opts?: {
|
|
58
|
-
limit?: number;
|
|
59
|
-
}): Promise<{
|
|
60
|
-
data: unknown[];
|
|
61
|
-
nextCursor: string | null;
|
|
62
|
-
}>;
|
|
63
|
-
getProjectDocument(projectId: string, type: string): Promise<{
|
|
64
|
-
data: unknown;
|
|
65
|
-
}>;
|
|
66
|
-
listSkills(opts?: {
|
|
67
|
-
scope?: string;
|
|
68
|
-
scopeId?: string;
|
|
69
|
-
limit?: number;
|
|
70
|
-
}): Promise<{
|
|
71
|
-
data: unknown[];
|
|
72
|
-
nextCursor: string | null;
|
|
73
|
-
}>;
|
|
74
|
-
getSkill(id: string): Promise<{
|
|
75
|
-
data: unknown;
|
|
76
|
-
}>;
|
|
77
|
-
updateSkill(id: string, body: {
|
|
78
|
-
name?: string;
|
|
79
|
-
description?: string;
|
|
80
|
-
content?: string;
|
|
81
|
-
}): Promise<{
|
|
82
|
-
data: unknown;
|
|
83
|
-
}>;
|
|
84
|
-
/**
|
|
85
|
-
* Fetch the full context for a project in parallel: project metadata,
|
|
86
|
-
* team documents, project documents, and team skills.
|
|
87
|
-
* Returns a structured bundle optimized for coding agent consumption.
|
|
88
|
-
*/
|
|
89
|
-
getProjectContext(projectId: string): Promise<Record<string, unknown>>;
|
|
90
|
-
listBacklogItems(projectId: string, opts?: {
|
|
91
|
-
limit?: number;
|
|
92
|
-
}): Promise<{
|
|
93
|
-
data: unknown[];
|
|
94
|
-
nextCursor: string | null;
|
|
95
|
-
}>;
|
|
96
|
-
getBacklogItem(itemId: string): Promise<{
|
|
97
|
-
data: unknown;
|
|
98
|
-
}>;
|
|
99
|
-
listEnvironments(projectId: string): Promise<{
|
|
100
|
-
data: unknown[];
|
|
101
|
-
}>;
|
|
102
|
-
listTeams(opts?: {
|
|
103
|
-
limit?: number;
|
|
104
|
-
}): Promise<{
|
|
105
|
-
data: unknown[];
|
|
106
|
-
nextCursor: string | null;
|
|
107
|
-
}>;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|