@pollychrome/joan-mcp 1.2.0 → 1.3.1

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 (40) hide show
  1. package/dist/client/api-client.d.ts +55 -1
  2. package/dist/client/api-client.d.ts.map +1 -1
  3. package/dist/client/api-client.js +181 -3
  4. package/dist/client/api-client.js.map +1 -1
  5. package/dist/client/types.d.ts +147 -1
  6. package/dist/client/types.d.ts.map +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +11 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/resources/attachments.d.ts +7 -0
  11. package/dist/resources/attachments.d.ts.map +1 -0
  12. package/dist/resources/attachments.js +145 -0
  13. package/dist/resources/attachments.js.map +1 -0
  14. package/dist/resources/comments.d.ts +7 -0
  15. package/dist/resources/comments.d.ts.map +1 -0
  16. package/dist/resources/comments.js +39 -0
  17. package/dist/resources/comments.js.map +1 -0
  18. package/dist/resources/index.d.ts +3 -1
  19. package/dist/resources/index.d.ts.map +1 -1
  20. package/dist/resources/index.js +5 -1
  21. package/dist/resources/index.js.map +1 -1
  22. package/dist/tools/attachments.d.ts +7 -0
  23. package/dist/tools/attachments.d.ts.map +1 -0
  24. package/dist/tools/attachments.js +428 -0
  25. package/dist/tools/attachments.js.map +1 -0
  26. package/dist/tools/comments.d.ts +7 -0
  27. package/dist/tools/comments.d.ts.map +1 -0
  28. package/dist/tools/comments.js +188 -0
  29. package/dist/tools/comments.js.map +1 -0
  30. package/dist/tools/index.d.ts +4 -1
  31. package/dist/tools/index.d.ts.map +1 -1
  32. package/dist/tools/index.js +7 -1
  33. package/dist/tools/index.js.map +1 -1
  34. package/dist/tools/resources.d.ts +7 -0
  35. package/dist/tools/resources.d.ts.map +1 -0
  36. package/dist/tools/resources.js +380 -0
  37. package/dist/tools/resources.js.map +1 -0
  38. package/dist/tools/tasks.js +4 -4
  39. package/dist/tools/tasks.js.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * MCP resources for attachment data
