@pollychrome/joan-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +385 -0
  2. package/bin/joan-mcp +16 -0
  3. package/dist/auth.d.ts +49 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +264 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cli.d.ts +7 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +326 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client/api-client.d.ts +86 -0
  12. package/dist/client/api-client.d.ts.map +1 -0
  13. package/dist/client/api-client.js +182 -0
  14. package/dist/client/api-client.js.map +1 -0
  15. package/dist/client/types.d.ts +270 -0
  16. package/dist/client/types.d.ts.map +1 -0
  17. package/dist/client/types.js +5 -0
  18. package/dist/client/types.js.map +1 -0
  19. package/dist/config.d.ts +33 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +71 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +118 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/resources/goals.d.ts +7 -0
  28. package/dist/resources/goals.d.ts.map +1 -0
  29. package/dist/resources/goals.js +49 -0
  30. package/dist/resources/goals.js.map +1 -0
  31. package/dist/resources/index.d.ts +16 -0
  32. package/dist/resources/index.d.ts.map +1 -0
  33. package/dist/resources/index.js +20 -0
  34. package/dist/resources/index.js.map +1 -0
  35. package/dist/resources/milestones.d.ts +7 -0
  36. package/dist/resources/milestones.d.ts.map +1 -0
  37. package/dist/resources/milestones.js +40 -0
  38. package/dist/resources/milestones.js.map +1 -0
  39. package/dist/resources/notes.d.ts +7 -0
  40. package/dist/resources/notes.d.ts.map +1 -0
  41. package/dist/resources/notes.js +33 -0
  42. package/dist/resources/notes.js.map +1 -0
  43. package/dist/resources/projects.d.ts +7 -0
  44. package/dist/resources/projects.d.ts.map +1 -0
  45. package/dist/resources/projects.js +97 -0
  46. package/dist/resources/projects.js.map +1 -0
  47. package/dist/resources/tasks.d.ts +7 -0
  48. package/dist/resources/tasks.d.ts.map +1 -0
  49. package/dist/resources/tasks.js +36 -0
  50. package/dist/resources/tasks.js.map +1 -0
  51. package/dist/tools/goals.d.ts +7 -0
  52. package/dist/tools/goals.d.ts.map +1 -0
  53. package/dist/tools/goals.js +114 -0
  54. package/dist/tools/goals.js.map +1 -0
  55. package/dist/tools/index.d.ts +16 -0
  56. package/dist/tools/index.d.ts.map +1 -0
  57. package/dist/tools/index.js +20 -0
  58. package/dist/tools/index.js.map +1 -0
  59. package/dist/tools/milestones.d.ts +7 -0
  60. package/dist/tools/milestones.d.ts.map +1 -0
  61. package/dist/tools/milestones.js +119 -0
  62. package/dist/tools/milestones.js.map +1 -0
  63. package/dist/tools/notes.d.ts +7 -0
  64. package/dist/tools/notes.d.ts.map +1 -0
  65. package/dist/tools/notes.js +82 -0
  66. package/dist/tools/notes.js.map +1 -0
  67. package/dist/tools/projects.d.ts +7 -0
  68. package/dist/tools/projects.d.ts.map +1 -0
  69. package/dist/tools/projects.js +63 -0
  70. package/dist/tools/projects.js.map +1 -0
  71. package/dist/tools/tasks.d.ts +7 -0
  72. package/dist/tools/tasks.d.ts.map +1 -0
  73. package/dist/tools/tasks.js +125 -0
  74. package/dist/tools/tasks.js.map +1 -0
  75. package/dist/utils/converters.d.ts +78 -0
  76. package/dist/utils/converters.d.ts.map +1 -0
  77. package/dist/utils/converters.js +79 -0
  78. package/dist/utils/converters.js.map +1 -0
  79. package/dist/utils/errors.d.ts +27 -0
  80. package/dist/utils/errors.d.ts.map +1 -0
  81. package/dist/utils/errors.js +104 -0
  82. package/dist/utils/errors.js.map +1 -0
  83. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAqB;IACxE,cAAc;IACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4EAA4E,EAC5E;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACxF,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACxF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACxF,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACrG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;KAC3D,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC;gBAC/B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;YAC3C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAEnC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;qBACxG,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,cAAc;IACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,kCAAkC,EAClC;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACrE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnG,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACvF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC1E,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC3F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC1E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KAC/D,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC;gBAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YAEH,+BAA+B;YAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAQ,QAA+C,CAAC,KAAK,CAAC;YAChE,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;YAC3C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,EAAE,GAAG;qBACtD,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2BAA2B,EAC3B;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KAC3D,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,KAAK,CAAC,OAAO,sBAAsB;qBAClD,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,cAAc;IACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gBAAgB,EAChB;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,KAAK,CAAC,OAAO,UAAU;qBACtC,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Data format converters between Joan frontend/API and MCP server
