@theyahia/megaplan-mcp 1.0.0 → 1.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.
- package/LICENSE +21 -21
- package/README.md +75 -7
- package/dist/client.js +47 -7
- package/dist/client.js.map +1 -1
- package/dist/http.d.ts +2 -0
- package/dist/http.js +52 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +59 -11
- package/dist/index.js.map +1 -1
- package/dist/tools/comments.d.ts +32 -0
- package/dist/tools/comments.js +34 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/deals.d.ts +23 -0
- package/dist/tools/deals.js +26 -1
- package/dist/tools/deals.js.map +1 -1
- package/dist/tools/employees.d.ts +18 -0
- package/dist/tools/employees.js +21 -0
- package/dist/tools/employees.js.map +1 -0
- package/dist/tools/projects.d.ts +18 -0
- package/dist/tools/projects.js +21 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/package.json +36 -8
package/LICENSE
CHANGED
|
@@ -1,21 +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.
|
|
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,20 +1,38 @@
|
|
|
1
1
|
# @theyahia/megaplan-mcp
|
|
2
2
|
|
|
3
|
-
MCP server for **Megaplan** project management.
|
|
3
|
+
MCP server for **Megaplan** project management. Tasks, deals, projects, employees, comments via API v3.
|
|
4
4
|
|
|
5
|
-
## Tools
|
|
5
|
+
## Tools (8)
|
|
6
6
|
|
|
7
7
|
| Tool | Description |
|
|
8
8
|
|------|------------|
|
|
9
9
|
| `get_tasks` | List tasks with filters by status, responsible, search |
|
|
10
|
-
| `create_task` | Create a
|
|
11
|
-
| `get_deals` | List deals with filters
|
|
10
|
+
| `create_task` | Create a task with name, description, deadline |
|
|
11
|
+
| `get_deals` | List deals with filters |
|
|
12
|
+
| `create_deal` | Create a deal with pipeline, amount, contact |
|
|
13
|
+
| `get_projects` | List projects with filters |
|
|
14
|
+
| `get_employees` | List employees with search, department filter |
|
|
15
|
+
| `get_comments` | List comments on task/deal/project |
|
|
16
|
+
| `create_comment` | Add a comment to task/deal/project |
|
|
17
|
+
|
|
18
|
+
## Skills (Prompts)
|
|
19
|
+
|
|
20
|
+
| Skill | Description |
|
|
21
|
+
|-------|------------|
|
|
22
|
+
| `my-tasks-today` | "Мои задачи на сегодня" — active tasks sorted by urgency |
|
|
23
|
+
| `create-deal-wizard` | "Создай сделку" — guided deal creation |
|
|
12
24
|
|
|
13
25
|
## Setup
|
|
14
26
|
|
|
27
|
+
### Option A: Access Token
|
|
28
|
+
|
|
15
29
|
1. In Megaplan, go to **Settings > Integration > API**
|
|
16
30
|
2. Generate an access token
|
|
17
31
|
|
|
32
|
+
### Option B: Login + Password
|
|
33
|
+
|
|
34
|
+
Use your Megaplan login credentials (email + password).
|
|
35
|
+
|
|
18
36
|
## Usage with Claude Desktop
|
|
19
37
|
|
|
20
38
|
```json
|
|
@@ -24,7 +42,7 @@ MCP server for **Megaplan** project management. Provides tools for managing task
|
|
|
24
42
|
"command": "npx",
|
|
25
43
|
"args": ["-y", "@theyahia/megaplan-mcp"],
|
|
26
44
|
"env": {
|
|
27
|
-
"MEGAPLAN_DOMAIN": "yourcompany
|
|
45
|
+
"MEGAPLAN_DOMAIN": "yourcompany",
|
|
28
46
|
"MEGAPLAN_TOKEN": "your-access-token"
|
|
29
47
|
}
|
|
30
48
|
}
|
|
@@ -32,12 +50,62 @@ MCP server for **Megaplan** project management. Provides tools for managing task
|
|
|
32
50
|
}
|
|
33
51
|
```
|
|
34
52
|
|
|
53
|
+
Or with login/password:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"megaplan": {
|
|
59
|
+
"command": "npx",
|
|
60
|
+
"args": ["-y", "@theyahia/megaplan-mcp"],
|
|
61
|
+
"env": {
|
|
62
|
+
"MEGAPLAN_DOMAIN": "yourcompany",
|
|
63
|
+
"MEGAPLAN_LOGIN": "user@example.com",
|
|
64
|
+
"MEGAPLAN_PASSWORD": "your-password"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Streamable HTTP Transport
|
|
72
|
+
|
|
73
|
+
Run with `--http` flag for HTTP-based transport (useful for remote/cloud deployments):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
MEGAPLAN_DOMAIN=yourcompany MEGAPLAN_TOKEN=xxx npx @theyahia/megaplan-mcp --http
|
|
77
|
+
# Listening on http://localhost:3000/mcp
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Custom port via `PORT` env var.
|
|
81
|
+
|
|
35
82
|
## Environment Variables
|
|
36
83
|
|
|
37
84
|
| Variable | Required | Description |
|
|
38
85
|
|----------|----------|-------------|
|
|
39
|
-
| `MEGAPLAN_DOMAIN` | Yes |
|
|
40
|
-
| `MEGAPLAN_TOKEN` |
|
|
86
|
+
| `MEGAPLAN_DOMAIN` | Yes | Megaplan subdomain (e.g. `yourcompany`) |
|
|
87
|
+
| `MEGAPLAN_TOKEN` | One of | Bearer access token |
|
|
88
|
+
| `MEGAPLAN_LOGIN` | One of | Login email (if no token) |
|
|
89
|
+
| `MEGAPLAN_PASSWORD` | One of | Password (if no token) |
|
|
90
|
+
| `PORT` | No | HTTP port for `--http` mode (default: 3000) |
|
|
91
|
+
|
|
92
|
+
## Referral
|
|
93
|
+
|
|
94
|
+
Get **20-50% recurring** commission by referring Megaplan:
|
|
95
|
+
|
|
96
|
+
- [Megaplan Partner Program](https://megaplan.ru/partners/)
|
|
97
|
+
- Sign up as a partner, get your referral link
|
|
98
|
+
- Every client you bring = recurring revenue share
|
|
99
|
+
|
|
100
|
+
## Development
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm install
|
|
104
|
+
npm run build
|
|
105
|
+
npm test
|
|
106
|
+
npm run dev # stdio mode with tsx
|
|
107
|
+
npm run start:http # HTTP mode
|
|
108
|
+
```
|
|
41
109
|
|
|
42
110
|
## License
|
|
43
111
|
|
package/dist/client.js
CHANGED
|
@@ -1,18 +1,49 @@
|
|
|
1
1
|
const TIMEOUT = 15_000;
|
|
2
2
|
const MAX_RETRIES = 3;
|
|
3
|
-
|
|
3
|
+
let cachedToken = null;
|
|
4
|
+
function getDomain() {
|
|
4
5
|
const domain = process.env.MEGAPLAN_DOMAIN;
|
|
5
6
|
if (!domain)
|
|
6
7
|
throw new Error("MEGAPLAN_DOMAIN is not set");
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
return domain.replace(/^https?:\/\//, "").replace(/\/$/, "");
|
|
9
|
+
}
|
|
10
|
+
function getBaseUrl() {
|
|
11
|
+
return `https://${getDomain()}/api/v3`;
|
|
9
12
|
}
|
|
10
|
-
function
|
|
11
|
-
const
|
|
13
|
+
async function authenticate() {
|
|
14
|
+
const login = process.env.MEGAPLAN_LOGIN;
|
|
15
|
+
const password = process.env.MEGAPLAN_PASSWORD;
|
|
16
|
+
if (!login || !password) {
|
|
17
|
+
throw new Error("Either MEGAPLAN_TOKEN or (MEGAPLAN_LOGIN + MEGAPLAN_PASSWORD) must be set");
|
|
18
|
+
}
|
|
19
|
+
const response = await fetch(`https://${getDomain()}/api/v3/auth/access_token`, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: { "Content-Type": "application/json", "Accept": "application/json" },
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
username: login,
|
|
24
|
+
password: password,
|
|
25
|
+
grant_type: "password",
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
const text = await response.text();
|
|
30
|
+
throw new Error(`Megaplan auth failed (${response.status}): ${text}`);
|
|
31
|
+
}
|
|
32
|
+
const data = (await response.json());
|
|
33
|
+
const token = data.access_token ?? data.data?.access_token;
|
|
12
34
|
if (!token)
|
|
13
|
-
throw new Error("
|
|
35
|
+
throw new Error("Megaplan auth: no access_token in response");
|
|
14
36
|
return token;
|
|
15
37
|
}
|
|
38
|
+
async function getToken() {
|
|
39
|
+
const envToken = process.env.MEGAPLAN_TOKEN;
|
|
40
|
+
if (envToken)
|
|
41
|
+
return envToken;
|
|
42
|
+
if (cachedToken)
|
|
43
|
+
return cachedToken;
|
|
44
|
+
cachedToken = await authenticate();
|
|
45
|
+
return cachedToken;
|
|
46
|
+
}
|
|
16
47
|
export async function megaplanGet(path, params) {
|
|
17
48
|
const query = params ? `?${new URLSearchParams(params).toString()}` : "";
|
|
18
49
|
return megaplanRequest("GET", `${path}${query}`);
|
|
@@ -21,6 +52,7 @@ export async function megaplanPost(path, body) {
|
|
|
21
52
|
return megaplanRequest("POST", path, body);
|
|
22
53
|
}
|
|
23
54
|
async function megaplanRequest(method, path, body) {
|
|
55
|
+
const token = await getToken();
|
|
24
56
|
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
25
57
|
const controller = new AbortController();
|
|
26
58
|
const timer = setTimeout(() => controller.abort(), TIMEOUT);
|
|
@@ -28,7 +60,7 @@ async function megaplanRequest(method, path, body) {
|
|
|
28
60
|
const response = await fetch(`${getBaseUrl()}${path}`, {
|
|
29
61
|
method,
|
|
30
62
|
headers: {
|
|
31
|
-
"Authorization": `Bearer ${
|
|
63
|
+
"Authorization": `Bearer ${token}`,
|
|
32
64
|
"Content-Type": "application/json",
|
|
33
65
|
"Accept": "application/json",
|
|
34
66
|
},
|
|
@@ -36,6 +68,14 @@ async function megaplanRequest(method, path, body) {
|
|
|
36
68
|
signal: controller.signal,
|
|
37
69
|
});
|
|
38
70
|
clearTimeout(timer);
|
|
71
|
+
if (response.status === 401 && cachedToken) {
|
|
72
|
+
// Token expired, re-authenticate
|
|
73
|
+
cachedToken = null;
|
|
74
|
+
const newToken = await getToken();
|
|
75
|
+
if (newToken !== token) {
|
|
76
|
+
continue; // Retry with new token
|
|
77
|
+
}
|
|
78
|
+
}
|
|
39
79
|
if (response.ok)
|
|
40
80
|
return response.json();
|
|
41
81
|
if ((response.status === 429 || response.status >= 500) && attempt < MAX_RETRIES) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
package/dist/http.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
export async function startHttpServer(server, port) {
|
|
5
|
+
const app = express();
|
|
6
|
+
app.use(express.json());
|
|
7
|
+
const transports = new Map();
|
|
8
|
+
app.post("/mcp", async (req, res) => {
|
|
9
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
10
|
+
if (sessionId && transports.has(sessionId)) {
|
|
11
|
+
const transport = transports.get(sessionId);
|
|
12
|
+
await transport.handleRequest(req, res, req.body);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const newSessionId = randomUUID();
|
|
16
|
+
const transport = new StreamableHTTPServerTransport({
|
|
17
|
+
sessionIdGenerator: () => newSessionId,
|
|
18
|
+
});
|
|
19
|
+
transports.set(newSessionId, transport);
|
|
20
|
+
transport.onclose = () => transports.delete(newSessionId);
|
|
21
|
+
await server.connect(transport);
|
|
22
|
+
await transport.handleRequest(req, res, req.body);
|
|
23
|
+
});
|
|
24
|
+
app.get("/mcp", async (req, res) => {
|
|
25
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
26
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
27
|
+
res.status(400).json({ error: "No valid session. POST /mcp first." });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const transport = transports.get(sessionId);
|
|
31
|
+
await transport.handleRequest(req, res);
|
|
32
|
+
});
|
|
33
|
+
app.delete("/mcp", async (req, res) => {
|
|
34
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
35
|
+
if (sessionId && transports.has(sessionId)) {
|
|
36
|
+
const transport = transports.get(sessionId);
|
|
37
|
+
await transport.handleRequest(req, res);
|
|
38
|
+
transports.delete(sessionId);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
res.status(200).end();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
app.get("/health", (_req, res) => {
|
|
45
|
+
res.json({ status: "ok", tools: 8, skills: 2, sessions: transports.size });
|
|
46
|
+
});
|
|
47
|
+
app.listen(port, () => {
|
|
48
|
+
console.error(`[megaplan-mcp] HTTP server on http://localhost:${port}/mcp (Streamable HTTP)`);
|
|
49
|
+
console.error(`[megaplan-mcp] Health: http://localhost:${port}/health`);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -2,18 +2,66 @@
|
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { getTasksSchema, handleGetTasks, createTaskSchema, handleCreateTask } from "./tools/tasks.js";
|
|
5
|
-
import { getDealsSchema, handleGetDeals } from "./tools/deals.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
server
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
import { getDealsSchema, handleGetDeals, createDealSchema, handleCreateDeal } from "./tools/deals.js";
|
|
6
|
+
import { getProjectsSchema, handleGetProjects } from "./tools/projects.js";
|
|
7
|
+
import { getEmployeesSchema, handleGetEmployees } from "./tools/employees.js";
|
|
8
|
+
import { getCommentsSchema, handleGetComments, createCommentSchema, handleCreateComment } from "./tools/comments.js";
|
|
9
|
+
export function createServer() {
|
|
10
|
+
const server = new McpServer({
|
|
11
|
+
name: "megaplan-mcp",
|
|
12
|
+
version: "1.1.0",
|
|
13
|
+
});
|
|
14
|
+
// ── Tasks ──
|
|
15
|
+
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) }] }));
|
|
16
|
+
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) }] }));
|
|
17
|
+
// ── Deals ──
|
|
18
|
+
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) }] }));
|
|
19
|
+
server.tool("create_deal", "Create a new deal in Megaplan with name, pipeline, responsible user, and amount.", createDealSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleCreateDeal(params) }] }));
|
|
20
|
+
// ── Projects ──
|
|
21
|
+
server.tool("get_projects", "List projects from Megaplan with filters by status and search.", getProjectsSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleGetProjects(params) }] }));
|
|
22
|
+
// ── Employees ──
|
|
23
|
+
server.tool("get_employees", "List employees from Megaplan with search and department filter.", getEmployeesSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleGetEmployees(params) }] }));
|
|
24
|
+
// ── Comments ──
|
|
25
|
+
server.tool("get_comments", "List comments for a task, deal, or project in Megaplan.", getCommentsSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleGetComments(params) }] }));
|
|
26
|
+
server.tool("create_comment", "Add a comment to a task, deal, or project in Megaplan.", createCommentSchema.shape, async (params) => ({ content: [{ type: "text", text: await handleCreateComment(params) }] }));
|
|
27
|
+
// ── Skills (prompts) ──
|
|
28
|
+
server.prompt("my-tasks-today", "Мои задачи на сегодня — shows your tasks due today or overdue", {}, async () => ({
|
|
29
|
+
messages: [
|
|
30
|
+
{
|
|
31
|
+
role: "user",
|
|
32
|
+
content: {
|
|
33
|
+
type: "text",
|
|
34
|
+
text: "Используй get_tasks с filter_status='active' чтобы получить мои активные задачи. Покажи список задач с дедлайнами, отсортируй по срочности. Если задача просрочена — отметь. Формат: компактная таблица с колонками: Задача, Дедлайн, Статус, Приоритет.",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
}));
|
|
39
|
+
server.prompt("create-deal-wizard", "Создай сделку — guided deal creation wizard", {}, async () => ({
|
|
40
|
+
messages: [
|
|
41
|
+
{
|
|
42
|
+
role: "user",
|
|
43
|
+
content: {
|
|
44
|
+
type: "text",
|
|
45
|
+
text: "Помоги создать новую сделку в Мегаплане. Спроси у меня: 1) Название сделки, 2) ID программы (pipeline), 3) Ответственный (опционально), 4) Сумма (опционально), 5) Описание (опционально). После сбора данных вызови create_deal.",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}));
|
|
50
|
+
return server;
|
|
51
|
+
}
|
|
13
52
|
async function main() {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
53
|
+
const args = process.argv.slice(2);
|
|
54
|
+
if (args.includes("--http")) {
|
|
55
|
+
const { startHttpServer } = await import("./http.js");
|
|
56
|
+
const port = parseInt(process.env.PORT ?? "3000", 10);
|
|
57
|
+
await startHttpServer(createServer(), port);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const server = createServer();
|
|
61
|
+
const transport = new StdioServerTransport();
|
|
62
|
+
await server.connect(transport);
|
|
63
|
+
console.error("[megaplan-mcp] Server started via stdio. 8 tools, 2 skills available.");
|
|
64
|
+
}
|
|
17
65
|
}
|
|
18
66
|
main().catch((error) => {
|
|
19
67
|
console.error("[megaplan-mcp] Error:", error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getCommentsSchema: z.ZodObject<{
|
|
3
|
+
subject_type: z.ZodEnum<["task", "deal", "project"]>;
|
|
4
|
+
subject_id: z.ZodString;
|
|
5
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
limit: number;
|
|
9
|
+
offset: number;
|
|
10
|
+
subject_type: "task" | "deal" | "project";
|
|
11
|
+
subject_id: string;
|
|
12
|
+
}, {
|
|
13
|
+
subject_type: "task" | "deal" | "project";
|
|
14
|
+
subject_id: string;
|
|
15
|
+
limit?: number | undefined;
|
|
16
|
+
offset?: number | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function handleGetComments(params: z.infer<typeof getCommentsSchema>): Promise<string>;
|
|
19
|
+
export declare const createCommentSchema: z.ZodObject<{
|
|
20
|
+
subject_type: z.ZodEnum<["task", "deal", "project"]>;
|
|
21
|
+
subject_id: z.ZodString;
|
|
22
|
+
text: z.ZodString;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
subject_type: "task" | "deal" | "project";
|
|
25
|
+
subject_id: string;
|
|
26
|
+
text: string;
|
|
27
|
+
}, {
|
|
28
|
+
subject_type: "task" | "deal" | "project";
|
|
29
|
+
subject_id: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function handleCreateComment(params: z.infer<typeof createCommentSchema>): Promise<string>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { megaplanGet, megaplanPost } from "../client.js";
|
|
3
|
+
export const getCommentsSchema = z.object({
|
|
4
|
+
subject_type: z.enum(["task", "deal", "project"]).describe("Entity type to get comments for"),
|
|
5
|
+
subject_id: z.string().describe("Entity ID to get comments for"),
|
|
6
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
7
|
+
offset: z.number().int().default(0).describe("Offset for pagination"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleGetComments(params) {
|
|
10
|
+
const query = {
|
|
11
|
+
limit: String(params.limit),
|
|
12
|
+
offset: String(params.offset),
|
|
13
|
+
};
|
|
14
|
+
const result = await megaplanGet(`/${params.subject_type}/${params.subject_id}/comment`, query);
|
|
15
|
+
return JSON.stringify(result, null, 2);
|
|
16
|
+
}
|
|
17
|
+
export const createCommentSchema = z.object({
|
|
18
|
+
subject_type: z.enum(["task", "deal", "project"]).describe("Entity type to comment on"),
|
|
19
|
+
subject_id: z.string().describe("Entity ID to comment on"),
|
|
20
|
+
text: z.string().describe("Comment text (supports HTML)"),
|
|
21
|
+
});
|
|
22
|
+
export async function handleCreateComment(params) {
|
|
23
|
+
const body = {
|
|
24
|
+
contentType: "Comment",
|
|
25
|
+
text: params.text,
|
|
26
|
+
subject: {
|
|
27
|
+
id: params.subject_id,
|
|
28
|
+
contentType: params.subject_type.charAt(0).toUpperCase() + params.subject_type.slice(1),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const result = await megaplanPost(`/${params.subject_type}/${params.subject_id}/comment`, body);
|
|
32
|
+
return JSON.stringify(result, null, 2);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC7F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAChE,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,iBAAiB,CAAC,MAAyC;IAC/E,MAAM,KAAK,GAA2B;QACpC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KAC9B,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,UAAU,EAAE,KAAK,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACvF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAA2C;IACnF,MAAM,IAAI,GAAG;QACX,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE;YACP,EAAE,EAAE,MAAM,CAAC,UAAU;YACrB,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;SACxF;KACF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,UAAU,EAAE,IAAI,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/tools/deals.d.ts
CHANGED
|
@@ -19,3 +19,26 @@ export declare const getDealsSchema: z.ZodObject<{
|
|
|
19
19
|
offset?: number | undefined;
|
|
20
20
|
}>;
|
|
21
21
|
export declare function handleGetDeals(params: z.infer<typeof getDealsSchema>): Promise<string>;
|
|
22
|
+
export declare const createDealSchema: z.ZodObject<{
|
|
23
|
+
name: z.ZodString;
|
|
24
|
+
program_id: z.ZodString;
|
|
25
|
+
responsible_id: z.ZodOptional<z.ZodString>;
|
|
26
|
+
contact_id: z.ZodOptional<z.ZodString>;
|
|
27
|
+
amount: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
description: z.ZodOptional<z.ZodString>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
name: string;
|
|
31
|
+
program_id: string;
|
|
32
|
+
description?: string | undefined;
|
|
33
|
+
responsible_id?: string | undefined;
|
|
34
|
+
contact_id?: string | undefined;
|
|
35
|
+
amount?: number | undefined;
|
|
36
|
+
}, {
|
|
37
|
+
name: string;
|
|
38
|
+
program_id: string;
|
|
39
|
+
description?: string | undefined;
|
|
40
|
+
responsible_id?: string | undefined;
|
|
41
|
+
contact_id?: string | undefined;
|
|
42
|
+
amount?: number | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
export declare function handleCreateDeal(params: z.infer<typeof createDealSchema>): Promise<string>;
|
package/dist/tools/deals.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { megaplanGet } from "../client.js";
|
|
2
|
+
import { megaplanGet, megaplanPost } from "../client.js";
|
|
3
3
|
export const getDealsSchema = z.object({
|
|
4
4
|
filter_status: z.string().optional().describe("Filter by deal status"),
|
|
5
5
|
filter_responsible_id: z.string().optional().describe("Filter by responsible employee ID"),
|
|
@@ -21,4 +21,29 @@ export async function handleGetDeals(params) {
|
|
|
21
21
|
const result = await megaplanGet("/deal", query);
|
|
22
22
|
return JSON.stringify(result, null, 2);
|
|
23
23
|
}
|
|
24
|
+
export const createDealSchema = z.object({
|
|
25
|
+
name: z.string().describe("Deal name/title"),
|
|
26
|
+
program_id: z.string().describe("Deal program (pipeline) ID"),
|
|
27
|
+
responsible_id: z.string().optional().describe("Responsible employee ID"),
|
|
28
|
+
contact_id: z.string().optional().describe("Contact/client ID"),
|
|
29
|
+
amount: z.number().optional().describe("Deal amount"),
|
|
30
|
+
description: z.string().optional().describe("Deal description"),
|
|
31
|
+
});
|
|
32
|
+
export async function handleCreateDeal(params) {
|
|
33
|
+
const body = {
|
|
34
|
+
contentType: "Deal",
|
|
35
|
+
name: params.name,
|
|
36
|
+
program: { id: params.program_id, contentType: "DealProgram" },
|
|
37
|
+
};
|
|
38
|
+
if (params.responsible_id)
|
|
39
|
+
body.responsible = { id: params.responsible_id, contentType: "Employee" };
|
|
40
|
+
if (params.contact_id)
|
|
41
|
+
body.contact = { id: params.contact_id, contentType: "Contractor" };
|
|
42
|
+
if (params.amount != null)
|
|
43
|
+
body.cost = params.amount;
|
|
44
|
+
if (params.description)
|
|
45
|
+
body.description = params.description;
|
|
46
|
+
const result = await megaplanPost("/deal", body);
|
|
47
|
+
return JSON.stringify(result, null, 2);
|
|
48
|
+
}
|
|
24
49
|
//# sourceMappingURL=deals.js.map
|
package/dist/tools/deals.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"deals.js","sourceRoot":"","sources":["../../src/tools/deals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getEmployeesSchema: z.ZodObject<{
|
|
3
|
+
search: z.ZodOptional<z.ZodString>;
|
|
4
|
+
filter_department_id: z.ZodOptional<z.ZodString>;
|
|
5
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
limit: number;
|
|
9
|
+
offset: number;
|
|
10
|
+
search?: string | undefined;
|
|
11
|
+
filter_department_id?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
search?: string | undefined;
|
|
14
|
+
limit?: number | undefined;
|
|
15
|
+
offset?: number | undefined;
|
|
16
|
+
filter_department_id?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function handleGetEmployees(params: z.infer<typeof getEmployeesSchema>): Promise<string>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { megaplanGet } from "../client.js";
|
|
3
|
+
export const getEmployeesSchema = z.object({
|
|
4
|
+
search: z.string().optional().describe("Search by employee name or email"),
|
|
5
|
+
filter_department_id: z.string().optional().describe("Filter by department ID"),
|
|
6
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
7
|
+
offset: z.number().int().default(0).describe("Offset for pagination"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleGetEmployees(params) {
|
|
10
|
+
const query = {
|
|
11
|
+
limit: String(params.limit),
|
|
12
|
+
offset: String(params.offset),
|
|
13
|
+
};
|
|
14
|
+
if (params.search)
|
|
15
|
+
query["search"] = params.search;
|
|
16
|
+
if (params.filter_department_id)
|
|
17
|
+
query["filter[department]"] = params.filter_department_id;
|
|
18
|
+
const result = await megaplanGet("/employee", query);
|
|
19
|
+
return JSON.stringify(result, null, 2);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=employees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/tools/employees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC1E,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC/E,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,kBAAkB,CAAC,MAA0C;IACjF,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,MAAM;QAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACnD,IAAI,MAAM,CAAC,oBAAoB;QAAE,KAAK,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAE3F,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getProjectsSchema: z.ZodObject<{
|
|
3
|
+
filter_status: z.ZodOptional<z.ZodString>;
|
|
4
|
+
search: z.ZodOptional<z.ZodString>;
|
|
5
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
limit: number;
|
|
9
|
+
offset: number;
|
|
10
|
+
filter_status?: string | undefined;
|
|
11
|
+
search?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
filter_status?: string | undefined;
|
|
14
|
+
search?: string | undefined;
|
|
15
|
+
limit?: number | undefined;
|
|
16
|
+
offset?: number | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function handleGetProjects(params: z.infer<typeof getProjectsSchema>): Promise<string>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { megaplanGet } from "../client.js";
|
|
3
|
+
export const getProjectsSchema = z.object({
|
|
4
|
+
filter_status: z.string().optional().describe("Filter by status (active, completed, etc.)"),
|
|
5
|
+
search: z.string().optional().describe("Search by project name"),
|
|
6
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Results per page"),
|
|
7
|
+
offset: z.number().int().default(0).describe("Offset for pagination"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleGetProjects(params) {
|
|
10
|
+
const query = {
|
|
11
|
+
limit: String(params.limit),
|
|
12
|
+
offset: String(params.offset),
|
|
13
|
+
};
|
|
14
|
+
if (params.filter_status)
|
|
15
|
+
query["filter[status]"] = params.filter_status;
|
|
16
|
+
if (params.search)
|
|
17
|
+
query["search"] = params.search;
|
|
18
|
+
const result = await megaplanGet("/project", query);
|
|
19
|
+
return JSON.stringify(result, null, 2);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC3F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAChE,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,iBAAiB,CAAC,MAAyC;IAC/E,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,MAAM;QAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -28,6 +28,36 @@ export interface MegaplanDeal {
|
|
|
28
28
|
created: string;
|
|
29
29
|
modified: string;
|
|
30
30
|
}
|
|
31
|
+
export interface MegaplanProject {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
status: string;
|
|
35
|
+
responsible?: {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
};
|
|
39
|
+
created: string;
|
|
40
|
+
modified: string;
|
|
41
|
+
}
|
|
42
|
+
export interface MegaplanEmployee {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
email?: string;
|
|
46
|
+
department?: {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
};
|
|
50
|
+
position?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface MegaplanComment {
|
|
53
|
+
id: string;
|
|
54
|
+
text: string;
|
|
55
|
+
author?: {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
};
|
|
59
|
+
created: string;
|
|
60
|
+
}
|
|
31
61
|
export interface MegaplanListResult<T> {
|
|
32
62
|
meta: {
|
|
33
63
|
totalCount: number;
|
package/package.json
CHANGED
|
@@ -1,20 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theyahia/megaplan-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "MCP server for Megaplan — tasks, deals management via API v3.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
"bin": {
|
|
8
|
+
"megaplan-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18.0.0"
|
|
15
|
+
},
|
|
10
16
|
"scripts": {
|
|
11
17
|
"build": "tsc",
|
|
12
18
|
"dev": "tsx src/index.ts",
|
|
13
19
|
"start": "node dist/index.js",
|
|
14
|
-
"prepublishOnly": "npm run build"
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"start:http": "node dist/index.js --http"
|
|
15
24
|
},
|
|
16
25
|
"dependencies": {
|
|
17
26
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
27
|
+
"@types/express": "^5.0.6",
|
|
28
|
+
"express": "^5.2.1",
|
|
29
|
+
"vitest": "^4.1.2",
|
|
18
30
|
"zod": "^3.24.0"
|
|
19
31
|
},
|
|
20
32
|
"devDependencies": {
|
|
@@ -22,11 +34,27 @@
|
|
|
22
34
|
"tsx": "^4.19.0",
|
|
23
35
|
"typescript": "^5.7.0"
|
|
24
36
|
},
|
|
25
|
-
"publishConfig": {
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
26
40
|
"mcpName": "io.github.theYahia/megaplan-mcp",
|
|
27
|
-
"keywords": [
|
|
41
|
+
"keywords": [
|
|
42
|
+
"mcp",
|
|
43
|
+
"mcp-server",
|
|
44
|
+
"model-context-protocol",
|
|
45
|
+
"claude",
|
|
46
|
+
"ai",
|
|
47
|
+
"russian-api",
|
|
48
|
+
"megaplan",
|
|
49
|
+
"tasks",
|
|
50
|
+
"deals",
|
|
51
|
+
"project-management"
|
|
52
|
+
],
|
|
28
53
|
"license": "MIT",
|
|
29
|
-
"repository": {
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "https://github.com/theYahia/megaplan-mcp.git"
|
|
57
|
+
},
|
|
30
58
|
"homepage": "https://github.com/theYahia/megaplan-mcp#readme",
|
|
31
59
|
"author": "Yahia"
|
|
32
60
|
}
|