3
+ */
4
+ export function registerAttachmentResources(server, client) {
5
+ // Project attachments
6
+ server.resource('joan://projects/{projectId}/attachments', 'Get file attachments for a project', async (uri) => {
7
+ const match = uri.pathname.match(/^\/\/projects\/([^/]+)\/attachments$/);
8
+ const projectId = match?.[1];
9
+ if (!projectId) {
10
+ throw new Error('Invalid project attachments URI');
11
+ }
12
+ const attachments = await client.listAttachmentsByEntity('project', projectId);
13
+ return {
14
+ contents: [{
15
+ uri: uri.toString(),
16
+ mimeType: 'application/json',
17
+ text: JSON.stringify(attachments, null, 2),
18
+ }],
19
+ };
20
+ });
21
+ // Project attachment hierarchy
22
+ server.resource('joan://projects/{projectId}/attachments/hierarchy', 'Get all attachments organized by project hierarchy (project → milestones → tasks)', async (uri) => {
23
+ const match = uri.pathname.match(/^\/\/projects\/([^/]+)\/attachments\/hierarchy$/);
24
+ const projectId = match?.[1];
25
+ if (!projectId) {
26
+ throw new Error('Invalid project attachments hierarchy URI');
27
+ }
28
+ const hierarchy = await client.getProjectAttachmentHierarchy(projectId);
29
+ return {
30
+ contents: [{
31
+ uri: uri.toString(),
32
+ mimeType: 'application/json',
33
+ text: JSON.stringify(hierarchy, null, 2),
34
+ }],
35
+ };
36
+ });
37
+ // Milestone attachments
38
+ server.resource('joan://projects/{projectId}/milestones/{milestoneId}/attachments', 'Get file attachments for a milestone', async (uri) => {
39
+ const match = uri.pathname.match(/^\/\/projects\/([^/]+)\/milestones\/([^/]+)\/attachments$/);
40
+ const milestoneId = match?.[2];
41
+ if (!milestoneId) {
42
+ throw new Error('Invalid milestone attachments URI');
43
+ }
44
+ const attachments = await client.listAttachmentsByEntity('milestone', milestoneId);
45
+ return {
46
+ contents: [{
47
+ uri: uri.toString(),
48
+ mimeType: 'application/json',
49
+ text: JSON.stringify(attachments, null, 2),
50
+ }],
51
+ };
52
+ });
53
+ // Task attachments
54
+ server.resource('joan://tasks/{taskId}/attachments', 'Get file attachments for a task', async (uri) => {
55
+ const match = uri.pathname.match(/^\/\/tasks\/([^/]+)\/attachments$/);
56
+ const taskId = match?.[1];
57
+ if (!taskId) {
58
+ throw new Error('Invalid task attachments URI');
59
+ }
60
+ const attachments = await client.listAttachmentsByEntity('task', taskId);
61
+ return {
62
+ contents: [{
63
+ uri: uri.toString(),
64
+ mimeType: 'application/json',
65
+ text: JSON.stringify(attachments, null, 2),
66
+ }],
67
+ };
68
+ });
69
+ // Note attachments
70
+ server.resource('joan://notes/{noteId}/attachments', 'Get file attachments for a note', async (uri) => {
71
+ const match = uri.pathname.match(/^\/\/notes\/([^/]+)\/attachments$/);
72
+ const noteId = match?.[1];
73
+ if (!noteId) {
74
+ throw new Error('Invalid note attachments URI');
75
+ }
76
+ const attachments = await client.listAttachmentsByEntity('note', noteId);
77
+ return {
78
+ contents: [{
79
+ uri: uri.toString(),
80
+ mimeType: 'application/json',
81
+ text: JSON.stringify(attachments, null, 2),
82
+ }],
83
+ };
84
+ });
85
+ // Single attachment metadata
86
+ server.resource('joan://attachments/{attachmentId}', 'Get metadata for a specific attachment', async (uri) => {
87
+ const match = uri.pathname.match(/^\/\/attachments\/([^/]+)$/);
88
+ const attachmentId = match?.[1];
89
+ if (!attachmentId) {
90
+ throw new Error('Invalid attachment URI');
91
+ }
92
+ const attachment = await client.getAttachmentMetadata(attachmentId);
93
+ return {
94
+ contents: [{
95
+ uri: uri.toString(),
96
+ mimeType: 'application/json',
97
+ text: JSON.stringify(attachment, null, 2),
98
+ }],
99
+ };
100
+ });
101
+ // Storage usage
102
+ server.resource('joan://attachments/usage', 'Get storage usage statistics for the current user', async (uri) => {
103
+ const usage = await client.getStorageUsage();
104
+ return {
105
+ contents: [{
106
+ uri: uri.toString(),
107
+ mimeType: 'application/json',
108
+ text: JSON.stringify(usage, null, 2),
109
+ }],
110
+ };
111
+ });
112
+ // Task resources (links/notes)
113
+ server.resource('joan://tasks/{taskId}/resources', 'Get resources (links, notes, references) attached to a task', async (uri) => {
114
+ const match = uri.pathname.match(/^\/\/tasks\/([^/]+)\/resources$/);
115
+ const taskId = match?.[1];
116
+ if (!taskId) {
117
+ throw new Error('Invalid task resources URI');
118
+ }
119
+ const resources = await client.listTaskResources(taskId);
120
+ return {
121
+ contents: [{
122
+ uri: uri.toString(),
123
+ mimeType: 'application/json',
124
+ text: JSON.stringify(resources, null, 2),
125
+ }],
126
+ };
127
+ });
128
+ // Project resources (links/notes)
129
+ server.resource('joan://projects/{projectId}/resources', 'Get resources (links, notes) attached to a project', async (uri) => {
130
+ const match = uri.pathname.match(/^\/\/projects\/([^/]+)\/resources$/);
131
+ const projectId = match?.[1];
132
+ if (!projectId) {
133
+ throw new Error('Invalid project resources URI');
134
+ }
135
+ const resources = await client.listProjectResources(projectId);
136
+ return {
137
+ contents: [{
138
+ uri: uri.toString(),
139
+ mimeType: 'application/json',
140
+ text: JSON.stringify(resources, null, 2),
141
+ }],
142
+ };
143
+ });
144
+ }
145
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/resources/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP resources for comment data
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { JoanApiClient } from '../client/api-client.js';
6
+ export declare function registerCommentResources(server: McpServer, client: JoanApiClient): void;
7
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/resources/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAmDvF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * MCP resources for comment data
3
+ */
4
+ export function registerCommentResources(server, client) {
5
+ // Task comments resource
6
+ server.resource('joan://tasks/{taskId}/comments', 'Get all comments for a specific task', async (uri) => {
7
+ const match = uri.pathname.match(/^\/\/tasks\/([^/]+)\/comments$/);
8
+ const taskId = match?.[1];
9
+ if (!taskId) {
10
+ throw new Error('Invalid task comments URI');
11
+ }
12
+ const comments = await client.listTaskComments(taskId);
13
+ return {
14
+ contents: [{
15
+ uri: uri.toString(),
16
+ mimeType: 'application/json',
17
+ text: JSON.stringify(comments, null, 2),
18
+ }],
19
+ };
20
+ });
21
+ // Milestone comments resource
22
+ server.resource('joan://projects/{projectId}/milestones/{milestoneId}/comments', 'Get all comments for a specific milestone', async (uri) => {
23
+ const match = uri.pathname.match(/^\/\/projects\/([^/]+)\/milestones\/([^/]+)\/comments$/);
24
+ const projectId = match?.[1];
25
+ const milestoneId = match?.[2];
26
+ if (!projectId || !milestoneId) {
27
+ throw new Error('Invalid milestone comments URI');
28
+ }
29
+ const comments = await client.listMilestoneComments(projectId, milestoneId);
30
+ return {
31
+ contents: [{
32
+ uri: uri.toString(),
33
+ mimeType: 'application/json',
34
+ text: JSON.stringify(comments, null, 2),
35
+ }],
36
+ };
37
+ });
38
+ }
39
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/resources/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAqB;IAC/E,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CACb,gCAAgC,EAChC,sCAAsC,EACtC,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEvD,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,QAAQ,CACb,+DAA+D,EAC/D,2CAA2C,EAC3C,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAC9B,wDAAwD,CACzD,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAE5E,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -8,9 +8,11 @@ import { registerTaskResources } from './tasks.js';
8
8
  import { registerMilestoneResources } from './milestones.js';
