corkcrm-mcp 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.
- package/dist/auth.d.ts +13 -0
- package/dist/auth.js +40 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.js +42 -0
- package/dist/client.js.map +1 -0
- package/dist/formatters.d.ts +106 -0
- package/dist/formatters.js +186 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/resolvers.d.ts +72 -0
- package/dist/resolvers.js +106 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +298 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +36 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates the API key on first use and caches the result.
|
|
3
|
+
* Since we use HTTP actions with the API key in the Authorization header,
|
|
4
|
+
* validation happens server-side on every request. This module just
|
|
5
|
+
* ensures the env vars are present and provides the key.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getApiKey(): string;
|
|
8
|
+
export declare function getConvexUrl(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Validate that the API key works by making a test request.
|
|
11
|
+
* Called once on first tool invocation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureAuthenticated(testFn: () => Promise<unknown>): Promise<void>;
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates the API key on first use and caches the result.
|
|
3
|
+
* Since we use HTTP actions with the API key in the Authorization header,
|
|
4
|
+
* validation happens server-side on every request. This module just
|
|
5
|
+
* ensures the env vars are present and provides the key.
|
|
6
|
+
*/
|
|
7
|
+
let validated = false;
|
|
8
|
+
export function getApiKey() {
|
|
9
|
+
const key = process.env.CORK_API_KEY;
|
|
10
|
+
if (!key) {
|
|
11
|
+
throw new Error("CORK_API_KEY environment variable is required. " +
|
|
12
|
+
"Generate one in Workspace Settings > API Keys.");
|
|
13
|
+
}
|
|
14
|
+
return key;
|
|
15
|
+
}
|
|
16
|
+
export function getConvexUrl() {
|
|
17
|
+
const url = process.env.CONVEX_URL;
|
|
18
|
+
if (!url) {
|
|
19
|
+
throw new Error("CONVEX_URL environment variable is required. " +
|
|
20
|
+
"Set it to your Convex deployment URL (e.g., https://your-deployment.convex.cloud).");
|
|
21
|
+
}
|
|
22
|
+
return url;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate that the API key works by making a test request.
|
|
26
|
+
* Called once on first tool invocation.
|
|
27
|
+
*/
|
|
28
|
+
export async function ensureAuthenticated(testFn) {
|
|
29
|
+
if (validated)
|
|
30
|
+
return;
|
|
31
|
+
try {
|
|
32
|
+
await testFn();
|
|
33
|
+
validated = true;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
37
|
+
throw new Error(`API key validation failed: ${msg}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iDAAiD;YAC/C,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC7C,oFAAoF,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA8B;IAE9B,IAAI,SAAS;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for communicating with Convex HTTP actions.
|
|
3
|
+
* All MCP server → Convex communication goes through HTTP endpoints.
|
|
4
|
+
*/
|
|
5
|
+
export declare function initClient(url: string, key: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Make an authenticated request to a Convex HTTP action endpoint.
|
|
8
|
+
*/
|
|
9
|
+
export declare function convexFetch<T = unknown>(path: string, options?: {
|
|
10
|
+
method?: string;
|
|
11
|
+
body?: unknown;
|
|
12
|
+
}): Promise<T>;
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for communicating with Convex HTTP actions.
|
|
3
|
+
* All MCP server → Convex communication goes through HTTP endpoints.
|
|
4
|
+
*/
|
|
5
|
+
let convexUrl = null;
|
|
6
|
+
let apiKey = null;
|
|
7
|
+
export function initClient(url, key) {
|
|
8
|
+
convexUrl = url;
|
|
9
|
+
apiKey = key;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Make an authenticated request to a Convex HTTP action endpoint.
|
|
13
|
+
*/
|
|
14
|
+
export async function convexFetch(path, options = {}) {
|
|
15
|
+
if (!convexUrl || !apiKey) {
|
|
16
|
+
throw new Error("Client not initialized. Call initClient() first.");
|
|
17
|
+
}
|
|
18
|
+
const url = `${convexUrl}${path}`;
|
|
19
|
+
const method = options.method || "GET";
|
|
20
|
+
const headers = {
|
|
21
|
+
Authorization: `Bearer ${apiKey}`,
|
|
22
|
+
};
|
|
23
|
+
const fetchOptions = { method, headers };
|
|
24
|
+
if (options.body !== undefined) {
|
|
25
|
+
headers["Content-Type"] = "application/json";
|
|
26
|
+
fetchOptions.body = JSON.stringify(options.body);
|
|
27
|
+
}
|
|
28
|
+
const response = await fetch(url, fetchOptions);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
let errorMessage;
|
|
31
|
+
try {
|
|
32
|
+
const errorBody = await response.json();
|
|
33
|
+
errorMessage = errorBody.error || `HTTP ${response.status}`;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
errorMessage = `HTTP ${response.status}: ${response.statusText}`;
|
|
37
|
+
}
|
|
38
|
+
throw new Error(errorMessage);
|
|
39
|
+
}
|
|
40
|
+
return response.json();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,IAAI,SAAS,GAAkB,IAAI,CAAC;AACpC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW;IACjD,SAAS,GAAG,GAAG,CAAC;IAChB,MAAM,GAAG,GAAG,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,UAA+C,EAAE;IAEjD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAEvC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,EAAE;KAClC,CAAC;IAEF,MAAM,YAAY,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEtD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format Convex API responses into LLM-friendly structured text.
|
|
3
|
+
* Claude works better with clean structured text than raw JSON.
|
|
4
|
+
*/
|
|
5
|
+
interface WorkspaceInfo {
|
|
6
|
+
workspace: {
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
};
|
|
10
|
+
statuses: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
value: string;
|
|
13
|
+
type: string;
|
|
14
|
+
}>;
|
|
15
|
+
priorities: Array<{
|
|
16
|
+
name: string;
|
|
17
|
+
value: string;
|
|
18
|
+
}>;
|
|
19
|
+
members: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
email: string;
|
|
22
|
+
role: string;
|
|
23
|
+
}>;
|
|
24
|
+
customColumns: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
type: string;
|
|
27
|
+
required?: boolean;
|
|
28
|
+
options: Array<{
|
|
29
|
+
label: string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
views: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
type?: string;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
export declare function formatWorkspaceInfo(info: WorkspaceInfo): string;
|
|
38
|
+
interface TaskListItem {
|
|
39
|
+
simpleId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
status: string;
|
|
42
|
+
priority?: string;
|
|
43
|
+
taskLevel?: string;
|
|
44
|
+
assignees: string[];
|
|
45
|
+
dueDate?: string;
|
|
46
|
+
estimatedHours?: number;
|
|
47
|
+
parentTaskId?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function formatTaskList(tasks: TaskListItem[]): string;
|
|
50
|
+
interface TaskDetail {
|
|
51
|
+
simpleId: string;
|
|
52
|
+
name: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
status: string;
|
|
55
|
+
priority?: string;
|
|
56
|
+
taskLevel?: string;
|
|
57
|
+
assignees: string[];
|
|
58
|
+
dueDate?: string;
|
|
59
|
+
startDate?: string;
|
|
60
|
+
endDate?: string;
|
|
61
|
+
estimatedHours?: number;
|
|
62
|
+
actualHours?: number;
|
|
63
|
+
customFields?: Record<string, string | string[]>;
|
|
64
|
+
parentChain?: Array<{
|
|
65
|
+
simpleId: string;
|
|
66
|
+
name: string;
|
|
67
|
+
taskLevel?: string;
|
|
68
|
+
}>;
|
|
69
|
+
children?: Array<{
|
|
70
|
+
simpleId: string;
|
|
71
|
+
name: string;
|
|
72
|
+
status: string;
|
|
73
|
+
taskLevel?: string;
|
|
74
|
+
}>;
|
|
75
|
+
recentActivity?: Array<{
|
|
76
|
+
action: string;
|
|
77
|
+
details?: string;
|
|
78
|
+
user: string;
|
|
79
|
+
timestamp: number;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
export declare function formatTaskDetail(task: TaskDetail): string;
|
|
83
|
+
interface SearchResult {
|
|
84
|
+
simpleId: string;
|
|
85
|
+
name: string;
|
|
86
|
+
status: string;
|
|
87
|
+
taskLevel?: string;
|
|
88
|
+
dueDate?: string;
|
|
89
|
+
}
|
|
90
|
+
export declare function formatSearchResults(results: SearchResult[]): string;
|
|
91
|
+
interface ProjectItem {
|
|
92
|
+
simpleId: string;
|
|
93
|
+
name: string;
|
|
94
|
+
milestoneCount: number;
|
|
95
|
+
totalDescendants: number;
|
|
96
|
+
}
|
|
97
|
+
export declare function formatProjectList(projects: ProjectItem[]): string;
|
|
98
|
+
interface MilestoneItem {
|
|
99
|
+
simpleId: string;
|
|
100
|
+
name: string;
|
|
101
|
+
taskCount: number;
|
|
102
|
+
projectName?: string;
|
|
103
|
+
projectSimpleId?: string;
|
|
104
|
+
}
|
|
105
|
+
export declare function formatMilestoneList(milestones: MilestoneItem[]): string;
|
|
106
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format Convex API responses into LLM-friendly structured text.
|
|
3
|
+
* Claude works better with clean structured text than raw JSON.
|
|
4
|
+
*/
|
|
5
|
+
export function formatWorkspaceInfo(info) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push(`Workspace: ${info.workspace.name}`);
|
|
8
|
+
if (info.workspace.description) {
|
|
9
|
+
lines.push(`Description: ${info.workspace.description}`);
|
|
10
|
+
}
|
|
11
|
+
lines.push("");
|
|
12
|
+
// Statuses
|
|
13
|
+
lines.push(`Statuses: ${info.statuses.map((s) => `${s.name} (${s.type})`).join(", ")}`);
|
|
14
|
+
// Priorities
|
|
15
|
+
lines.push(`Priorities: ${info.priorities.map((p) => p.name).join(", ")}`);
|
|
16
|
+
lines.push("");
|
|
17
|
+
// Custom columns
|
|
18
|
+
if (info.customColumns.length > 0) {
|
|
19
|
+
lines.push("Custom Columns:");
|
|
20
|
+
for (const col of info.customColumns) {
|
|
21
|
+
const req = col.required ? ", required" : "";
|
|
22
|
+
const opts = col.options.map((o) => o.label).join(", ");
|
|
23
|
+
lines.push(` - ${col.name} (${col.type}${req}): ${opts}`);
|
|
24
|
+
}
|
|
25
|
+
lines.push("");
|
|
26
|
+
}
|
|
27
|
+
// Members
|
|
28
|
+
lines.push("Members:");
|
|
29
|
+
for (const m of info.members) {
|
|
30
|
+
lines.push(` - ${m.name} (${m.email}) - ${m.role}`);
|
|
31
|
+
}
|
|
32
|
+
lines.push("");
|
|
33
|
+
// Views
|
|
34
|
+
lines.push(`Views: ${info.views.map((v) => `${v.name}${v.type === "dev" ? " [dev]" : ""}`).join(", ")}`);
|
|
35
|
+
return lines.join("\n");
|
|
36
|
+
}
|
|
37
|
+
export function formatTaskList(tasks) {
|
|
38
|
+
if (tasks.length === 0)
|
|
39
|
+
return "No tasks found.";
|
|
40
|
+
const lines = [`Found ${tasks.length} task(s):\n`];
|
|
41
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
42
|
+
const t = tasks[i];
|
|
43
|
+
const parts = [];
|
|
44
|
+
parts.push(`${i + 1}. [${t.simpleId}] ${t.name}`);
|
|
45
|
+
const meta = [];
|
|
46
|
+
meta.push(`Status: ${t.status}`);
|
|
47
|
+
if (t.priority)
|
|
48
|
+
meta.push(`Priority: ${t.priority}`);
|
|
49
|
+
if (t.assignees.length > 0) {
|
|
50
|
+
meta.push(`Assignee${t.assignees.length > 1 ? "s" : ""}: ${t.assignees.join(", ")}`);
|
|
51
|
+
}
|
|
52
|
+
parts.push(` ${meta.join(" | ")}`);
|
|
53
|
+
const extra = [];
|
|
54
|
+
if (t.dueDate) {
|
|
55
|
+
const daysLeft = daysUntil(t.dueDate);
|
|
56
|
+
const suffix = daysLeft < 0
|
|
57
|
+
? ` (${Math.abs(daysLeft)}d overdue)`
|
|
58
|
+
: daysLeft === 0
|
|
59
|
+
? " (due today)"
|
|
60
|
+
: ` (${daysLeft}d remaining)`;
|
|
61
|
+
extra.push(`Due: ${t.dueDate}${suffix}`);
|
|
62
|
+
}
|
|
63
|
+
if (t.estimatedHours)
|
|
64
|
+
extra.push(`Est: ${t.estimatedHours}h`);
|
|
65
|
+
if (t.taskLevel)
|
|
66
|
+
extra.push(`Level: ${t.taskLevel}`);
|
|
67
|
+
if (extra.length > 0)
|
|
68
|
+
parts.push(` ${extra.join(" | ")}`);
|
|
69
|
+
lines.push(parts.join("\n"));
|
|
70
|
+
}
|
|
71
|
+
return lines.join("\n");
|
|
72
|
+
}
|
|
73
|
+
export function formatTaskDetail(task) {
|
|
74
|
+
const lines = [];
|
|
75
|
+
lines.push(`[${task.simpleId}] ${task.name}`);
|
|
76
|
+
if (task.description) {
|
|
77
|
+
lines.push(`Description: ${task.description}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push("");
|
|
80
|
+
// Parent chain
|
|
81
|
+
if (task.parentChain && task.parentChain.length > 0) {
|
|
82
|
+
const path = task.parentChain
|
|
83
|
+
.map((p) => `${p.name} [${p.simpleId}]`)
|
|
84
|
+
.join(" > ");
|
|
85
|
+
lines.push(`Location: ${path}`);
|
|
86
|
+
}
|
|
87
|
+
// Core fields
|
|
88
|
+
const meta = [];
|
|
89
|
+
meta.push(`Status: ${task.status}`);
|
|
90
|
+
if (task.priority)
|
|
91
|
+
meta.push(`Priority: ${task.priority}`);
|
|
92
|
+
if (task.taskLevel)
|
|
93
|
+
meta.push(`Level: ${task.taskLevel}`);
|
|
94
|
+
lines.push(meta.join(" | "));
|
|
95
|
+
if (task.assignees.length > 0) {
|
|
96
|
+
lines.push(`Assignees: ${task.assignees.join(", ")}`);
|
|
97
|
+
}
|
|
98
|
+
// Dates
|
|
99
|
+
const dates = [];
|
|
100
|
+
if (task.startDate)
|
|
101
|
+
dates.push(`Start: ${task.startDate}`);
|
|
102
|
+
if (task.endDate)
|
|
103
|
+
dates.push(`End: ${task.endDate}`);
|
|
104
|
+
if (task.dueDate) {
|
|
105
|
+
const daysLeft = daysUntil(task.dueDate);
|
|
106
|
+
const suffix = daysLeft < 0 ? ` (${Math.abs(daysLeft)}d overdue)` : ` (${daysLeft}d remaining)`;
|
|
107
|
+
dates.push(`Due: ${task.dueDate}${suffix}`);
|
|
108
|
+
}
|
|
109
|
+
if (dates.length > 0)
|
|
110
|
+
lines.push(dates.join(" | "));
|
|
111
|
+
// Hours
|
|
112
|
+
const hours = [];
|
|
113
|
+
if (task.estimatedHours)
|
|
114
|
+
hours.push(`Estimated: ${task.estimatedHours}h`);
|
|
115
|
+
if (task.actualHours)
|
|
116
|
+
hours.push(`Actual: ${task.actualHours}h`);
|
|
117
|
+
if (hours.length > 0)
|
|
118
|
+
lines.push(hours.join(" | "));
|
|
119
|
+
// Custom fields
|
|
120
|
+
if (task.customFields && Object.keys(task.customFields).length > 0) {
|
|
121
|
+
lines.push("");
|
|
122
|
+
lines.push("Custom Fields:");
|
|
123
|
+
for (const [name, value] of Object.entries(task.customFields)) {
|
|
124
|
+
const display = Array.isArray(value) ? value.join(", ") : value;
|
|
125
|
+
lines.push(` ${name}: ${display}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Children
|
|
129
|
+
if (task.children && task.children.length > 0) {
|
|
130
|
+
lines.push("");
|
|
131
|
+
lines.push(`Children (${task.children.length}):`);
|
|
132
|
+
for (const child of task.children) {
|
|
133
|
+
lines.push(` - [${child.simpleId}] ${child.name} (${child.status})`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Activity
|
|
137
|
+
if (task.recentActivity && task.recentActivity.length > 0) {
|
|
138
|
+
lines.push("");
|
|
139
|
+
lines.push("Recent Activity:");
|
|
140
|
+
for (const a of task.recentActivity.slice(0, 5)) {
|
|
141
|
+
const date = new Date(a.timestamp).toLocaleDateString("en-US", {
|
|
142
|
+
month: "short",
|
|
143
|
+
day: "numeric",
|
|
144
|
+
});
|
|
145
|
+
lines.push(` ${date} - ${a.user}: ${a.details || a.action}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return lines.join("\n");
|
|
149
|
+
}
|
|
150
|
+
export function formatSearchResults(results) {
|
|
151
|
+
if (results.length === 0)
|
|
152
|
+
return "No matching tasks found.";
|
|
153
|
+
const lines = [`Found ${results.length} result(s):\n`];
|
|
154
|
+
for (const r of results) {
|
|
155
|
+
lines.push(` [${r.simpleId}] ${r.name} — ${r.status}${r.taskLevel ? ` (${r.taskLevel})` : ""}`);
|
|
156
|
+
}
|
|
157
|
+
return lines.join("\n");
|
|
158
|
+
}
|
|
159
|
+
export function formatProjectList(projects) {
|
|
160
|
+
if (projects.length === 0)
|
|
161
|
+
return "No projects found.";
|
|
162
|
+
const lines = [`Found ${projects.length} project(s):\n`];
|
|
163
|
+
for (const p of projects) {
|
|
164
|
+
lines.push(` [${p.simpleId}] ${p.name} — ${p.milestoneCount} milestones, ${p.totalDescendants} total items`);
|
|
165
|
+
}
|
|
166
|
+
return lines.join("\n");
|
|
167
|
+
}
|
|
168
|
+
export function formatMilestoneList(milestones) {
|
|
169
|
+
if (milestones.length === 0)
|
|
170
|
+
return "No milestones found.";
|
|
171
|
+
const lines = [`Found ${milestones.length} milestone(s):\n`];
|
|
172
|
+
for (const m of milestones) {
|
|
173
|
+
const project = m.projectName
|
|
174
|
+
? ` (Project: ${m.projectName} [${m.projectSimpleId}])`
|
|
175
|
+
: "";
|
|
176
|
+
lines.push(` [${m.simpleId}] ${m.name} — ${m.taskCount} tasks${project}`);
|
|
177
|
+
}
|
|
178
|
+
return lines.join("\n");
|
|
179
|
+
}
|
|
180
|
+
function daysUntil(dateStr) {
|
|
181
|
+
const target = new Date(dateStr + "T00:00:00");
|
|
182
|
+
const today = new Date();
|
|
183
|
+
today.setHours(0, 0, 0, 0);
|
|
184
|
+
return Math.ceil((target.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,WAAW;IACX,KAAK,CAAC,IAAI,CACR,aAAa,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5E,CAAC;IAEF,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,iBAAiB;IACjB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,QAAQ;IACR,KAAK,CAAC,IAAI,CACR,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAcD,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAEjD,MAAM,KAAK,GAAa,CAAC,SAAS,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;IAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAErC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GACV,QAAQ,GAAG,CAAC;gBACV,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY;gBACrC,CAAC,CAAC,QAAQ,KAAK,CAAC;oBACd,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,KAAK,QAAQ,cAAc,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,CAAC,cAAc;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE5D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAqBD,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;aACvC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,cAAc;IACd,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ;IACR,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GACV,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,cAAc,CAAC;QACnF,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,QAAQ;IACR,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,gBAAgB;IAChB,IAAI,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,WAAW;IACX,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,WAAW;IACX,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;gBAC7D,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAUD,MAAM,UAAU,mBAAmB,CAAC,OAAuB;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0BAA0B,CAAC;IAE5D,MAAM,KAAK,GAAa,CAAC,SAAS,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AASD,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC;IAEvD,MAAM,KAAK,GAAa,CAAC,SAAS,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,cAAc,gBAAgB,CAAC,CAAC,gBAAgB,cAAc,CAClG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAUD,MAAM,UAAU,mBAAmB,CAAC,UAA2B;IAC7D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAE3D,MAAM,KAAK,GAAa,CAAC,SAAS,UAAU,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW;YAC3B,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,eAAe,IAAI;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CorkCRM PM MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides Claude Desktop/Web with read/write access to a CorkCRM PM workspace.
|
|
6
|
+
* Communicates with Convex backend via HTTP action endpoints.
|
|
7
|
+
*
|
|
8
|
+
* Required env vars:
|
|
9
|
+
* CORK_API_KEY - Workspace API key (generate in Settings > API Keys)
|
|
10
|
+
* CONVEX_URL - Convex deployment URL
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CorkCRM PM MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides Claude Desktop/Web with read/write access to a CorkCRM PM workspace.
|
|
6
|
+
* Communicates with Convex backend via HTTP action endpoints.
|
|
7
|
+
*
|
|
8
|
+
* Required env vars:
|
|
9
|
+
* CORK_API_KEY - Workspace API key (generate in Settings > API Keys)
|
|
10
|
+
* CONVEX_URL - Convex deployment URL
|
|
11
|
+
*/
|
|
12
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
14
|
+
import { getApiKey, getConvexUrl } from "./auth.js";
|
|
15
|
+
import { initClient } from "./client.js";
|
|
16
|
+
import { registerTools } from "./tools/index.js";
|
|
17
|
+
// Validate env vars early
|
|
18
|
+
const apiKey = getApiKey();
|
|
19
|
+
const convexUrl = getConvexUrl();
|
|
20
|
+
// Initialize HTTP client
|
|
21
|
+
initClient(convexUrl, apiKey);
|
|
22
|
+
// Create MCP server
|
|
23
|
+
const server = new McpServer({
|
|
24
|
+
name: "corkcrm-pm",
|
|
25
|
+
version: "0.1.0",
|
|
26
|
+
});
|
|
27
|
+
// Register all tools
|
|
28
|
+
registerTools(server);
|
|
29
|
+
// Connect via stdio transport
|
|
30
|
+
const transport = new StdioServerTransport();
|
|
31
|
+
await server.connect(transport);
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,0BAA0B;AAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;AAEjC,yBAAyB;AACzB,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAE9B,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,qBAAqB;AACrB,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtB,8BAA8B;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Name-to-ID resolution for workspace entities.
|
|
3
|
+
* Caches workspace config with TTL and resolves human-readable names
|
|
4
|
+
* to internal IDs/values.
|
|
5
|
+
*/
|
|
6
|
+
interface WorkspaceConfig {
|
|
7
|
+
workspace: {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
};
|
|
11
|
+
statuses: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
value: string;
|
|
14
|
+
type: string;
|
|
15
|
+
color: string;
|
|
16
|
+
}>;
|
|
17
|
+
priorities: Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
value: string;
|
|
20
|
+
color: string;
|
|
21
|
+
}>;
|
|
22
|
+
members: Array<{
|
|
23
|
+
userId: string;
|
|
24
|
+
name: string;
|
|
25
|
+
email: string;
|
|
26
|
+
role: string;
|
|
27
|
+
}>;
|
|
28
|
+
customColumns: Array<{
|
|
29
|
+
_id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
type: string;
|
|
32
|
+
required?: boolean;
|
|
33
|
+
options: Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
label: string;
|
|
36
|
+
color: string;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
views: Array<{
|
|
40
|
+
_id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
type?: string;
|
|
43
|
+
}>;
|
|
44
|
+
currentUserId: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function getWorkspaceConfig(): Promise<WorkspaceConfig>;
|
|
47
|
+
export declare function invalidateConfigCache(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a status name to its internal value.
|
|
50
|
+
* Tries exact match, then case-insensitive.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveStatus(config: WorkspaceConfig, nameOrValue: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a priority name to its internal value.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolvePriority(config: WorkspaceConfig, nameOrValue: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Resolve a member name or email to their userId.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveMember(config: WorkspaceConfig, identifier: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve a view name to its ID.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveView(config: WorkspaceConfig, name: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve custom column name + option label to column ID + option ID.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveCustomColumnValue(config: WorkspaceConfig, columnName: string, optionLabel: string): {
|
|
69
|
+
columnId: string;
|
|
70
|
+
optionId: string;
|
|
71
|
+
};
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Name-to-ID resolution for workspace entities.
|
|
3
|
+
* Caches workspace config with TTL and resolves human-readable names
|
|
4
|
+
* to internal IDs/values.
|
|
5
|
+
*/
|
|
6
|
+
import { convexFetch } from "./client.js";
|
|
7
|
+
let cachedConfig = null;
|
|
8
|
+
let cachedAt = 0;
|
|
9
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
10
|
+
export async function getWorkspaceConfig() {
|
|
11
|
+
if (cachedConfig && Date.now() - cachedAt < CACHE_TTL) {
|
|
12
|
+
return cachedConfig;
|
|
13
|
+
}
|
|
14
|
+
cachedConfig = await convexFetch("/mcp/workspace-info");
|
|
15
|
+
cachedAt = Date.now();
|
|
16
|
+
return cachedConfig;
|
|
17
|
+
}
|
|
18
|
+
export function invalidateConfigCache() {
|
|
19
|
+
cachedConfig = null;
|
|
20
|
+
cachedAt = 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a status name to its internal value.
|
|
24
|
+
* Tries exact match, then case-insensitive.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveStatus(config, nameOrValue) {
|
|
27
|
+
// Exact value match
|
|
28
|
+
const byValue = config.statuses.find((s) => s.value === nameOrValue);
|
|
29
|
+
if (byValue)
|
|
30
|
+
return byValue.value;
|
|
31
|
+
// Case-insensitive name match
|
|
32
|
+
const lower = nameOrValue.toLowerCase();
|
|
33
|
+
const matches = config.statuses.filter((s) => s.name.toLowerCase() === lower);
|
|
34
|
+
if (matches.length === 1)
|
|
35
|
+
return matches[0].value;
|
|
36
|
+
if (matches.length > 1) {
|
|
37
|
+
throw new Error(`Ambiguous status "${nameOrValue}". Matches: ${matches.map((s) => s.name).join(", ")}`);
|
|
38
|
+
}
|
|
39
|
+
// Partial match
|
|
40
|
+
const partial = config.statuses.filter((s) => s.name.toLowerCase().includes(lower));
|
|
41
|
+
if (partial.length === 1)
|
|
42
|
+
return partial[0].value;
|
|
43
|
+
throw new Error(`Unknown status "${nameOrValue}". Available: ${config.statuses.map((s) => s.name).join(", ")}`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a priority name to its internal value.
|
|
47
|
+
*/
|
|
48
|
+
export function resolvePriority(config, nameOrValue) {
|
|
49
|
+
const byValue = config.priorities.find((p) => p.value === nameOrValue);
|
|
50
|
+
if (byValue)
|
|
51
|
+
return byValue.value;
|
|
52
|
+
const lower = nameOrValue.toLowerCase();
|
|
53
|
+
const match = config.priorities.find((p) => p.name.toLowerCase() === lower);
|
|
54
|
+
if (match)
|
|
55
|
+
return match.value;
|
|
56
|
+
throw new Error(`Unknown priority "${nameOrValue}". Available: ${config.priorities.map((p) => p.name).join(", ")}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a member name or email to their userId.
|
|
60
|
+
*/
|
|
61
|
+
export function resolveMember(config, identifier) {
|
|
62
|
+
// Exact email match
|
|
63
|
+
const byEmail = config.members.find((m) => m.email.toLowerCase() === identifier.toLowerCase());
|
|
64
|
+
if (byEmail)
|
|
65
|
+
return byEmail.userId;
|
|
66
|
+
// Name match (case-insensitive)
|
|
67
|
+
const lower = identifier.toLowerCase();
|
|
68
|
+
const byName = config.members.filter((m) => m.name.toLowerCase() === lower);
|
|
69
|
+
if (byName.length === 1)
|
|
70
|
+
return byName[0].userId;
|
|
71
|
+
if (byName.length > 1) {
|
|
72
|
+
throw new Error(`Ambiguous member "${identifier}". Matches: ${byName.map((m) => `${m.name} (${m.email})`).join(", ")}`);
|
|
73
|
+
}
|
|
74
|
+
// Partial name match
|
|
75
|
+
const partial = config.members.filter((m) => m.name.toLowerCase().includes(lower));
|
|
76
|
+
if (partial.length === 1)
|
|
77
|
+
return partial[0].userId;
|
|
78
|
+
throw new Error(`Unknown member "${identifier}". Available: ${config.members.map((m) => m.name).join(", ")}`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a view name to its ID.
|
|
82
|
+
*/
|
|
83
|
+
export function resolveView(config, name) {
|
|
84
|
+
const lower = name.toLowerCase();
|
|
85
|
+
const match = config.views.find((v) => v.name.toLowerCase() === lower);
|
|
86
|
+
if (match)
|
|
87
|
+
return match._id;
|
|
88
|
+
throw new Error(`Unknown view "${name}". Available: ${config.views.map((v) => v.name).join(", ")}`);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolve custom column name + option label to column ID + option ID.
|
|
92
|
+
*/
|
|
93
|
+
export function resolveCustomColumnValue(config, columnName, optionLabel) {
|
|
94
|
+
const lower = columnName.toLowerCase();
|
|
95
|
+
const column = config.customColumns.find((c) => c.name.toLowerCase() === lower);
|
|
96
|
+
if (!column) {
|
|
97
|
+
throw new Error(`Unknown custom column "${columnName}". Available: ${config.customColumns.map((c) => c.name).join(", ")}`);
|
|
98
|
+
}
|
|
99
|
+
const optLower = optionLabel.toLowerCase();
|
|
100
|
+
const option = column.options.find((o) => o.label.toLowerCase() === optLower);
|
|
101
|
+
if (!option) {
|
|
102
|
+
throw new Error(`Unknown option "${optionLabel}" for column "${columnName}". Available: ${column.options.map((o) => o.label).join(", ")}`);
|
|
103
|
+
}
|
|
104
|
+
return { columnId: column._id, optionId: option.id };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../src/resolvers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { convexFetch } from "../client.js";
|
|
3
|
+
import { getWorkspaceConfig, invalidateConfigCache, resolveStatus, resolvePriority, resolveMember, resolveView, resolveCustomColumnValue, } from "../resolvers.js";
|
|
4
|
+
import { formatWorkspaceInfo, formatTaskList, formatTaskDetail, formatSearchResults, formatProjectList, formatMilestoneList, } from "../formatters.js";
|
|
5
|
+
function textResult(text) {
|
|
6
|
+
return { content: [{ type: "text", text }] };
|
|
7
|
+
}
|
|
8
|
+
function errorResult(message) {
|
|
9
|
+
return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
|
|
10
|
+
}
|
|
11
|
+
export function registerTools(server) {
|
|
12
|
+
// ─── get_workspace_info ─────────────────────────────────────────────────
|
|
13
|
+
server.tool("get_workspace_info", "Get workspace configuration including valid statuses, priorities, custom columns, members, and views. Call this first to understand what values are valid for other tools.", {}, async () => {
|
|
14
|
+
try {
|
|
15
|
+
const config = await getWorkspaceConfig();
|
|
16
|
+
return textResult(formatWorkspaceInfo(config));
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
// ─── list_tasks ─────────────────────────────────────────────────────────
|
|
23
|
+
server.tool("list_tasks", "List tasks in the workspace with optional filters. Use get_workspace_info first to see valid status/priority/member names.", {
|
|
24
|
+
status: z.string().optional().describe("Filter by status name (e.g., 'In Progress')"),
|
|
25
|
+
priority: z.string().optional().describe("Filter by priority name (e.g., 'P1')"),
|
|
26
|
+
assignee: z.string().optional().describe("Filter by assignee name or email"),
|
|
27
|
+
level: z.enum(["project", "milestone", "task", "subtask"]).optional().describe("Filter by task level"),
|
|
28
|
+
overdue: z.boolean().optional().describe("If true, only show overdue tasks"),
|
|
29
|
+
limit: z.number().min(1).max(100).optional().describe("Max results (default 20)"),
|
|
30
|
+
}, async (params) => {
|
|
31
|
+
try {
|
|
32
|
+
const config = await getWorkspaceConfig();
|
|
33
|
+
const body = { limit: params.limit ?? 20 };
|
|
34
|
+
if (params.status)
|
|
35
|
+
body.status = resolveStatus(config, params.status);
|
|
36
|
+
if (params.priority)
|
|
37
|
+
body.priority = resolvePriority(config, params.priority);
|
|
38
|
+
if (params.assignee)
|
|
39
|
+
body.assigneeId = resolveMember(config, params.assignee);
|
|
40
|
+
if (params.level)
|
|
41
|
+
body.taskLevel = params.level;
|
|
42
|
+
if (params.overdue)
|
|
43
|
+
body.overdue = true;
|
|
44
|
+
const tasks = await convexFetch("/mcp/tasks/list", { method: "POST", body });
|
|
45
|
+
return textResult(formatTaskList(tasks));
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// ─── get_task ───────────────────────────────────────────────────────────
|
|
52
|
+
server.tool("get_task", "Get full details of a specific task including children, activity log, and custom fields. Accepts task ID (e.g., 'alpha-42') or internal ID.", {
|
|
53
|
+
task_id: z.string().describe("Task ID (e.g., 'alpha-42') or internal Convex ID"),
|
|
54
|
+
}, async (params) => {
|
|
55
|
+
try {
|
|
56
|
+
const body = {};
|
|
57
|
+
if (params.task_id.startsWith("alpha-")) {
|
|
58
|
+
body.simpleId = params.task_id;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
body.taskId = params.task_id;
|
|
62
|
+
}
|
|
63
|
+
const task = await convexFetch("/mcp/tasks/get", { method: "POST", body });
|
|
64
|
+
return textResult(formatTaskDetail(task));
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// ─── search_tasks ──────────────────────────────────────────────────────
|
|
71
|
+
server.tool("search_tasks", "Search tasks by name or description text.", {
|
|
72
|
+
query: z.string().describe("Search text to match against task names and descriptions"),
|
|
73
|
+
limit: z.number().min(1).max(50).optional().describe("Max results (default 10)"),
|
|
74
|
+
}, async (params) => {
|
|
75
|
+
try {
|
|
76
|
+
const results = await convexFetch("/mcp/tasks/search", {
|
|
77
|
+
method: "POST",
|
|
78
|
+
body: { query: params.query, limit: params.limit ?? 10 },
|
|
79
|
+
});
|
|
80
|
+
return textResult(formatSearchResults(results));
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// ─── list_projects ─────────────────────────────────────────────────────
|
|
87
|
+
server.tool("list_projects", "List all projects in the workspace with milestone and task counts.", {}, async () => {
|
|
88
|
+
try {
|
|
89
|
+
const projects = await convexFetch("/mcp/projects");
|
|
90
|
+
return textResult(formatProjectList(projects));
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// ─── list_milestones ───────────────────────────────────────────────────
|
|
97
|
+
server.tool("list_milestones", "List milestones, optionally filtered by project.", {
|
|
98
|
+
project: z.string().optional().describe("Project ID (alpha-X) to filter milestones"),
|
|
99
|
+
}, async (params) => {
|
|
100
|
+
try {
|
|
101
|
+
const body = {};
|
|
102
|
+
if (params.project)
|
|
103
|
+
body.projectId = params.project;
|
|
104
|
+
const milestones = await convexFetch("/mcp/milestones", {
|
|
105
|
+
method: "POST",
|
|
106
|
+
body,
|
|
107
|
+
});
|
|
108
|
+
return textResult(formatMilestoneList(milestones));
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// ─── create_task ───────────────────────────────────────────────────────
|
|
115
|
+
server.tool("create_task", "Create a new task, milestone, project, or subtask. Use get_workspace_info to see valid statuses, priorities, and members.", {
|
|
116
|
+
name: z.string().describe("Task name (required)"),
|
|
117
|
+
description: z.string().optional().describe("Task description"),
|
|
118
|
+
level: z.enum(["project", "milestone", "task", "subtask"]).optional()
|
|
119
|
+
.describe("Task level. Auto-determined if parent is provided."),
|
|
120
|
+
parent: z.string().optional()
|
|
121
|
+
.describe("Parent task ID (alpha-X). Required for milestones, tasks, and subtasks."),
|
|
122
|
+
view: z.string().optional()
|
|
123
|
+
.describe("View name for top-level projects. Uses first view if not specified."),
|
|
124
|
+
status: z.string().optional().describe("Status name (default: first not_started status)"),
|
|
125
|
+
priority: z.string().optional().describe("Priority name (e.g., 'P1')"),
|
|
126
|
+
assignees: z.array(z.string()).optional().describe("Assignee names or emails"),
|
|
127
|
+
start_date: z.string().optional().describe("Start date (YYYY-MM-DD)"),
|
|
128
|
+
end_date: z.string().optional().describe("End date (YYYY-MM-DD)"),
|
|
129
|
+
due_date: z.string().optional().describe("Due date (YYYY-MM-DD)"),
|
|
130
|
+
estimated_hours: z.number().optional().describe("Estimated hours"),
|
|
131
|
+
custom_fields: z.record(z.string(), z.union([z.string(), z.array(z.string())])).optional()
|
|
132
|
+
.describe("Custom column values as { columnName: optionLabel }"),
|
|
133
|
+
}, async (params) => {
|
|
134
|
+
try {
|
|
135
|
+
const config = await getWorkspaceConfig();
|
|
136
|
+
const body = { name: params.name };
|
|
137
|
+
if (params.description)
|
|
138
|
+
body.description = params.description;
|
|
139
|
+
if (params.level)
|
|
140
|
+
body.taskLevel = params.level;
|
|
141
|
+
if (params.parent)
|
|
142
|
+
body.parentTaskId = params.parent;
|
|
143
|
+
if (params.view) {
|
|
144
|
+
body.viewId = resolveView(config, params.view);
|
|
145
|
+
}
|
|
146
|
+
if (params.status) {
|
|
147
|
+
body.status = resolveStatus(config, params.status);
|
|
148
|
+
}
|
|
149
|
+
if (params.priority) {
|
|
150
|
+
body.priority = resolvePriority(config, params.priority);
|
|
151
|
+
}
|
|
152
|
+
if (params.assignees && params.assignees.length > 0) {
|
|
153
|
+
body.assignees = params.assignees.map((a) => resolveMember(config, a));
|
|
154
|
+
}
|
|
155
|
+
if (params.start_date)
|
|
156
|
+
body.startDate = params.start_date;
|
|
157
|
+
if (params.end_date)
|
|
158
|
+
body.endDate = params.end_date;
|
|
159
|
+
if (params.due_date)
|
|
160
|
+
body.dueDate = params.due_date;
|
|
161
|
+
if (params.estimated_hours)
|
|
162
|
+
body.estimatedHours = params.estimated_hours;
|
|
163
|
+
// Resolve custom fields
|
|
164
|
+
if (params.custom_fields) {
|
|
165
|
+
const resolved = {};
|
|
166
|
+
for (const [colName, value] of Object.entries(params.custom_fields)) {
|
|
167
|
+
if (Array.isArray(value)) {
|
|
168
|
+
const ids = value.map((v) => resolveCustomColumnValue(config, colName, v));
|
|
169
|
+
// All should be same column
|
|
170
|
+
if (ids.length > 0) {
|
|
171
|
+
resolved[ids[0].columnId] = ids.map((i) => i.optionId);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const { columnId, optionId } = resolveCustomColumnValue(config, colName, value);
|
|
176
|
+
resolved[columnId] = optionId;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
body.customFields = resolved;
|
|
180
|
+
}
|
|
181
|
+
const result = await convexFetch("/mcp/tasks/create", { method: "POST", body });
|
|
182
|
+
return textResult(`Task created:\n ID: ${result.simpleId}\n Name: ${params.name}\n Level: ${result.taskLevel}`);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
invalidateConfigCache();
|
|
186
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
// ─── update_task ───────────────────────────────────────────────────────
|
|
190
|
+
server.tool("update_task", "Update one or more fields on an existing task.", {
|
|
191
|
+
task_id: z.string().describe("Task ID (alpha-X) or internal ID"),
|
|
192
|
+
name: z.string().optional(),
|
|
193
|
+
description: z.string().optional(),
|
|
194
|
+
status: z.string().optional().describe("New status name"),
|
|
195
|
+
priority: z.string().nullable().optional().describe("New priority name, or null to clear"),
|
|
196
|
+
add_assignees: z.array(z.string()).optional().describe("Names/emails to add"),
|
|
197
|
+
remove_assignees: z.array(z.string()).optional().describe("Names/emails to remove"),
|
|
198
|
+
start_date: z.string().nullable().optional().describe("YYYY-MM-DD or null to clear"),
|
|
199
|
+
end_date: z.string().nullable().optional().describe("YYYY-MM-DD or null to clear"),
|
|
200
|
+
due_date: z.string().nullable().optional().describe("YYYY-MM-DD or null to clear"),
|
|
201
|
+
estimated_hours: z.number().nullable().optional(),
|
|
202
|
+
custom_fields: z.record(z.string(), z.union([z.string(), z.array(z.string()), z.null()])).optional()
|
|
203
|
+
.describe("Custom field updates: { columnName: newValue } or null to clear"),
|
|
204
|
+
}, async (params) => {
|
|
205
|
+
try {
|
|
206
|
+
const config = await getWorkspaceConfig();
|
|
207
|
+
const body = { taskId: params.task_id };
|
|
208
|
+
if (params.name !== undefined)
|
|
209
|
+
body.name = params.name;
|
|
210
|
+
if (params.description !== undefined)
|
|
211
|
+
body.description = params.description;
|
|
212
|
+
if (params.status)
|
|
213
|
+
body.status = resolveStatus(config, params.status);
|
|
214
|
+
if (params.priority !== undefined) {
|
|
215
|
+
body.priority = params.priority ? resolvePriority(config, params.priority) : null;
|
|
216
|
+
}
|
|
217
|
+
if (params.add_assignees) {
|
|
218
|
+
body.addAssignees = params.add_assignees.map((a) => resolveMember(config, a));
|
|
219
|
+
}
|
|
220
|
+
if (params.remove_assignees) {
|
|
221
|
+
body.removeAssignees = params.remove_assignees.map((a) => resolveMember(config, a));
|
|
222
|
+
}
|
|
223
|
+
if (params.start_date !== undefined)
|
|
224
|
+
body.startDate = params.start_date;
|
|
225
|
+
if (params.end_date !== undefined)
|
|
226
|
+
body.endDate = params.end_date;
|
|
227
|
+
if (params.due_date !== undefined)
|
|
228
|
+
body.dueDate = params.due_date;
|
|
229
|
+
if (params.estimated_hours !== undefined)
|
|
230
|
+
body.estimatedHours = params.estimated_hours;
|
|
231
|
+
// Resolve custom fields
|
|
232
|
+
if (params.custom_fields) {
|
|
233
|
+
const resolved = {};
|
|
234
|
+
for (const [colName, value] of Object.entries(params.custom_fields)) {
|
|
235
|
+
if (value === null) {
|
|
236
|
+
const col = config.customColumns.find((c) => c.name.toLowerCase() === colName.toLowerCase());
|
|
237
|
+
if (col)
|
|
238
|
+
resolved[col._id] = null;
|
|
239
|
+
}
|
|
240
|
+
else if (Array.isArray(value)) {
|
|
241
|
+
const ids = value.map((v) => resolveCustomColumnValue(config, colName, v));
|
|
242
|
+
if (ids.length > 0)
|
|
243
|
+
resolved[ids[0].columnId] = ids.map((i) => i.optionId);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const { columnId, optionId } = resolveCustomColumnValue(config, colName, value);
|
|
247
|
+
resolved[columnId] = optionId;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
body.customFields = resolved;
|
|
251
|
+
}
|
|
252
|
+
const result = await convexFetch("/mcp/tasks/update", { method: "POST", body });
|
|
253
|
+
return textResult(`Task ${result.simpleId} updated successfully.`);
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
invalidateConfigCache();
|
|
257
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
// ─── bulk_update_tasks ─────────────────────────────────────────────────
|
|
261
|
+
server.tool("bulk_update_tasks", "Update multiple tasks at once. Provide task IDs and the updates to apply.", {
|
|
262
|
+
task_ids: z.array(z.string()).describe("Array of task IDs (alpha-X format or internal IDs)"),
|
|
263
|
+
status: z.string().optional().describe("New status name for all tasks"),
|
|
264
|
+
priority: z.string().nullable().optional().describe("New priority name, or null to clear"),
|
|
265
|
+
add_assignee: z.string().optional().describe("Name/email to add to all tasks"),
|
|
266
|
+
remove_assignee: z.string().optional().describe("Name/email to remove from all tasks"),
|
|
267
|
+
}, async (params) => {
|
|
268
|
+
try {
|
|
269
|
+
const config = await getWorkspaceConfig();
|
|
270
|
+
const updates = {};
|
|
271
|
+
if (params.status)
|
|
272
|
+
updates.status = resolveStatus(config, params.status);
|
|
273
|
+
if (params.priority !== undefined) {
|
|
274
|
+
updates.priority = params.priority ? resolvePriority(config, params.priority) : null;
|
|
275
|
+
}
|
|
276
|
+
if (params.add_assignee) {
|
|
277
|
+
updates.addAssignee = resolveMember(config, params.add_assignee);
|
|
278
|
+
}
|
|
279
|
+
if (params.remove_assignee) {
|
|
280
|
+
updates.removeAssignee = resolveMember(config, params.remove_assignee);
|
|
281
|
+
}
|
|
282
|
+
const result = await convexFetch("/mcp/tasks/bulk-update", {
|
|
283
|
+
method: "POST",
|
|
284
|
+
body: { taskIds: params.task_ids, updates },
|
|
285
|
+
});
|
|
286
|
+
let text = `Updated ${result.updatedCount} of ${result.totalRequested} tasks.`;
|
|
287
|
+
if (result.errors.length > 0) {
|
|
288
|
+
text += `\nErrors:\n${result.errors.map((e) => ` - ${e}`).join("\n")}`;
|
|
289
|
+
}
|
|
290
|
+
return textResult(text);
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
invalidateConfigCache();
|
|
294
|
+
return errorResult(e instanceof Error ? e.message : "Unknown error");
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "corkcrm-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for CorkCRM PM — connect Claude to your workspace",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"bin": {
|
|
8
|
+
"corkcrm-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"mcp",
|
|
21
|
+
"claude",
|
|
22
|
+
"project-management",
|
|
23
|
+
"corkcrm"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
27
|
+
"zod": "^3.23.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^20.0.0",
|
|
31
|
+
"typescript": "^5.0.0"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
}
|
|
36
|
+
}
|