@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,56 @@
1
+ import { z } from 'zod';
2
+ export function registerGetVersionsTool(server, api) {
3
+ server.registerTool('get_file_versions', {
4
+ title: 'Get File Versions',
5
+ description: 'Get the version history for a specific enrolled file. ' +
6
+ 'Returns all version snapshots with semver numbering, timestamps, and attribution.',
7
+ inputSchema: {
8
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
9
+ },
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ openWorldHint: false,
13
+ },
14
+ }, async ({ fileMsId }) => {
15
+ try {
16
+ const versions = await api.getFileVersions(fileMsId);
17
+ const summary = versions
18
+ .map((v) => {
19
+ const ver = `v${v.majorVersion}.${v.minorVersion}.${v.patchVersion}`;
20
+ const flags = [
21
+ v.wasDiscarded ? 'discarded' : null,
22
+ v.wasReverted ? 'reverted' : null,
23
+ ]
24
+ .filter(Boolean)
25
+ .join(', ');
26
+ return (`- **${ver}** (id: ${v.internalId}) — ${v.createdAt}` +
27
+ (v.description ? ` — ${v.description}` : '') +
28
+ (v.byUserPlatformId ? ` — by ${v.byUserPlatformId}` : '') +
29
+ (flags ? ` [${flags}]` : ''));
30
+ })
31
+ .join('\n');
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: versions.length
37
+ ? `${versions.length} version(s):\n\n${summary}`
38
+ : 'No versions found for this file.',
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: `Failed to get versions: ${error instanceof Error ? error.message : String(error)}`,
49
+ },
50
+ ],
51
+ isError: true,
52
+ };
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=get-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-versions.js","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,wDAAwD;YACxD,mFAAmF;QACrF,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;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;gBACrE,MAAM,KAAK,GAAG;oBACZ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;oBACnC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;iBAClC;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CACL,OAAO,GAAG,WAAW,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,SAAS,EAAE;oBACrD,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,CAAC,MAAM;4BACnB,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,mBAAmB,OAAO,EAAE;4BAChD,CAAC,CAAC,kCAAkC;qBACvC;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 registerTools(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAWlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAarE"}
@@ -0,0 +1,23 @@
1
+ import { registerListFilesTool } from './list-files.js';
2
+ import { registerGetVersionsTool } from './get-versions.js';
3
+ import { registerGetCommentsTool } from './get-comments.js';
4
+ import { registerGetReviewsTool } from './get-reviews.js';
5
+ import { registerGetCellHistoryTool } from './get-cell-history.js';
6
+ import { registerSearchTool } from './search.js';
7
+ import { registerWriteCommentTools } from './write-comments.js';
8
+ import { registerWriteReviewTools } from './write-reviews.js';
9
+ import { registerWriteFileTool } from './write-files.js';
10
+ export function registerTools(server, api) {
11
+ // Read-only tools (available to all scopes)
12
+ registerListFilesTool(server, api);
13
+ registerGetVersionsTool(server, api);
14
+ registerGetCommentsTool(server, api);
15
+ registerGetReviewsTool(server, api);
16
+ registerGetCellHistoryTool(server, api);
17
+ registerSearchTool(server, api);
18
+ // Write tools (require read-write scope on PAT)
19
+ registerWriteCommentTools(server, api);
20
+ registerWriteReviewTools(server, api);
21
+ registerWriteFileTool(server, api);
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,GAAc;IAC7D,4CAA4C;IAC5C,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC,gDAAgD;IAChD,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,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 registerListFilesTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=list-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.d.ts","sourceRoot":"","sources":["../../src/tools/list-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAkDN"}
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod';
2
+ export function registerListFilesTool(server, api) {
3
+ server.registerTool('list_files', {
4
+ title: 'List Enrolled Files',
5
+ description: 'List all Excel files enrolled in the user\'s Rockhopper workspace. ' +
6
+ 'Optionally filter by search term matching file names.',
7
+ inputSchema: {
8
+ search: z.string().optional().describe('Search term to filter file names'),
9
+ },
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ openWorldHint: false,
13
+ },
14
+ }, async ({ search }) => {
15
+ try {
16
+ const files = await api.listEnrolledFiles({ search });
17
+ const summary = files
18
+ .map((f) => `- **${f.name}** (id: ${f.platformId}, type: ${f.fileType})` +
19
+ (f.hasUncommittedChanges ? ' [uncommitted changes]' : ''))
20
+ .join('\n');
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: files.length
26
+ ? `Found ${files.length} file(s):\n\n${summary}`
27
+ : 'No enrolled files found.',
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: `Failed to list files: ${error instanceof Error ? error.message : String(error)}`,
38
+ },
39
+ ],
40
+ isError: true,
41
+ };
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=list-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/tools/list-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,qEAAqE;YACrE,uDAAuD;QACzD,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC3E;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK;iBAClB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,QAAQ,GAAG;gBAC5D,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,MAAM;4BAChB,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,gBAAgB,OAAO,EAAE;4BAChD,CAAC,CAAC,0BAA0B;qBAC/B;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACxF;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 registerSearchTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA6GN"}
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+ export function registerSearchTool(server, api) {
3
+ server.registerTool('search_files', {
4
+ title: 'Search Files',
5
+ description: 'Search enrolled files by name. Returns matching files with their ' +
6
+ 'metadata including uncommitted change status.',
7
+ inputSchema: {
8
+ query: z.string().describe('Search query to match against file names'),
9
+ },
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ openWorldHint: false,
13
+ },
14
+ }, async ({ query }) => {
15
+ try {
16
+ const files = await api.listEnrolledFiles({ search: query });
17
+ const summary = files
18
+ .map((f) => `- **${f.name}** (id: ${f.platformId}, type: ${f.fileType})` +
19
+ (f.hasUncommittedChanges ? ' [uncommitted changes]' : ''))
20
+ .join('\n');
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: files.length
26
+ ? `Found ${files.length} file(s) matching "${query}":\n\n${summary}`
27
+ : `No files match "${query}".`,
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: `Search failed: ${error instanceof Error ? error.message : String(error)}`,
38
+ },
39
+ ],
40
+ isError: true,
41
+ };
42
+ }
43
+ });
44
+ server.registerTool('get_unattributed_changes', {
45
+ title: 'Get Unattributed Changes',
46
+ description: 'Get pending cell-level changes that have not been attributed to a ' +
47
+ 'committed version yet. Optionally filter by sheet name.',
48
+ inputSchema: {
49
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
50
+ sheetName: z
51
+ .string()
52
+ .optional()
53
+ .describe('Filter to a specific worksheet'),
54
+ },
55
+ annotations: {
56
+ readOnlyHint: true,
57
+ openWorldHint: false,
58
+ },
59
+ }, async ({ fileMsId, sheetName }) => {
60
+ try {
61
+ const changes = await api.getUnattributedChanges(fileMsId, {
62
+ sheetName,
63
+ });
64
+ const summary = changes
65
+ .map((c) => `- **${c.sheetName}!${c.cellAddress}** (${c.changeType}): ` +
66
+ `${JSON.stringify(c.oldValue)} → ${JSON.stringify(c.newValue)}` +
67
+ (c.byUserPlatformId ? ` — by ${c.byUserPlatformId}` : '') +
68
+ ` — ${c.createdAt}`)
69
+ .join('\n');
70
+ return {
71
+ content: [
72
+ {
73
+ type: 'text',
74
+ text: changes.length
75
+ ? `${changes.length} unattributed change(s):\n\n${summary}`
76
+ : 'No unattributed changes found.',
77
+ },
78
+ ],
79
+ };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ content: [
84
+ {
85
+ type: 'text',
86
+ text: `Failed to get changes: ${error instanceof Error ? error.message : String(error)}`,
87
+ },
88
+ ],
89
+ isError: true,
90
+ };
91
+ }
92
+ });
93
+ }
94
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,mEAAmE;YACnE,+CAA+C;QACjD,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACvE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,KAAK;iBAClB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,QAAQ,GAAG;gBAC5D,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,CAAC,MAAM;4BAChB,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,sBAAsB,KAAK,SAAS,OAAO,EAAE;4BACpE,CAAC,CAAC,mBAAmB,KAAK,IAAI;qBACjC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,oEAAoE;YACpE,yDAAyD;QAC3D,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjE,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gCAAgC,CAAC;SAC9C;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,QAAQ,EAAE;gBACzD,SAAS;aACV,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,OAAO;iBACpB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,OAAO,CAAC,CAAC,UAAU,KAAK;gBAC3D,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE;gBAC/D,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,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,GAAG,OAAO,CAAC,MAAM,+BAA+B,OAAO,EAAE;4BAC3D,CAAC,CAAC,gCAAgC;qBACrC;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 registerWriteCommentTools(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=write-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-comments.d.ts","sourceRoot":"","sources":["../../src/tools/write-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAiKN"}
@@ -0,0 +1,142 @@
1
+ import { z } from 'zod';
2
+ export function registerWriteCommentTools(server, api) {
3
+ server.registerTool('add_comment', {
4
+ title: 'Add Comment',
5
+ description: 'Add a new comment to an enrolled file. Every comment is scoped to a ' +
6
+ 'specific file version — typically the latest (live) version unless ' +
7
+ 'the user explicitly wants to comment on a historical version.',
8
+ inputSchema: {
9
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
10
+ message: z.string().min(1).max(5000).describe('Comment text'),
11
+ versionInternalId: z
12
+ .number()
13
+ .int()
14
+ .positive()
15
+ .describe('Required. Internal ID of the file version to attach the comment to. ' +
16
+ 'Fetch via list_file_versions to find the correct id for the latest or target version.'),
17
+ cellReference: z
18
+ .string()
19
+ .optional()
20
+ .describe('Cell reference (e.g. "Sheet1!A1")'),
21
+ },
22
+ annotations: {
23
+ readOnlyHint: false,
24
+ destructiveHint: false,
25
+ idempotentHint: false,
26
+ },
27
+ }, async ({ fileMsId, message, cellReference, versionInternalId }) => {
28
+ try {
29
+ const comment = await api.createComment({
30
+ fileMsId,
31
+ message,
32
+ cellReference,
33
+ versionInternalId,
34
+ });
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: `Comment created (id: ${comment.internalId}):\n` +
40
+ `"${comment.message}"` +
41
+ (comment.cellReference
42
+ ? ` at ${comment.cellReference}`
43
+ : ''),
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Failed to add comment: ${error instanceof Error ? error.message : String(error)}`,
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ });
60
+ server.registerTool('reply_to_comment', {
61
+ title: 'Reply to Comment',
62
+ description: 'Reply to an existing comment thread. Replies are scoped to a file version ' +
63
+ '— pass the same versionInternalId as the parent thread or the current live version.',
64
+ inputSchema: {
65
+ chatId: z.number().describe('Internal ID of the parent comment'),
66
+ message: z.string().min(1).max(5000).describe('Reply text'),
67
+ versionInternalId: z
68
+ .number()
69
+ .int()
70
+ .positive()
71
+ .describe('Required. Internal ID of the file version the reply is scoped to. ' +
72
+ 'Typically the live version or the same version as the parent comment.'),
73
+ },
74
+ annotations: {
75
+ readOnlyHint: false,
76
+ destructiveHint: false,
77
+ idempotentHint: false,
78
+ },
79
+ }, async ({ chatId, message, versionInternalId }) => {
80
+ try {
81
+ const reply = await api.replyToComment(chatId, {
82
+ message,
83
+ versionInternalId,
84
+ });
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: `Reply created (id: ${reply.internalId}): "${reply.message}"`,
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ catch (error) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: `Failed to reply: ${error instanceof Error ? error.message : String(error)}`,
100
+ },
101
+ ],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ server.registerTool('resolve_comment', {
107
+ title: 'Resolve Comment',
108
+ description: 'Mark a comment as resolved. Only the comment author can resolve it.',
109
+ inputSchema: {
110
+ chatId: z.number().describe('Internal ID of the comment to resolve'),
111
+ },
112
+ annotations: {
113
+ readOnlyHint: false,
114
+ destructiveHint: false,
115
+ idempotentHint: true,
116
+ },
117
+ }, async ({ chatId }) => {
118
+ try {
119
+ const comment = await api.resolveComment(chatId);
120
+ return {
121
+ content: [
122
+ {
123
+ type: 'text',
124
+ text: `Comment ${comment.internalId} marked as resolved.`,
125
+ },
126
+ ],
127
+ };
128
+ }
129
+ catch (error) {
130
+ return {
131
+ content: [
132
+ {
133
+ type: 'text',
134
+ text: `Failed to resolve: ${error instanceof Error ? error.message : String(error)}`,
135
+ },
136
+ ],
137
+ isError: true,
138
+ };
139
+ }
140
+ });
141
+ }
142
+ //# sourceMappingURL=write-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-comments.js","sourceRoot":"","sources":["../../src/tools/write-comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,yBAAyB,CACvC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,sEAAsE;YACtE,qEAAqE;YACrE,+DAA+D;QACjE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC7D,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE;gBACpE,uFAAuF,CAC1F;YACH,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;SACjD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;gBACtC,QAAQ;gBACR,OAAO;gBACP,aAAa;gBACb,iBAAiB;aAClB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,wBAAwB,OAAO,CAAC,UAAU,MAAM;4BAChD,IAAI,OAAO,CAAC,OAAO,GAAG;4BACtB,CAAC,OAAO,CAAC,aAAa;gCACpB,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,EAAE;gCAChC,CAAC,CAAC,EAAE,CAAC;qBACV;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;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,4EAA4E;YAC5E,qFAAqF;QACvF,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC3D,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CACP,oEAAoE;gBAClE,uEAAuE,CAC1E;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;gBAC7C,OAAO;gBACP,iBAAiB;aAClB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sBAAsB,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,OAAO,GAAG;qBACpE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oBAAoB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACnF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,qEAAqE;QACvE,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SACrE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAEjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,WAAW,OAAO,CAAC,UAAU,sBAAsB;qBAC1D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACrF;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 registerWriteFileTool(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=write-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-files.d.ts","sourceRoot":"","sources":["../../src/tools/write-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA0CN"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export function registerWriteFileTool(server, api) {
3
+ server.registerTool('update_file_description', {
4
+ title: 'Update File Metadata',
5
+ description: 'Update the display name of an enrolled file.',
6
+ inputSchema: {
7
+ fileMsId: z.string().describe('Platform ID of the enrolled file'),
8
+ name: z.string().min(1).max(255).describe('New display name for the file'),
9
+ },
10
+ annotations: {
11
+ readOnlyHint: false,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ },
15
+ }, async ({ fileMsId, name }) => {
16
+ try {
17
+ const file = await api.updateEnrolledFile(fileMsId, { name });
18
+ return {
19
+ content: [
20
+ {
21
+ type: 'text',
22
+ text: `File renamed to "${file.name}" (id: ${file.platformId}).`,
23
+ },
24
+ ],
25
+ };
26
+ }
27
+ catch (error) {
28
+ return {
29
+ content: [
30
+ {
31
+ type: 'text',
32
+ text: `Failed to update file: ${error instanceof Error ? error.message : String(error)}`,
33
+ },
34
+ ],
35
+ isError: true,
36
+ };
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=write-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-files.js","sourceRoot":"","sources":["../../src/tools/write-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,8CAA8C;QAChD,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC3E;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oBAAoB,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,UAAU,IAAI;qBACjE;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 registerWriteReviewTools(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=write-reviews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-reviews.d.ts","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAqHN"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ export function registerWriteReviewTools(server, api) {
3
+ server.registerTool('create_review_request', {
4
+ title: 'Create Review Request',
5
+ description: 'Request a review for a specific file version. Assigns reviewers who ' +
6
+ 'will be notified to approve or comment on the version. ' +
7
+ 'Reviewer IDs are numeric internal user IDs — use list_team_members or ' +
8
+ 'the team resource to resolve platform IDs (msId / googleId) to internal IDs first.',
9
+ inputSchema: {
10
+ versionId: z
11
+ .number()
12
+ .describe('Internal ID of the file version to review'),
13
+ subject: z
14
+ .string()
15
+ .min(1)
16
+ .max(500)
17
+ .describe('Subject/title of the review request'),
18
+ description: z
19
+ .string()
20
+ .max(5000)
21
+ .optional()
22
+ .describe('Optional description of what to review'),
23
+ reviewerIds: z
24
+ .array(z.number().int().positive())
25
+ .min(1)
26
+ .describe('Internal user IDs of reviewers to assign'),
27
+ },
28
+ annotations: {
29
+ readOnlyHint: false,
30
+ destructiveHint: false,
31
+ idempotentHint: false,
32
+ },
33
+ }, async ({ versionId, subject, description, reviewerIds }) => {
34
+ try {
35
+ const review = await api.createReviewRequest({
36
+ versionId,
37
+ subject,
38
+ description,
39
+ reviewerIds,
40
+ });
41
+ return {
42
+ content: [
43
+ {
44
+ type: 'text',
45
+ text: `Review request created (id: ${review.id}):\n` +
46
+ `Subject: "${review.subject}"\n` +
47
+ `Status: ${review.status}\n` +
48
+ `Assigned to ${reviewerIds.length} reviewer(s)`,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+ catch (error) {
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: `Failed to create review: ${error instanceof Error ? error.message : String(error)}`,
59
+ },
60
+ ],
61
+ isError: true,
62
+ };
63
+ }
64
+ });
65
+ server.registerTool('approve_review', {
66
+ title: 'Approve Review',
67
+ description: 'Approve a review request. Only assigned reviewers can approve.',
68
+ inputSchema: {
69
+ reviewId: z.number().describe('ID of the review request to approve'),
70
+ notes: z
71
+ .string()
72
+ .max(5000)
73
+ .optional()
74
+ .describe('Optional approval notes'),
75
+ },
76
+ annotations: {
77
+ readOnlyHint: false,
78
+ destructiveHint: false,
79
+ idempotentHint: true,
80
+ },
81
+ }, async ({ reviewId, notes }) => {
82
+ try {
83
+ const review = await api.approveReview(reviewId, { notes });
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: `Review ${review.id} approved.` +
89
+ (notes ? ` Notes: "${notes}"` : ''),
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ catch (error) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: `Failed to approve: ${error instanceof Error ? error.message : String(error)}`,
100
+ },
101
+ ],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ }
107
+ //# sourceMappingURL=write-reviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-reviews.js","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"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"}