9
9
  import { registerGoalResources } from './goals.js';
10
10
  import { registerNoteResources } from './notes.js';
11
+ import { registerCommentResources } from './comments.js';
12
+ import { registerAttachmentResources } from './attachments.js';
11
13
  /**
12
14
  * Register all resources with the MCP server
13
15
  */
14
16
  export declare function registerAllResources(server: McpServer, client: JoanApiClient): void;
15
- export { registerProjectResources, registerTaskResources, registerMilestoneResources, registerGoalResources, registerNoteResources, };
17
+ export { registerProjectResources, registerTaskResources, registerMilestoneResources, registerGoalResources, registerNoteResources, registerCommentResources, registerAttachmentResources, };
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAMnF;AAED,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAQnF;AAED,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,GAC5B,CAAC"}
@@ -6,6 +6,8 @@ import { registerTaskResources } from './tasks.js';
6
6
  import { registerMilestoneResources } from './milestones.js';
7
7
  import { registerGoalResources } from './goals.js';
8
8
  import { registerNoteResources } from './notes.js';
9
+ import { registerCommentResources } from './comments.js';
10
+ import { registerAttachmentResources } from './attachments.js';
9
11
  /**
10
12
  * Register all resources with the MCP server
11
13
  */
@@ -15,6 +17,8 @@ export function registerAllResources(server, client) {
15
17
  registerMilestoneResources(server, client);
16
18
  registerGoalResources(server, client);
17
19
  registerNoteResources(server, client);
20
+ registerCommentResources(server, client);
21
+ registerAttachmentResources(server, client);
18
22
  }
19
- export { registerProjectResources, registerTaskResources, registerMilestoneResources, registerGoalResources, registerNoteResources, };
23
+ export { registerProjectResources, registerTaskResources, registerMilestoneResources, registerGoalResources, registerNoteResources, registerCommentResources, registerAttachmentResources, };
20
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAqB;IAC3E,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAqB;IAC3E,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,GAC5B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools for file attachment management
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { JoanApiClient } from '../client/api-client.js';
6
+ export declare function registerAttachmentTools(server: McpServer, client: JoanApiClient): void;
7
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA4E7D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA4atF"}