@laskoff/mcp-server 0.1.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.
@@ -0,0 +1,15 @@
1
+ import { LaskoffConfig } from '../config';
2
+ import { Task, ProjectInfo, PipelineState, StatusColumn, AITaskLog } from './types';
3
+ export declare class LaskoffClient {
4
+ private http;
5
+ private projectId;
6
+ constructor(config: LaskoffConfig);
7
+ getNextTask(): Promise<Task | null>;
8
+ getTaskDetails(taskId: number): Promise<Task>;
9
+ updateTaskStatus(taskId: number, status?: string, aiStage?: string, aiMetadata?: Record<string, any>): Promise<Task>;
10
+ logAction(taskId: number, stage: string, action: string, details?: Record<string, any>): Promise<AITaskLog>;
11
+ getProjectInfo(): Promise<ProjectInfo>;
12
+ getStatuses(): Promise<StatusColumn[]>;
13
+ getPipelineState(): Promise<PipelineState>;
14
+ }
15
+ //# sourceMappingURL=laskoff-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laskoff-client.d.ts","sourceRoot":"","sources":["../../src/client/laskoff-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpF,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,aAAa;IAY3B,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAKnC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASpH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAS3G,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAKtC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKtC,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;CAIjD"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LaskoffClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class LaskoffClient {
9
+ constructor(config) {
10
+ this.projectId = config.projectId;
11
+ this.http = axios_1.default.create({
12
+ baseURL: `${config.baseUrl}/api/mcp`,
13
+ headers: {
14
+ 'X-MCP-Key': config.mcpKey,
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ timeout: 30000,
18
+ });
19
+ }
20
+ async getNextTask() {
21
+ const { data } = await this.http.get('/tasks/next');
22
+ return data.task || null;
23
+ }
24
+ async getTaskDetails(taskId) {
25
+ const { data } = await this.http.get(`/tasks/${taskId}`);
26
+ return data;
27
+ }
28
+ async updateTaskStatus(taskId, status, aiStage, aiMetadata) {
29
+ const { data } = await this.http.patch(`/tasks/${taskId}/status`, {
30
+ status,
31
+ ai_stage: aiStage,
32
+ ai_metadata: aiMetadata,
33
+ });
34
+ return data;
35
+ }
36
+ async logAction(taskId, stage, action, details) {
37
+ const { data } = await this.http.post(`/tasks/${taskId}/logs`, {
38
+ stage,
39
+ action,
40
+ details,
41
+ });
42
+ return data;
43
+ }
44
+ async getProjectInfo() {
45
+ const { data } = await this.http.get('/project');
46
+ return data;
47
+ }
48
+ async getStatuses() {
49
+ const { data } = await this.http.get('/statuses');
50
+ return data;
51
+ }
52
+ async getPipelineState() {
53
+ const { data } = await this.http.get('/pipeline/state');
54
+ return data;
55
+ }
56
+ }
57
+ exports.LaskoffClient = LaskoffClient;
58
+ //# sourceMappingURL=laskoff-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laskoff-client.js","sourceRoot":"","sources":["../../src/client/laskoff-client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAI7C,MAAa,aAAa;IAIxB,YAAY,MAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,UAAU;YACpC,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,MAAe,EAAE,OAAgB,EAAE,UAAgC;QACxG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,MAAM,SAAS,EAAE;YAChE,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,UAAU;SACxB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,KAAa,EAAE,MAAc,EAAE,OAA6B;QAC1F,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE;YAC7D,KAAK;YACL,MAAM;YACN,OAAO;SACR,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA1DD,sCA0DC"}
@@ -0,0 +1,84 @@
1
+ export interface Task {
2
+ id: number;
3
+ project_id: string;
4
+ task_number: number;
5
+ title: string;
6
+ description: string | null;
7
+ status: string;
8
+ status_name?: string;
9
+ status_slug?: string;
10
+ is_final?: boolean;
11
+ priority: string;
12
+ ai_stage: string | null;
13
+ ai_metadata: Record<string, any>;
14
+ sort_order: number;
15
+ parent_id: number | null;
16
+ created_at: string;
17
+ updated_at: string;
18
+ subtasks?: SubTask[];
19
+ collections?: CollectionInfo[];
20
+ }
21
+ export interface SubTask {
22
+ id: number;
23
+ title: string;
24
+ status: string;
25
+ ai_stage: string | null;
26
+ }
27
+ export interface CollectionInfo {
28
+ id: number;
29
+ name: string;
30
+ collection_type: string;
31
+ collection_status: string;
32
+ }
33
+ export interface StatusColumn {
34
+ id: number;
35
+ name: string;
36
+ slug: string;
37
+ color: string;
38
+ icon: string | null;
39
+ is_final: boolean;
40
+ is_default: boolean;
41
+ sort_order: number;
42
+ }
43
+ export interface Collection {
44
+ id: number;
45
+ name: string;
46
+ collection_type: string;
47
+ status: string;
48
+ task_count: number;
49
+ }
50
+ export interface ProjectInfo {
51
+ project: {
52
+ id: string;
53
+ name: string;
54
+ description: string | null;
55
+ is_vibe_coding: boolean;
56
+ vibe_config: Record<string, any>;
57
+ template_slug: string;
58
+ };
59
+ statuses: StatusColumn[];
60
+ collections: Collection[];
61
+ }
62
+ export interface PipelineState {
63
+ project_id: string;
64
+ status: 'idle' | 'running' | 'paused' | 'error';
65
+ current_task_id: number | null;
66
+ current_stage: string | null;
67
+ current_task_title?: string;
68
+ current_task_number?: number;
69
+ collection_id: number | null;
70
+ config: Record<string, any>;
71
+ started_at: string | null;
72
+ paused_at: string | null;
73
+ error_message: string | null;
74
+ }
75
+ export interface AITaskLog {
76
+ id: string;
77
+ project_id: string;
78
+ task_id: number;
79
+ stage: string;
80
+ action: string;
81
+ details: Record<string, any>;
82
+ created_at: string;
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface LaskoffConfig {
2
+ baseUrl: string;
3
+ mcpKey: string;
4
+ projectId: string;
5
+ }
6
+ export declare function loadConfig(): LaskoffConfig;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,IAAI,aAAa,CAc1C"}
package/dist/config.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadConfig = loadConfig;
4
+ function loadConfig() {
5
+ const baseUrl = process.env.LASKOFF_URL;
6
+ const mcpKey = process.env.LASKOFF_MCP_KEY;
7
+ const projectId = process.env.LASKOFF_PROJECT_ID;
8
+ if (!baseUrl)
9
+ throw new Error('LASKOFF_URL environment variable is required');
10
+ if (!mcpKey)
11
+ throw new Error('LASKOFF_MCP_KEY environment variable is required');
12
+ if (!projectId)
13
+ throw new Error('LASKOFF_PROJECT_ID environment variable is required');
14
+ return {
15
+ baseUrl: baseUrl.replace(/\/$/, ''),
16
+ mcpKey,
17
+ projectId,
18
+ };
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAMA,gCAcC;AAdD,SAAgB,UAAU;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAEjD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAEvF,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACnC,MAAM;QACN,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ const config_1 = require("./config");
6
+ const server_1 = require("./server");
7
+ async function main() {
8
+ const config = (0, config_1.loadConfig)();
9
+ const server = (0, server_1.createServer)(config);
10
+ const transport = new stdio_js_1.StdioServerTransport();
11
+ await server.connect(transport);
12
+ }
13
+ main().catch((error) => {
14
+ console.error('Fatal error:', error);
15
+ process.exit(1);
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAiF;AACjF,qCAAsC;AACtC,qCAAwC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { LaskoffConfig } from './config';
3
+ export declare function createServer(config: LaskoffConfig): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAkC7D"}
package/dist/server.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServer = createServer;
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const laskoff_client_1 = require("./client/laskoff-client");
6
+ const index_1 = require("./tools/index");
7
+ const zod_1 = require("zod");
8
+ function createServer(config) {
9
+ const client = new laskoff_client_1.LaskoffClient(config);
10
+ const server = new mcp_js_1.McpServer({
11
+ name: 'laskoff-mcp-server',
12
+ version: '0.1.0',
13
+ });
14
+ // Register all tools
15
+ for (const tool of index_1.allTools) {
16
+ // Convert Zod schema to JSON Schema shape for MCP SDK
17
+ const shape = tool.inputSchema instanceof zod_1.z.ZodObject
18
+ ? tool.inputSchema.shape
19
+ : {};
20
+ server.tool(tool.name, tool.description, shape, async (input) => {
21
+ try {
22
+ return await tool.handler(client, input);
23
+ }
24
+ catch (error) {
25
+ const message = error.response?.data?.error || error.message || 'Unknown error';
26
+ return {
27
+ content: [{ type: 'text', text: `Error: ${message}` }],
28
+ isError: true,
29
+ };
30
+ }
31
+ });
32
+ }
33
+ return server;
34
+ }
35
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;AAMA,oCAkCC;AAxCD,oEAAoE;AACpE,4DAAwD;AACxD,yCAAyC;AAEzC,6BAAwB;AAExB,SAAgB,YAAY,CAAC,MAAqB;IAChD,MAAM,MAAM,GAAG,IAAI,8BAAa,CAAC,MAAM,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,KAAK,MAAM,IAAI,IAAI,gBAAQ,EAAE,CAAC;QAC5B,sDAAsD;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,YAAY,OAAC,CAAC,SAAS;YACnD,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK;YACxB,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,KAAK,EACL,KAAK,EAAE,KAAU,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC;gBAChF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;oBACtD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ import { LaskoffClient } from '../client/laskoff-client';
3
+ export interface ToolDefinition {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: z.ZodType<any>;
7
+ handler: (client: LaskoffClient, input: any) => Promise<any>;
8
+ }
9
+ export declare const allTools: ToolDefinition[];
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9D;AAqHD,eAAO,MAAM,QAAQ,EAAE,cAAc,EAQpC,CAAC"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allTools = void 0;
4
+ const zod_1 = require("zod");
5
+ // Tool: Get next task
6
+ const getNextTask = {
7
+ name: 'laskoff_get_next_task',
8
+ description: 'Get the next available task from the AI Sprint collection. Returns null if no tasks are available or pipeline is not running.',
9
+ inputSchema: zod_1.z.object({}),
10
+ handler: async (client) => {
11
+ const task = await client.getNextTask();
12
+ if (!task) {
13
+ return { content: [{ type: 'text', text: 'No tasks available in the AI Sprint collection.' }] };
14
+ }
15
+ return {
16
+ content: [{
17
+ type: 'text',
18
+ text: JSON.stringify({
19
+ id: task.id,
20
+ task_number: task.task_number,
21
+ title: task.title,
22
+ description: task.description,
23
+ status: task.status,
24
+ priority: task.priority,
25
+ ai_stage: task.ai_stage,
26
+ }, null, 2)
27
+ }]
28
+ };
29
+ }
30
+ };
31
+ // Tool: Get task details
32
+ const getTaskDetails = {
33
+ name: 'laskoff_get_task_details',
34
+ description: 'Get full details of a specific task including description, subtasks, and collections.',
35
+ inputSchema: zod_1.z.object({
36
+ taskId: zod_1.z.number().describe('The ID of the task to retrieve'),
37
+ }),
38
+ handler: async (client, input) => {
39
+ const task = await client.getTaskDetails(input.taskId);
40
+ return { content: [{ type: 'text', text: JSON.stringify(task, null, 2) }] };
41
+ }
42
+ };
43
+ // Tool: Update task status
44
+ const updateTaskStatus = {
45
+ name: 'laskoff_update_task_status',
46
+ description: 'Update a task\'s status and/or AI stage. Use this to move tasks through the pipeline stages: analysis → planning → in-development → testing → code-review → done.',
47
+ inputSchema: zod_1.z.object({
48
+ taskId: zod_1.z.number().describe('The ID of the task to update'),
49
+ status: zod_1.z.string().optional().describe('New status slug (e.g. "analysis", "in-development", "done")'),
50
+ aiStage: zod_1.z.string().optional().describe('AI pipeline stage: analysis, planning, coding, testing, review, done'),
51
+ aiMetadata: zod_1.z.record(zod_1.z.any()).optional().describe('Optional metadata to attach to the task'),
52
+ }),
53
+ handler: async (client, input) => {
54
+ const task = await client.updateTaskStatus(input.taskId, input.status, input.aiStage, input.aiMetadata);
55
+ return { content: [{ type: 'text', text: JSON.stringify(task, null, 2) }] };
56
+ }
57
+ };
58
+ // Tool: Log action
59
+ const logAction = {
60
+ name: 'laskoff_log_action',
61
+ description: 'Log an AI action for audit trail. Use this to record what the AI agent is doing at each stage.',
62
+ inputSchema: zod_1.z.object({
63
+ taskId: zod_1.z.number().describe('The ID of the task this action relates to'),
64
+ stage: zod_1.z.string().describe('Pipeline stage: analysis, planning, coding, testing, review'),
65
+ action: zod_1.z.string().describe('Action description: stage_started, stage_completed, error, file_created, test_passed, etc.'),
66
+ details: zod_1.z.record(zod_1.z.any()).optional().describe('Additional details about the action (files modified, test results, etc.)'),
67
+ }),
68
+ handler: async (client, input) => {
69
+ const log = await client.logAction(input.taskId, input.stage, input.action, input.details);
70
+ return { content: [{ type: 'text', text: `Action logged: ${input.stage}/${input.action}` }] };
71
+ }
72
+ };
73
+ // Tool: Get project info
74
+ const getProjectInfo = {
75
+ name: 'laskoff_get_project_info',
76
+ description: 'Get project information including available statuses, collections, and vibe coding configuration.',
77
+ inputSchema: zod_1.z.object({}),
78
+ handler: async (client) => {
79
+ const info = await client.getProjectInfo();
80
+ return { content: [{ type: 'text', text: JSON.stringify(info, null, 2) }] };
81
+ }
82
+ };
83
+ // Tool: List statuses
84
+ const listStatuses = {
85
+ name: 'laskoff_list_statuses',
86
+ description: 'List all available status columns for the project. Useful to know which status slugs to use when updating tasks.',
87
+ inputSchema: zod_1.z.object({}),
88
+ handler: async (client) => {
89
+ const statuses = await client.getStatuses();
90
+ return {
91
+ content: [{
92
+ type: 'text',
93
+ text: statuses.map(s => `${s.slug} (${s.name}) ${s.is_final ? '[FINAL]' : ''}`).join('\n')
94
+ }]
95
+ };
96
+ }
97
+ };
98
+ // Tool: Get pipeline state
99
+ const getPipelineState = {
100
+ name: 'laskoff_get_pipeline_state',
101
+ description: 'Get the current AI pipeline state (idle, running, paused, error). Check this before starting work on tasks.',
102
+ inputSchema: zod_1.z.object({}),
103
+ handler: async (client) => {
104
+ const state = await client.getPipelineState();
105
+ return { content: [{ type: 'text', text: JSON.stringify(state, null, 2) }] };
106
+ }
107
+ };
108
+ exports.allTools = [
109
+ getNextTask,
110
+ getTaskDetails,
111
+ updateTaskStatus,
112
+ logAction,
113
+ getProjectInfo,
114
+ listStatuses,
115
+ getPipelineState,
116
+ ];
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAUxB,sBAAsB;AACtB,MAAM,WAAW,GAAmB;IAClC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,+HAA+H;IAC5I,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAC,EAAE,CAAC;QAClG,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBACxB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,yBAAyB;AACzB,MAAM,cAAc,GAAmB;IACrC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,uFAAuF;IACpG,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC9D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;CACF,CAAC;AAEF,2BAA2B;AAC3B,MAAM,gBAAgB,GAAmB;IACvC,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,mKAAmK;IAChL,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3D,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QACrG,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;QAC/G,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC7F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CACxC,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,CACjB,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;CACF,CAAC;AAEF,mBAAmB;AACnB,MAAM,SAAS,GAAmB;IAChC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,gGAAgG;IAC7G,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QACzF,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4FAA4F,CAAC;QACzH,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;KAC3H,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;IAChG,CAAC;CACF,CAAC;AAEF,yBAAyB;AACzB,MAAM,cAAc,GAAmB;IACrC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,mGAAmG;IAChH,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;CACF,CAAC;AAEF,sBAAsB;AACtB,MAAM,YAAY,GAAmB;IACnC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,kHAAkH;IAC/H,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC3F,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,2BAA2B;AAC3B,MAAM,gBAAgB,GAAmB;IACvC,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,6GAA6G;IAC1H,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;CACF,CAAC;AAEW,QAAA,QAAQ,GAAqB;IACxC,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,YAAY;IACZ,gBAAgB;CACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@laskoff/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP Server for Laskoff backlog - enables AI coding agents to manage tasks",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "laskoff-mcp": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "ts-node src/index.ts",
12
+ "start": "node dist/index.js"
13
+ },
14
+ "keywords": ["mcp", "laskoff", "backlog", "ai-coding", "vibe-coding"],
15
+ "license": "MIT",
16
+ "files": ["dist"],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.0.0",
22
+ "axios": "^1.7.0",
23
+ "zod": "^3.23.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.4.0",
28
+ "ts-node": "^10.9.0"
29
+ }
30
+ }