@rockhopper-co/mcp-server 0.2.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 (92) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +157 -0
  4. package/dist/api-client.d.ts +54 -0
  5. package/dist/api-client.d.ts.map +1 -0
  6. package/dist/api-client.js +120 -0
  7. package/dist/api-client.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +19 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/prompts/index.d.ts +4 -0
  13. package/dist/prompts/index.d.ts.map +1 -0
  14. package/dist/prompts/index.js +156 -0
  15. package/dist/prompts/index.js.map +1 -0
  16. package/dist/resources/changes.d.ts +4 -0
  17. package/dist/resources/changes.d.ts.map +1 -0
  18. package/dist/resources/changes.js +33 -0
  19. package/dist/resources/changes.js.map +1 -0
  20. package/dist/resources/comments.d.ts +4 -0
  21. package/dist/resources/comments.d.ts.map +1 -0
  22. package/dist/resources/comments.js +31 -0
  23. package/dist/resources/comments.js.map +1 -0
  24. package/dist/resources/files.d.ts +4 -0
  25. package/dist/resources/files.d.ts.map +1 -0
  26. package/dist/resources/files.js +48 -0
  27. package/dist/resources/files.js.map +1 -0
  28. package/dist/resources/index.d.ts +4 -0
  29. package/dist/resources/index.d.ts.map +1 -0
  30. package/dist/resources/index.js +15 -0
  31. package/dist/resources/index.js.map +1 -0
  32. package/dist/resources/reviews.d.ts +4 -0
  33. package/dist/resources/reviews.d.ts.map +1 -0
  34. package/dist/resources/reviews.js +40 -0
  35. package/dist/resources/reviews.js.map +1 -0
  36. package/dist/resources/teams.d.ts +4 -0
  37. package/dist/resources/teams.d.ts.map +1 -0
  38. package/dist/resources/teams.js +22 -0
  39. package/dist/resources/teams.js.map +1 -0
  40. package/dist/resources/versions.d.ts +4 -0
  41. package/dist/resources/versions.d.ts.map +1 -0
  42. package/dist/resources/versions.js +49 -0
  43. package/dist/resources/versions.js.map +1 -0
  44. package/dist/server.d.ts +4 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +22 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/tools/get-cell-history.d.ts +4 -0
  49. package/dist/tools/get-cell-history.d.ts.map +1 -0
  50. package/dist/tools/get-cell-history.js +50 -0
  51. package/dist/tools/get-cell-history.js.map +1 -0
  52. package/dist/tools/get-comments.d.ts +4 -0
  53. package/dist/tools/get-comments.d.ts.map +1 -0
  54. package/dist/tools/get-comments.js +53 -0
  55. package/dist/tools/get-comments.js.map +1 -0
  56. package/dist/tools/get-reviews.d.ts +4 -0
  57. package/dist/tools/get-reviews.d.ts.map +1 -0
  58. package/dist/tools/get-reviews.js +71 -0
  59. package/dist/tools/get-reviews.js.map +1 -0
  60. package/dist/tools/get-versions.d.ts +4 -0
  61. package/dist/tools/get-versions.d.ts.map +1 -0
  62. package/dist/tools/get-versions.js +56 -0
  63. package/dist/tools/get-versions.js.map +1 -0
  64. package/dist/tools/index.d.ts +4 -0
  65. package/dist/tools/index.d.ts.map +1 -0
  66. package/dist/tools/index.js +23 -0
  67. package/dist/tools/index.js.map +1 -0
  68. package/dist/tools/list-files.d.ts +4 -0
  69. package/dist/tools/list-files.d.ts.map +1 -0
  70. package/dist/tools/list-files.js +45 -0
  71. package/dist/tools/list-files.js.map +1 -0
  72. package/dist/tools/search.d.ts +4 -0
  73. package/dist/tools/search.d.ts.map +1 -0
  74. package/dist/tools/search.js +94 -0
  75. package/dist/tools/search.js.map +1 -0
  76. package/dist/tools/write-comments.d.ts +4 -0
  77. package/dist/tools/write-comments.d.ts.map +1 -0
  78. package/dist/tools/write-comments.js +142 -0
  79. package/dist/tools/write-comments.js.map +1 -0
  80. package/dist/tools/write-files.d.ts +4 -0
  81. package/dist/tools/write-files.d.ts.map +1 -0
  82. package/dist/tools/write-files.js +40 -0
  83. package/dist/tools/write-files.js.map +1 -0
  84. package/dist/tools/write-reviews.d.ts +4 -0
  85. package/dist/tools/write-reviews.d.ts.map +1 -0
  86. package/dist/tools/write-reviews.js +107 -0
  87. package/dist/tools/write-reviews.js.map +1 -0
  88. package/dist/types.d.ts +106 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/types.js +2 -0
  91. package/dist/types.js.map +1 -0
  92. package/package.json +72 -0
