@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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/api-client.d.ts +54 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +120 -0
- package/dist/api-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +156 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/changes.d.ts +4 -0
- package/dist/resources/changes.d.ts.map +1 -0
- package/dist/resources/changes.js +33 -0
- package/dist/resources/changes.js.map +1 -0
- package/dist/resources/comments.d.ts +4 -0
- package/dist/resources/comments.d.ts.map +1 -0
- package/dist/resources/comments.js +31 -0
- package/dist/resources/comments.js.map +1 -0
- package/dist/resources/files.d.ts +4 -0
- package/dist/resources/files.d.ts.map +1 -0
- package/dist/resources/files.js +48 -0
- package/dist/resources/files.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +15 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/reviews.d.ts +4 -0
- package/dist/resources/reviews.d.ts.map +1 -0
- package/dist/resources/reviews.js +40 -0
- package/dist/resources/reviews.js.map +1 -0
- package/dist/resources/teams.d.ts +4 -0
- package/dist/resources/teams.d.ts.map +1 -0
- package/dist/resources/teams.js +22 -0
- package/dist/resources/teams.js.map +1 -0
- package/dist/resources/versions.d.ts +4 -0
- package/dist/resources/versions.d.ts.map +1 -0
- package/dist/resources/versions.js +49 -0
- package/dist/resources/versions.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-cell-history.d.ts +4 -0
- package/dist/tools/get-cell-history.d.ts.map +1 -0
- package/dist/tools/get-cell-history.js +50 -0
- package/dist/tools/get-cell-history.js.map +1 -0
- package/dist/tools/get-comments.d.ts +4 -0
- package/dist/tools/get-comments.d.ts.map +1 -0
- package/dist/tools/get-comments.js +53 -0
- package/dist/tools/get-comments.js.map +1 -0
- package/dist/tools/get-reviews.d.ts +4 -0
- package/dist/tools/get-reviews.d.ts.map +1 -0
- package/dist/tools/get-reviews.js +71 -0
- package/dist/tools/get-reviews.js.map +1 -0
- package/dist/tools/get-versions.d.ts +4 -0
- package/dist/tools/get-versions.d.ts.map +1 -0
- package/dist/tools/get-versions.js +56 -0
- package/dist/tools/get-versions.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +23 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-files.d.ts +4 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +45 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/write-comments.d.ts +4 -0
- package/dist/tools/write-comments.d.ts.map +1 -0
- package/dist/tools/write-comments.js +142 -0
- package/dist/tools/write-comments.js.map +1 -0
- package/dist/tools/write-files.d.ts +4 -0
- package/dist/tools/write-files.d.ts.map +1 -0
- package/dist/tools/write-files.js +40 -0
- package/dist/tools/write-files.js.map +1 -0
- package/dist/tools/write-reviews.d.ts +4 -0
- package/dist/tools/write-reviews.d.ts.map +1 -0
- package/dist/tools/write-reviews.js +107 -0
- package/dist/tools/write-reviews.js.map +1 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|