@theyahia/megaplan-mcp 0.0.1 → 1.0.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/LICENSE +21 -0
- package/README.md +41 -2
- package/dist/client.d.ts +2 -0
- package/dist/client.js +61 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/deals.d.ts +21 -0
- package/dist/tools/deals.js +24 -0
- package/dist/tools/deals.js.map +1 -0
- package/dist/tools/tasks.d.ts +41 -0
- package/dist/tools/tasks.js +46 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +28 -9
- package/index.js +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 theYahia
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# @theyahia/megaplan-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MCP server for **Megaplan** project management. Provides tools for managing tasks and deals via API v3.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Tools
|
|
6
|
+
|
|
7
|
+
| Tool | Description |
|
|
8
|
+
|------|------------|
|
|
9
|
+
| `get_tasks` | List tasks with filters by status, responsible, search |
|
|
10
|
+
| `create_task` | Create a new task with name, description, deadline |
|
|
11
|
+
| `get_deals` | List deals with filters by status, responsible, search |
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
1. In Megaplan, go to **Settings > Integration > API**
|
|
16
|
+
2. Generate an access token
|
|
17
|
+
|
|
18
|
+
## Usage with Claude Desktop
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"mcpServers": {
|
|
23
|
+
"megaplan": {
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["-y", "@theyahia/megaplan-mcp"],
|
|
26
|
+
"env": {
|
|
27
|
+
"MEGAPLAN_DOMAIN": "yourcompany.megaplan.ru",
|
|
28
|
+
"MEGAPLAN_TOKEN": "your-access-token"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Environment Variables
|
|
36
|
+
|
|
37
|
+
| Variable | Required | Description |
|
|
38
|
+
|----------|----------|-------------|
|
|
39
|
+
| `MEGAPLAN_DOMAIN` | Yes | Your Megaplan domain (e.g. `yourcompany.megaplan.ru`) |
|
|
40
|
+
| `MEGAPLAN_TOKEN` | Yes | Bearer access token |
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
MIT
|
package/dist/client.d.ts
ADDED
package/dist/client.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const TIMEOUT = 15_000;
|
|
2
|
+
const MAX_RETRIES = 3;
|
|
3
|
+
function getBaseUrl() {
|
|
4
|
+
const domain = process.env.MEGAPLAN_DOMAIN;
|
|
5
|
+
if (!domain)
|
|
6
|
+
throw new Error("MEGAPLAN_DOMAIN is not set");
|
|
7
|
+
const clean = domain.replace(/^https?:\/\//, "").replace(/\/$/, "");
|
|
8
|
+
return `https://${clean}/api/v3`;
|
|
9
|
+
}
|
|
10
|
+
function getToken() {
|
|
11
|
+
const token = process.env.MEGAPLAN_TOKEN;
|
|
12
|
+
if (!token)
|
|
13
|
+
throw new Error("MEGAPLAN_TOKEN is not set");
|
|
14
|
+
return token;
|
|
15
|
+
}
|
|
16
|
+
export async function megaplanGet(path, params) {
|
|
17
|
+
const query = params ? `?${new URLSearchParams(params).toString()}` : "";
|
|
18
|
+
return megaplanRequest("GET", `${path}${query}`);
|
|
19
|
+
}
|
|
20
|
+
export async function megaplanPost(path, body) {
|
|
21
|
+
return megaplanRequest("POST", path, body);
|
|
22
|
+
}
|
|
23
|
+
async function megaplanRequest(method, path, body) {
|
|
24
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT);
|
|
27
|
+
try {
|
|
28
|
+
const response = await fetch(`${getBaseUrl()}${path}`, {
|
|
29
|
+
method,
|
|
30
|
+
headers: {
|
|
31
|
+
"Authorization": `Bearer ${getToken()}`,
|
|
32
|
+
"Content-Type": "application/json",
|
|
33
|
+
"Accept": "application/json",
|
|
34
|
+
},
|
|
35
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
36
|
+
signal: controller.signal,
|
|
37
|
+
});
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
if (response.ok)
|
|
40
|
+
return response.json();
|
|
41
|
+
if ((response.status === 429 || response.status >= 500) && attempt < MAX_RETRIES) {
|
|
42
|
+
const delay = Math.min(1000 * 2 ** (attempt - 1), 8000);
|
|
43
|
+
console.error(`[megaplan-mcp] ${response.status}, retry in ${delay}ms (${attempt}/${MAX_RETRIES})`);
|
|
44
|
+
await new Promise(r => setTimeout(r, delay));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const text = await response.text();
|
|
48
|
+
throw new Error(`Megaplan HTTP ${response.status}: ${text}`);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
if (error instanceof DOMException && error.name === "AbortError" && attempt < MAX_RETRIES) {
|
|
53
|
+
console.error(`[megaplan-mcp] Timeout, retry (${attempt}/${MAX_RETRIES})`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
throw new Error("Megaplan: all retries exhausted");
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { getTasksSchema, handleGetTasks, createTaskSchema, handleCreateTask } from "./tools/tasks.js";
|
|
5
|
+
import { getDealsSchema, handleGetDeals } from "./tools/deals.js";
|
|
6
|
+
const server = new McpServer({
|
|
7
|
+
name: "megaplan-mcp",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
});
|
|
10
|
+
server.tool("get_tasks", "List tasks from Megaplan with filters by status, responsible user, and search.", getTasksSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleGetTasks(params) }] }));
|
|
11
|
+
server.tool("create_task", "Create a new task in Megaplan with name, description, responsible user, and deadline.", createTaskSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleCreateTask(params) }] }));
|
|
12
|
+
server.tool("get_deals", "List deals from Megaplan with filters by status, responsible user, and search.", getDealsSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleGetDeals(params) }] }));
|
|
13
|
+
async function main() {
|
|
14
|
+
const transport = new StdioServerTransport();
|
|
15
|
+
await server.connect(transport);
|
|
16
|
+
console.error("[megaplan-mcp] Server started. 3 tools available.");
|
|
17
|
+
}
|
|
18
|
+
main().catch((error) => {
|
|
19
|
+
console.error("[megaplan-mcp] Error:", error);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,WAAW,EACX,gFAAgF,EAChF,cAAc,CAAC,KAAK,EACpB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CACxF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,uFAAuF,EACvF,gBAAgB,CAAC,KAAK,EACtB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAC1F,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,gFAAgF,EAChF,cAAc,CAAC,KAAK,EACpB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CACxF,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACrE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getDealsSchema: z.ZodObject<{
|
|
3
|
+
filter_status: z.ZodOptional<z.ZodString>;
|
|
4
|
+
filter_responsible_id: z.ZodOptional<z.ZodString>;
|
|
5
|
+
search: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
limit: number;
|
|
10
|
+
offset: number;
|
|
11
|
+
filter_status?: string | undefined;
|
|
12
|
+
filter_responsible_id?: string | undefined;
|
|
13
|
+
search?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
filter_status?: string | undefined;
|
|
16
|
+
filter_responsible_id?: string | undefined;
|
|
17
|
+
search?: string | undefined;
|
|
18
|
+
limit?: number | undefined;
|
|
19
|
+
offset?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function handleGetDeals(params: z.infer<typeof getDealsSchema>): Promise<string>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { megaplanGet } from "../client.js";
|
|
3
|
+
export const getDealsSchema = z.object({
|
|
4
|
+
filter_status: z.string().optional().describe("Filter by deal status"),
|
|
5
|
+
filter_responsible_id: z.string().optional().describe("Filter by responsible employee ID"),
|
|
6
|
+
search: z.string().optional().describe("Search by deal name"),
|
|
7
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
8
|
+
offset: z.number().int().default(0).describe("Offset for pagination"),
|
|
9
|
+
});
|
|
10
|
+
export async function handleGetDeals(params) {
|
|
11
|
+
const query = {
|
|
12
|
+
limit: String(params.limit),
|
|
13
|
+
offset: String(params.offset),
|
|
14
|
+
};
|
|
15
|
+
if (params.filter_status)
|
|
16
|
+
query["filter[status]"] = params.filter_status;
|
|
17
|
+
if (params.filter_responsible_id)
|
|
18
|
+
query["filter[responsible]"] = params.filter_responsible_id;
|
|
19
|
+
if (params.search)
|
|
20
|
+
query["search"] = params.search;
|
|
21
|
+
const result = await megaplanGet("/deal", query);
|
|
22
|
+
return JSON.stringify(result, null, 2);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=deals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deals.js","sourceRoot":"","sources":["../../src/tools/deals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACtE,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAChF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CACtE,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsC;IACzE,MAAM,KAAK,GAA2B;QACpC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KAC9B,CAAC;IACF,IAAI,MAAM,CAAC,aAAa;QAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC;IACzE,IAAI,MAAM,CAAC,qBAAqB;QAAE,KAAK,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAC9F,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getTasksSchema: z.ZodObject<{
|
|
3
|
+
filter_status: z.ZodOptional<z.ZodString>;
|
|
4
|
+
filter_responsible_id: z.ZodOptional<z.ZodString>;
|
|
5
|
+
search: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
limit: number;
|
|
10
|
+
offset: number;
|
|
11
|
+
filter_status?: string | undefined;
|
|
12
|
+
filter_responsible_id?: string | undefined;
|
|
13
|
+
search?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
filter_status?: string | undefined;
|
|
16
|
+
filter_responsible_id?: string | undefined;
|
|
17
|
+
search?: string | undefined;
|
|
18
|
+
limit?: number | undefined;
|
|
19
|
+
offset?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function handleGetTasks(params: z.infer<typeof getTasksSchema>): Promise<string>;
|
|
22
|
+
export declare const createTaskSchema: z.ZodObject<{
|
|
23
|
+
name: z.ZodString;
|
|
24
|
+
description: z.ZodOptional<z.ZodString>;
|
|
25
|
+
responsible_id: z.ZodString;
|
|
26
|
+
deadline: z.ZodOptional<z.ZodString>;
|
|
27
|
+
parent_id: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
name: string;
|
|
30
|
+
responsible_id: string;
|
|
31
|
+
description?: string | undefined;
|
|
32
|
+
deadline?: string | undefined;
|
|
33
|
+
parent_id?: string | undefined;
|
|
34
|
+
}, {
|
|
35
|
+
name: string;
|
|
36
|
+
responsible_id: string;
|
|
37
|
+
description?: string | undefined;
|
|
38
|
+
deadline?: string | undefined;
|
|
39
|
+
parent_id?: string | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
export declare function handleCreateTask(params: z.infer<typeof createTaskSchema>): Promise<string>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { megaplanGet, megaplanPost } from "../client.js";
|
|
3
|
+
export const getTasksSchema = z.object({
|
|
4
|
+
filter_status: z.string().optional().describe("Filter by status (e.g. active, completed, delayed)"),
|
|
5
|
+
filter_responsible_id: z.string().optional().describe("Filter by responsible employee ID"),
|
|
6
|
+
search: z.string().optional().describe("Search by task name"),
|
|
7
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
8
|
+
offset: z.number().int().default(0).describe("Offset for pagination"),
|
|
9
|
+
});
|
|
10
|
+
export async function handleGetTasks(params) {
|
|
11
|
+
const query = {
|
|
12
|
+
limit: String(params.limit),
|
|
13
|
+
offset: String(params.offset),
|
|
14
|
+
};
|
|
15
|
+
if (params.filter_status)
|
|
16
|
+
query["filter[status]"] = params.filter_status;
|
|
17
|
+
if (params.filter_responsible_id)
|
|
18
|
+
query["filter[responsible]"] = params.filter_responsible_id;
|
|
19
|
+
if (params.search)
|
|
20
|
+
query["search"] = params.search;
|
|
21
|
+
const result = await megaplanGet("/task", query);
|
|
22
|
+
return JSON.stringify(result, null, 2);
|
|
23
|
+
}
|
|
24
|
+
export const createTaskSchema = z.object({
|
|
25
|
+
name: z.string().describe("Task name/title"),
|
|
26
|
+
description: z.string().optional().describe("Task description"),
|
|
27
|
+
responsible_id: z.string().describe("Responsible employee ID"),
|
|
28
|
+
deadline: z.string().optional().describe("Deadline in ISO format (e.g. 2025-12-31T23:59:59+03:00)"),
|
|
29
|
+
parent_id: z.string().optional().describe("Parent task ID (for subtasks)"),
|
|
30
|
+
});
|
|
31
|
+
export async function handleCreateTask(params) {
|
|
32
|
+
const body = {
|
|
33
|
+
contentType: "Task",
|
|
34
|
+
name: params.name,
|
|
35
|
+
responsible: { id: params.responsible_id, contentType: "Employee" },
|
|
36
|
+
};
|
|
37
|
+
if (params.description)
|
|
38
|
+
body.description = params.description;
|
|
39
|
+
if (params.deadline)
|
|
40
|
+
body.deadline = params.deadline;
|
|
41
|
+
if (params.parent_id)
|
|
42
|
+
body.parent = { id: params.parent_id, contentType: "Task" };
|
|
43
|
+
const result = await megaplanPost("/task", body);
|
|
44
|
+
return JSON.stringify(result, null, 2);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface MegaplanTask {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
status: string;
|
|
6
|
+
responsible?: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
deadline?: string;
|
|
11
|
+
priority?: string;
|
|
12
|
+
created: string;
|
|
13
|
+
modified: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MegaplanDeal {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
status: string;
|
|
19
|
+
amount?: number;
|
|
20
|
+
responsible?: {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
};
|
|
24
|
+
contact?: {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
created: string;
|
|
29
|
+
modified: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MegaplanListResult<T> {
|
|
32
|
+
meta: {
|
|
33
|
+
totalCount: number;
|
|
34
|
+
limit: number;
|
|
35
|
+
offset: number;
|
|
36
|
+
};
|
|
37
|
+
data: T[];
|
|
38
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,13 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theyahia/megaplan-mcp",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "MCP server for Megaplan
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Megaplan — tasks, deals management via API v3.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": { "megaplan-mcp": "dist/index.js" },
|
|
8
|
+
"files": ["dist"],
|
|
9
|
+
"engines": { "node": ">=18.0.0" },
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
18
|
+
"zod": "^3.24.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^22.0.0",
|
|
22
|
+
"tsx": "^4.19.0",
|
|
23
|
+
"typescript": "^5.7.0"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": { "access": "public" },
|
|
26
|
+
"mcpName": "io.github.theYahia/megaplan-mcp",
|
|
27
|
+
"keywords": ["mcp", "mcp-server", "model-context-protocol", "claude", "ai", "russian-api", "megaplan", "tasks", "deals", "project-management"],
|
|
6
28
|
"license": "MIT",
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"type": "git",
|
|
11
|
-
"url": "https://github.com/theYahia/megaplan-mcp"
|
|
12
|
-
}
|
|
29
|
+
"repository": { "type": "git", "url": "https://github.com/theYahia/megaplan-mcp.git" },
|
|
30
|
+
"homepage": "https://github.com/theYahia/megaplan-mcp#readme",
|
|
31
|
+
"author": "Yahia"
|
|
13
32
|
}
|
package/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = {}
|