@@ -0,0 +1,33 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerChangeResources(server, api) {
3
+ server.registerResource('unattributed-changes', new ResourceTemplate('rockhopper://files/{fileMsId}/changes', {
4
+ list: async () => {
5
+ const files = await api.listEnrolledFiles();
6
+ return {
7
+ resources: files
8
+ .filter((f) => f.hasUncommittedChanges)
9
+ .map((f) => ({
10
+ uri: `rockhopper://files/${f.platformId}/changes`,
11
+ name: `Unattributed changes in ${f.name}`,
12
+ mimeType: 'application/json',
13
+ })),
14
+ };
15
+ },
16
+ }), {
17
+ title: 'Unattributed Changes',
18
+ description: 'Pending cell-level changes not yet attributed to a version for a file',
19
+ mimeType: 'application/json',
20
+ }, async (uri, { fileMsId }) => {
21
+ const changes = await api.getUnattributedChanges(fileMsId);
22
+ return {
23
+ contents: [
24
+ {
25
+ uri: uri.href,
26
+ mimeType: 'application/json',
27
+ text: JSON.stringify(changes, null, 2),
28
+ },
29
+ ],
30
+ };
31
+ });
32
+ }
33
+ //# sourceMappingURL=changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/resources/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,uCAAuC,EAAE;QAC5D,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO;gBACL,SAAS,EAAE,KAAK;qBACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACX,GAAG,EAAE,sBAAsB,CAAC,CAAC,UAAU,UAAU;oBACjD,IAAI,EAAE,2BAA2B,CAAC,CAAC,IAAI,EAAE;oBACzC,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC,CAAC;aACN,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,uEAAuE;QACzE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,QAAkB,CAAC,CAAC;QACrE,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerCommentResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/resources/comments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAkCN"}
@@ -0,0 +1,31 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerCommentResources(server, api) {
3
+ server.registerResource('file-comments', new ResourceTemplate('rockhopper://files/{fileMsId}/comments', {
4
+ list: async () => {
5
+ const files = await api.listEnrolledFiles();
6
+ return {
7
+ resources: files.map((f) => ({
8
+ uri: `rockhopper://files/${f.platformId}/comments`,
9
+ name: `Comments on ${f.name}`,
10
+ mimeType: 'application/json',
11
+ })),
12
+ };
13
+ },
14
+ }), {
15
+ title: 'File Comments',
16
+ description: 'All comments and chat threads on a specific enrolled file',
17
+ mimeType: 'application/json',
18
+ }, async (uri, { fileMsId }) => {
19
+ const comments = await api.getFileComments(fileMsId);
20
+ return {
21
+ contents: [
22
+ {
23
+ uri: uri.href,
24
+ mimeType: 'application/json',
25
+ text: JSON.stringify(comments, null, 2),
26
+ },
27
+ ],
28
+ };
29
+ });
30
+ }
31
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/resources/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,IAAI,gBAAgB,CAAC,wCAAwC,EAAE;QAC7D,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO;gBACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,GAAG,EAAE,sBAAsB,CAAC,CAAC,UAAU,WAAW;oBAClD,IAAI,EAAE,eAAe,CAAC,CAAC,IAAI,EAAE;oBAC7B,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,2DAA2D;QAC7D,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,QAAkB,CAAC,CAAC;QAC/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerFileResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/resources/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAyDN"}
@@ -0,0 +1,48 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerFileResources(server, api) {
3
+ server.registerResource('enrolled-files', 'rockhopper://files', {
4
+ title: 'Enrolled Files',
5
+ description: 'All Excel files enrolled in the current user\'s Rockhopper workspace',
6
+ mimeType: 'application/json',
7
+ }, async (uri) => {
8
+ const files = await api.listEnrolledFiles();
9
+ return {
10
+ contents: [
11
+ {
12
+ uri: uri.href,
13
+ mimeType: 'application/json',
14
+ text: JSON.stringify(files, null, 2),
15
+ },
16
+ ],
17
+ };
18
+ });
19
+ server.registerResource('enrolled-file', new ResourceTemplate('rockhopper://files/{fileMsId}', {
20
+ list: async () => {
21
+ const files = await api.listEnrolledFiles();
22
+ return {
23
+ resources: files.map((f) => ({
24
+ uri: `rockhopper://files/${f.platformId}`,
25
+ name: f.name,
26
+ description: `${f.name} (${f.fileType})`,
27
+ mimeType: 'application/json',
28
+ })),
29
+ };
30
+ },
31
+ }), {
32
+ title: 'Enrolled File Details',
33
+ description: 'Details for a specific enrolled file by its platform ID',
34
+ mimeType: 'application/json',
35
+ }, async (uri, { fileMsId }) => {
36
+ const file = await api.getEnrolledFile(fileMsId);
37
+ return {
38
+ contents: [
39
+ {
40
+ uri: uri.href,
41
+ mimeType: 'application/json',
42
+ text: JSON.stringify(file, null, 2),
43
+ },
44
+ ],
45
+ };
46
+ });
47
+ }
48
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/resources/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,gBAAgB,EAChB,oBAAoB,EACpB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,sEAAsE;QACxE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC5C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;iBACrC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,IAAI,gBAAgB,CAAC,+BAA+B,EAAE;QACpD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO;gBACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,GAAG,EAAE,sBAAsB,CAAC,CAAC,UAAU,EAAE;oBACzC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG;oBACxC,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,QAAkB,CAAC,CAAC;QAC3D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAON"}
@@ -0,0 +1,15 @@
1
+ import { registerFileResources } from './files.js';
2
+ import { registerVersionResources } from './versions.js';
3
+ import { registerCommentResources } from './comments.js';
4
+ import { registerReviewResources } from './reviews.js';
5
+ import { registerTeamResources } from './teams.js';
6
+ import { registerChangeResources } from './changes.js';
7
+ export function registerResources(server, api) {
8
+ registerFileResources(server, api);
9
+ registerVersionResources(server, api);
10
+ registerCommentResources(server, api);
11
+ registerReviewResources(server, api);
12
+ registerTeamResources(server, api);
13
+ registerChangeResources(server, api);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,GAAc;IAEd,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerReviewResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=reviews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviews.d.ts","sourceRoot":"","sources":["../../src/resources/reviews.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAiDN"}
@@ -0,0 +1,40 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerReviewResources(server, api) {
3
+ server.registerResource('version-reviews', new ResourceTemplate('rockhopper://versions/{versionId}/reviews', {
4
+ list: undefined,
5
+ }), {
6
+ title: 'Reviews for Version',
7
+ description: 'All review requests associated with a specific file version',
8
+ mimeType: 'application/json',
9
+ }, async (uri, { versionId }) => {
10
+ const reviews = await api.getReviewsForVersion(Number(versionId));
11
+ return {
12
+ contents: [
13
+ {
14
+ uri: uri.href,
15
+ mimeType: 'application/json',
16
+ text: JSON.stringify(reviews, null, 2),
17
+ },
18
+ ],
19
+ };
20
+ });
21
+ server.registerResource('review-detail', new ResourceTemplate('rockhopper://reviews/{reviewId}', {
22
+ list: undefined,
23
+ }), {
24
+ title: 'Review Details',
25
+ description: 'Details for a specific review request',
26
+ mimeType: 'application/json',
27
+ }, async (uri, { reviewId }) => {
28
+ const review = await api.getReview(Number(reviewId));
29
+ return {
30
+ contents: [
31
+ {
32
+ uri: uri.href,
33
+ mimeType: 'application/json',
34
+ text: JSON.stringify(review, null, 2),
35
+ },
36
+ ],
37
+ };
38
+ });
39
+ }
40
+ //# sourceMappingURL=reviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviews.js","sourceRoot":"","sources":["../../src/resources/reviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,IAAI,gBAAgB,CAAC,2CAA2C,EAAE;QAChE,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,6DAA6D;QAC/D,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,IAAI,gBAAgB,CAAC,iCAAiC,EAAE;QACtD,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerTeamResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAwBN"}
@@ -0,0 +1,22 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerTeamResources(server, api) {
3
+ server.registerResource('team-detail', new ResourceTemplate('rockhopper://teams/{teamId}', {
4
+ list: undefined,
5
+ }), {
6
+ title: 'Team Details',
7
+ description: 'Details for a specific team including members and roles',
8
+ mimeType: 'application/json',
9
+ }, async (uri, { teamId }) => {
10
+ const team = await api.getTeam(Number(teamId));
11
+ return {
12
+ contents: [
13
+ {
14
+ uri: uri.href,
15
+ mimeType: 'application/json',
16
+ text: JSON.stringify(team, null, 2),
17
+ },
18
+ ],
19
+ };
20
+ });
21
+ }
22
+ //# sourceMappingURL=teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,IAAI,gBAAgB,CAAC,6BAA6B,EAAE;QAClD,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerVersionResources(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/resources/versions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAyDN"}
@@ -0,0 +1,49 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerVersionResources(server, api) {
3
+ server.registerResource('file-versions', new ResourceTemplate('rockhopper://files/{fileMsId}/versions', {
4
+ list: async () => {
5
+ const files = await api.listEnrolledFiles();
6
+ return {
7
+ resources: files.map((f) => ({
8
+ uri: `rockhopper://files/${f.platformId}/versions`,
9
+ name: `Versions of ${f.name}`,
10
+ mimeType: 'application/json',
11
+ })),
12
+ };
13
+ },
14
+ }), {
15
+ title: 'File Version History',
16
+ description: 'All version snapshots for a specific enrolled file',
17
+ mimeType: 'application/json',
18
+ }, async (uri, { fileMsId }) => {
19
+ const versions = await api.getFileVersions(fileMsId);
20
+ return {
21
+ contents: [
22
+ {
23
+ uri: uri.href,
24
+ mimeType: 'application/json',
25
+ text: JSON.stringify(versions, null, 2),
26
+ },
27
+ ],
28
+ };
29
+ });
30
+ server.registerResource('file-version', new ResourceTemplate('rockhopper://versions/{versionId}', {
31
+ list: undefined,
32
+ }), {
33
+ title: 'Version Details',
34
+ description: 'Details for a specific file version by internal ID',
35
+ mimeType: 'application/json',
36
+ }, async (uri, { versionId }) => {
37
+ const version = await api.getFileVersion(Number(versionId));
38
+ return {
39
+ contents: [
40
+ {
41
+ uri: uri.href,
42
+ mimeType: 'application/json',
43
+ text: JSON.stringify(version, null, 2),
44
+ },
45
+ ],
46
+ };
47
+ });
48
+ }
49
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/resources/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,IAAI,gBAAgB,CAAC,wCAAwC,EAAE;QAC7D,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO;gBACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,GAAG,EAAE,sBAAsB,CAAC,CAAC,UAAU,WAAW;oBAClD,IAAI,EAAE,eAAe,CAAC,CAAC,IAAI,EAAE;oBAC7B,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,oDAAoD;QACjE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,QAAkB,CAAC,CAAC;QAC/D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,cAAc,EACd,IAAI,gBAAgB,CAAC,mCAAmC,EAAE;QACxD,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oDAAoD;QACjE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from './api-client.js';
3
+ export declare function createServer(apiClient: ApiClient): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAsB5D"}
package/dist/server.js ADDED
@@ -0,0 +1,22 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { registerPrompts } from './prompts/index.js';
3
+ import { registerResources } from './resources/index.js';
4
+ import { registerTools } from './tools/index.js';
5
+ export function createServer(apiClient) {
6
+ const server = new McpServer({
7
+ name: 'rockhopper',
8
+ version: '0.1.0',
9
+ }, {
10
+ instructions: 'Rockhopper MCP server for managing Excel file metadata. ' +
11
+ 'Use list_files first to discover available files, then drill into ' +
12
+ 'versions, comments, reviews, or cell history. Write operations ' +
13
+ '(add_comment, reply_to_comment, resolve_comment, create_review_request, ' +
14
+ 'approve_review, update_file_description) require a read-write scoped token. ' +
15
+ 'File IDs use the platformId field (e.g. from list_files output).',
16
+ });
17
+ registerResources(server, apiClient);
18
+ registerTools(server, apiClient);
19
+ registerPrompts(server, apiClient);
20
+ return server;
21
+ }
22
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EACV,0DAA0D;YAC1D,oEAAoE;YACpE,iEAAiE;YACjE,0EAA0E;YAC1E,8EAA8E;YAC9E,kEAAkE;KACrE,CACF,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerGetCellHistoryTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=get-cell-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cell-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA4DN"}
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ export function registerGetCellHistoryTool(server, api) {
3
+ server.registerTool('get_cell_history', {
4
+ title: 'Get Cell History',
5
+ description: 'Get the change history for a specific cell in an enrolled file. ' +
6
+ 'Shows how the cell value changed across versions.',
7
+ inputSchema: {
8
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
9
+ sheetName: z.string().describe('Name of the worksheet'),
10
+ cellAddress: z
11
+ .string()
12
+ .describe('Cell address (e.g. "A1", "B12", "Sheet1!C3")'),
13
+ },
14
+ annotations: {
15
+ readOnlyHint: true,
16
+ openWorldHint: false,
17
+ },
18
+ }, async ({ fileMsId, sheetName, cellAddress }) => {
19
+ try {
20
+ const history = await api.getCellHistory(fileMsId, sheetName, cellAddress);
21
+ const summary = history
22
+ .map((h) => `- Version ${h.versionId}: **${JSON.stringify(h.value)}**` +
23
+ (h.changedBy ? ` — by ${h.changedBy}` : '') +
24
+ ` — ${h.changedAt}`)
25
+ .join('\n');
26
+ return {
27
+ content: [
28
+ {
29
+ type: 'text',
30
+ text: history.length
31
+ ? `Cell ${cellAddress} on "${sheetName}" — ${history.length} change(s):\n\n${summary}`
32
+ : `No history found for ${cellAddress} on "${sheetName}".`,
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `Failed to get cell history: ${error instanceof Error ? error.message : String(error)}`,
43
+ },
44
+ ],
45
+ isError: true,
46
+ };
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=get-cell-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cell-history.js","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,0BAA0B,CACxC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,kEAAkE;YAClE,mDAAmD;QACrD,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACvD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,8CAA8C,CAAC;SAC5D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CACtC,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,MAAM,OAAO,GAAG,OAAO;iBACpB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;gBAC1D,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC,SAAS,EAAE,CACtB;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,OAAO,CAAC,MAAM;4BAClB,CAAC,CAAC,QAAQ,WAAW,QAAQ,SAAS,OAAO,OAAO,CAAC,MAAM,kBAAkB,OAAO,EAAE;4BACtF,CAAC,CAAC,wBAAwB,WAAW,QAAQ,SAAS,IAAI;qBAC7D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC9F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerGetCommentsTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=get-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-comments.d.ts","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAelD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA4CN"}
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ function formatComment(c, indent = 0) {
3
+ const prefix = ' '.repeat(indent);
4
+ const author = c.authorName || c.authorEmail || 'Unknown';
5
+ const cell = c.cellReference ? ` [${c.cellReference}]` : '';
6
+ const resolved = c.resolved ? ' (resolved)' : '';
7
+ let line = `${prefix}- **${author}**${cell}${resolved}: ${c.message} — ${c.createdAt}`;
8
+ if (c.replies?.length) {
9
+ line += '\n' + c.replies.map((r) => formatComment(r, indent + 1)).join('\n');
10
+ }
11
+ return line;
12
+ }
13
+ export function registerGetCommentsTool(server, api) {
14
+ server.registerTool('get_file_comments', {
15
+ title: 'Get File Comments',
16
+ description: 'Get all comments and discussion threads on an enrolled file. ' +
17
+ 'Includes cell references, resolution status, and threaded replies.',
18
+ inputSchema: {
19
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
20
+ },
21
+ annotations: {
22
+ readOnlyHint: true,
23
+ openWorldHint: false,
24
+ },
25
+ }, async ({ fileMsId }) => {
26
+ try {
27
+ const comments = await api.getFileComments(fileMsId);
28
+ const summary = comments.map((c) => formatComment(c)).join('\n');
29
+ return {
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: comments.length
34
+ ? `${comments.length} comment thread(s):\n\n${summary}`
35
+ : 'No comments on this file.',
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ catch (error) {
41
+ return {
42
+ content: [
43
+ {
44
+ type: 'text',
45
+ text: `Failed to get comments: ${error instanceof Error ? error.message : String(error)}`,
46
+ },
47
+ ],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=get-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-comments.js","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,SAAS,aAAa,CAAC,CAAW,EAAE,MAAM,GAAG,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,IAAI,IAAI,GAAG,GAAG,MAAM,OAAO,MAAM,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IACvF,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACtB,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,+DAA+D;YAC/D,oEAAoE;QACtE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAClE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,CAAC,MAAM;4BACnB,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,0BAA0B,OAAO,EAAE;4BACvD,CAAC,CAAC,2BAA2B;qBAChC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC1F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerGetReviewsTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=get-reviews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-reviews.d.ts","sourceRoot":"","sources":["../../src/tools/get-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA+EN"}
@@ -0,0 +1,71 @@
1
+ import { z } from 'zod';
2
+ export function registerGetReviewsTool(server, api) {
3
+ server.registerTool('get_reviews', {
4
+ title: 'Get Reviews',
5
+ description: 'Get all review requests for a specific file version, or for the latest version of a file. ' +
6
+ 'Provide either a versionId or fileMsId (for latest version reviews).',
7
+ inputSchema: {
8
+ versionId: z
9
+ .number()
10
+ .optional()
11
+ .describe('Internal ID of the file version'),
12
+ fileMsId: z
13
+ .string()
14
+ .optional()
15
+ .describe('Platform ID of the enrolled file (returns reviews for latest version)'),
16
+ },
17
+ annotations: {
18
+ readOnlyHint: true,
19
+ openWorldHint: false,
20
+ },
21
+ }, async ({ versionId, fileMsId }) => {
22
+ try {
23
+ if (!versionId && !fileMsId) {
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: 'Provide either versionId or fileMsId.',
29
+ },
30
+ ],
31
+ isError: true,
32
+ };
33
+ }
34
+ const reviews = versionId
35
+ ? await api.getReviewsForVersion(versionId)
36
+ : await api.getReviewsForLatestVersion(fileMsId);
37
+ const summary = reviews
38
+ .map((r) => {
39
+ const reviewer = r.requester
40
+ ? `${r.requester.firstName} ${r.requester.lastName}`
41
+ : 'Unknown';
42
+ return (`- **${r.subject}** (id: ${r.id}, status: ${r.status})` +
43
+ ` — requested by ${reviewer} on ${r.createdAt}` +
44
+ (r.description ? ` — ${r.description}` : ''));
45
+ })
46
+ .join('\n');
47
+ return {
48
+ content: [
49
+ {
50
+ type: 'text',
51
+ text: reviews.length
52
+ ? `${reviews.length} review(s):\n\n${summary}`
53
+ : 'No reviews found.',
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: `Failed to get reviews: ${error instanceof Error ? error.message : String(error)}`,
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ });
70
+ }
71
+ //# sourceMappingURL=get-reviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-reviews.js","sourceRoot":"","sources":["../../src/tools/get-reviews.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,4FAA4F;YAC5F,sEAAsE;QACxE,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,uEAAuE,CACxE;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,uCAAuC;yBAC9C;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,SAAS;gBACvB,CAAC,CAAC,MAAM,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;gBAC3C,CAAC,CAAC,MAAM,GAAG,CAAC,0BAA0B,CAAC,QAAS,CAAC,CAAC;YAEpD,MAAM,OAAO,GAAG,OAAO;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS;oBAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE;oBACpD,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CACL,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG;oBACvD,mBAAmB,QAAQ,OAAO,CAAC,CAAC,SAAS,EAAE;oBAC/C,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7C,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,OAAO,CAAC,MAAM;4BAClB,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,kBAAkB,OAAO,EAAE;4BAC9C,CAAC,CAAC,mBAAmB;qBACxB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api-client.js';
3
+ export declare function registerGetVersionsTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=get-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-versions.d.ts","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA4DN"}