3
+ */
4
+ export declare function statusToBackend(status: string): string;
5
+ export declare function statusToFrontend(status: string): string;
6
+ export declare function priorityToNumber(priority: string): number;
7
+ export declare function priorityToString(priority: number): string;
8
+ export declare function pomodorosToMinutes(pomodoros: number): number;
9
+ export declare function minutesToPomodoros(minutes: number): number;
10
+ export interface ApiTask {
11
+ id: string;
12
+ title: string;
13
+ description?: string;
14
+ status: string;
15
+ priority: number;
16
+ due_date?: string;
17
+ estimated_minutes?: number;
18
+ actual_minutes?: number;
19
+ project_id?: string;
20
+ column_id?: string;
21
+ assignee_id?: string;
22
+ assignee_name?: string;
23
+ task_number?: number;
24
+ milestone_id?: string;
25
+ milestone_name?: string;
26
+ tags?: string[];
27
+ completed_at?: string;
28
+ created_at: string;
29
+ updated_at: string;
30
+ }
31
+ export interface FormattedTask {
32
+ id: string;
33
+ title: string;
34
+ description?: string;
35
+ status: string;
36
+ priority: string;
37
+ due_date?: string;
38
+ estimated_pomodoros?: number;
39
+ actual_pomodoros?: number;
40
+ project_id?: string;
41
+ column_id?: string;
42
+ assignee_id?: string;
43
+ assignee_name?: string;
44
+ task_number?: number;
45
+ milestone_id?: string;
46
+ milestone_name?: string;
47
+ tags?: string[];
48
+ completed_at?: string;
49
+ created_at: string;
50
+ updated_at: string;
51
+ }
52
+ export declare function formatTask(task: ApiTask): FormattedTask;
53
+ export interface TaskInput {
54
+ title: string;
55
+ description?: string;
56
+ status?: string;
57
+ priority?: string;
58
+ due_date?: string;
59
+ estimated_pomodoros?: number;
60
+ project_id?: string;
61
+ column_id?: string;
62
+ assignee_id?: string;
63
+ tags?: string[];
64
+ }
65
+ export interface ApiTaskInput {
66
+ title: string;
67
+ description?: string;
68
+ status?: string;
69
+ priority?: number;
70
+ due_date?: string;
71
+ estimated_minutes?: number;
72
+ project_id?: string;
73
+ column_id?: string;
74
+ assignee_id?: string;
75
+ tags?: string[];
76
+ }
77
+ export declare function formatTaskInput(input: TaskInput): ApiTaskInput;
78
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/utils/converters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Data format converters between Joan frontend/API and MCP server
3
+ */
4
+ // Status conversions (frontend format <-> backend format)
5
+ const STATUS_TO_BACKEND = {
6
+ 'todo': 'pending',
7
+ 'in_progress': 'in_progress',
8
+ 'done': 'completed',
9
+ 'cancelled': 'cancelled',
10
+ };
11
+ const STATUS_TO_FRONTEND = {
12
+ 'pending': 'todo',
13
+ 'in_progress': 'in_progress',
14
+ 'completed': 'done',
15
+ 'cancelled': 'cancelled',
16
+ };
17
+ export function statusToBackend(status) {
18
+ return STATUS_TO_BACKEND[status] || 'pending';
19
+ }
20
+ export function statusToFrontend(status) {
21
+ return STATUS_TO_FRONTEND[status] || 'todo';
22
+ }
23
+ // Priority conversions (string <-> number)
24
+ const PRIORITY_TO_NUMBER = {
25
+ 'none': 0,
26
+ 'low': 1,
27
+ 'medium': 2,
28
+ 'high': 3,
29
+ };
30
+ const PRIORITY_TO_STRING = {
31
+ 0: 'none',
32
+ 1: 'low',
33
+ 2: 'medium',
34
+ 3: 'high',
35
+ };
36
+ export function priorityToNumber(priority) {
37
+ return PRIORITY_TO_NUMBER[priority] ?? 0;
38
+ }
39
+ export function priorityToString(priority) {
40
+ return PRIORITY_TO_STRING[priority] ?? 'none';
41
+ }
42
+ // Time conversions (pomodoros are 25-minute units)
43
+ const POMODORO_MINUTES = 25;
44
+ export function pomodorosToMinutes(pomodoros) {
45
+ return pomodoros * POMODORO_MINUTES;
46
+ }
47
+ export function minutesToPomodoros(minutes) {
48
+ return Math.round(minutes / POMODORO_MINUTES);
49
+ }
50
+ export function formatTask(task) {
51
+ return {
52
+ ...task,
53
+ status: statusToFrontend(task.status),
54
+ priority: priorityToString(task.priority),
55
+ estimated_pomodoros: task.estimated_minutes
56
+ ? minutesToPomodoros(task.estimated_minutes)
57
+ : undefined,
58
+ actual_pomodoros: task.actual_minutes
59
+ ? minutesToPomodoros(task.actual_minutes)
60
+ : undefined,
61
+ };
62
+ }
63
+ export function formatTaskInput(input) {
64
+ return {
65
+ title: input.title,
66
+ description: input.description,
67
+ status: input.status ? statusToBackend(input.status) : undefined,
68
+ priority: input.priority ? priorityToNumber(input.priority) : undefined,
69
+ due_date: input.due_date,
70
+ estimated_minutes: input.estimated_pomodoros
71
+ ? pomodorosToMinutes(input.estimated_pomodoros)
72
+ : undefined,
73
+ project_id: input.project_id,
74
+ column_id: input.column_id,
75
+ assignee_id: input.assignee_id,
76
+ tags: input.tags,
77
+ };
78
+ }
79
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/utils/converters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Error handling utilities for Joan MCP server
3
+ */
4
+ export declare class JoanApiError extends Error {
5
+ statusCode: number;
6
+ details?: unknown | undefined;
7
+ constructor(statusCode: number, message: string, details?: unknown | undefined);
8
+ static isJoanApiError(error: unknown): error is JoanApiError;
9
+ }
10
+ export declare class AuthenticationError extends Error {
11
+ constructor(message?: string);
12
+ }
13
+ export declare class ConfigurationError extends Error {
14
+ constructor(message: string);
15
+ }
16
+ /**
17
+ * Format an error for MCP response content
18
+ */
19
+ export declare function formatErrorForMcp(error: unknown): {
20
+ type: 'text';
21
+ text: string;
22
+ }[];
23
+ /**
24
+ * Wrap an async function to catch errors and format them for MCP
25
+ */
26
+ export declare function withErrorHandling<T extends unknown[], R>(fn: (...args: T) => Promise<R>): (...args: T) => Promise<R>;
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,YAAa,SAAQ,KAAK;IAE5B,UAAU,EAAE,MAAM;IAElB,OAAO,CAAC,EAAE,OAAO;gBAFjB,UAAU,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,OAAO,YAAA;IAM1B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY;CAG7D;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,GAAE,MAAgC;CAItD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CA6DlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EACtD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7B,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAS5B"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Error handling utilities for Joan MCP server
3
+ */
4
+ export class JoanApiError extends Error {
5
+ statusCode;
6
+ details;
7
+ constructor(statusCode, message, details) {
8
+ super(message);
9
+ this.statusCode = statusCode;
10
+ this.details = details;
11
+ this.name = 'JoanApiError';
12
+ }
13
+ static isJoanApiError(error) {
14
+ return error instanceof JoanApiError;
15
+ }
16
+ }
17
+ export class AuthenticationError extends Error {
18
+ constructor(message = 'Authentication failed') {
19
+ super(message);
20
+ this.name = 'AuthenticationError';
21
+ }
22
+ }
23
+ export class ConfigurationError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = 'ConfigurationError';
27
+ }
28
+ }
29
+ /**
30
+ * Format an error for MCP response content
31
+ */
32
+ export function formatErrorForMcp(error) {
33
+ if (error instanceof JoanApiError) {
34
+ switch (error.statusCode) {
35
+ case 401:
36
+ return [{
37
+ type: 'text',
38
+ text: 'Authentication failed. Please run "joan-mcp login" to authenticate or check your JOAN_AUTH_TOKEN environment variable.',
39
+ }];
40
+ case 403:
41
+ return [{
42
+ type: 'text',
43
+ text: `Access denied: ${error.message}`,
44
+ }];
45
+ case 404:
46
+ return [{
47
+ type: 'text',
48
+ text: `Resource not found: ${error.message}`,
49
+ }];
50
+ case 422:
51
+ return [{
52
+ type: 'text',
53
+ text: `Validation error: ${error.message}${error.details ? `\nDetails: ${JSON.stringify(error.details, null, 2)}` : ''}`,
54
+ }];
55
+ case 429:
56
+ return [{
57
+ type: 'text',
58
+ text: 'Rate limit exceeded. Please wait before making more requests.',
59
+ }];
60
+ default:
61
+ return [{
62
+ type: 'text',
63
+ text: `API Error (${error.statusCode}): ${error.message}`,
64
+ }];
65
+ }
66
+ }
67
+ if (error instanceof AuthenticationError) {
68
+ return [{
69
+ type: 'text',
70
+ text: `Authentication error: ${error.message}. Run "joan-mcp login" to authenticate.`,
71
+ }];
72
+ }
73
+ if (error instanceof ConfigurationError) {
74
+ return [{
75
+ type: 'text',
76
+ text: `Configuration error: ${error.message}`,
77
+ }];
78
+ }
79
+ if (error instanceof Error) {
80
+ return [{
81
+ type: 'text',
82
+ text: `Error: ${error.message}`,
83
+ }];
84
+ }
85
+ return [{
86
+ type: 'text',
87
+ text: `Unknown error: ${String(error)}`,
88
+ }];
89
+ }
90
+ /**
91
+ * Wrap an async function to catch errors and format them for MCP
92
+ */
93
+ export function withErrorHandling(fn) {
94
+ return async (...args) => {
95
+ try {
96
+ return await fn(...args);
97
+ }
98
+ catch (error) {
99
+ // Re-throw so the MCP server can handle it
100
+ throw error;
101
+ }
102
+ };
103
+ }
104
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@pollychrome/joan-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Joan productivity app - enables AI assistants to manage projects, tasks, goals, milestones, and notes",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "joan-mcp": "./bin/joan-mcp"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/cli.ts serve",
13
+ "start": "node dist/cli.js serve",
14
+ "typecheck": "tsc --noEmit",
15
+ "login": "tsx src/cli.ts login",
16
+ "status": "tsx src/cli.ts status"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "model-context-protocol",
21
+ "joan",
22
+ "productivity",
23
+ "ai",
24
+ "claude"
25
+ ],
26
+ "author": "Alex Benson",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/pollychrome/Joan.git",
31
+ "directory": "mcp-server"
32
+ },
33
+ "homepage": "https://github.com/pollychrome/Joan/tree/main/mcp-server#readme",
34
+ "bugs": {
35
+ "url": "https://github.com/pollychrome/Joan/issues"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.0.0",
39
+ "zod": "^3.23.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.0.0",
43
+ "tsx": "^4.0.0",
44
+ "typescript": "^5.7.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "files": [
50
+ "dist",
51
+ "bin"
52
+ ]
53
+ }