@mcp-z/mcp-drive 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +7 -0
  5. package/dist/cjs/constants.d.ts +7 -0
  6. package/dist/cjs/constants.js +18 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/index.d.cts +8 -0
  9. package/dist/cjs/index.d.ts +8 -0
  10. package/dist/cjs/index.js +314 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/lib/create-store.d.cts +2 -0
  13. package/dist/cjs/lib/create-store.d.ts +2 -0
  14. package/dist/cjs/lib/create-store.js +166 -0
  15. package/dist/cjs/lib/create-store.js.map +1 -0
  16. package/dist/cjs/lib/query-builder.d.cts +45 -0
  17. package/dist/cjs/lib/query-builder.d.ts +45 -0
  18. package/dist/cjs/lib/query-builder.js +219 -0
  19. package/dist/cjs/lib/query-builder.js.map +1 -0
  20. package/dist/cjs/mcp/index.d.cts +3 -0
  21. package/dist/cjs/mcp/index.d.ts +3 -0
  22. package/dist/cjs/mcp/index.js +66 -0
  23. package/dist/cjs/mcp/index.js.map +1 -0
  24. package/dist/cjs/mcp/prompts/index.d.cts +2 -0
  25. package/dist/cjs/mcp/prompts/index.d.ts +2 -0
  26. package/dist/cjs/mcp/prompts/index.js +26 -0
  27. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  28. package/dist/cjs/mcp/prompts/organize-files.d.cts +16 -0
  29. package/dist/cjs/mcp/prompts/organize-files.d.ts +16 -0
  30. package/dist/cjs/mcp/prompts/organize-files.js +169 -0
  31. package/dist/cjs/mcp/prompts/organize-files.js.map +1 -0
  32. package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
  33. package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
  34. package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
  35. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
  36. package/dist/cjs/mcp/resources/file.d.cts +9 -0
  37. package/dist/cjs/mcp/resources/file.d.ts +9 -0
  38. package/dist/cjs/mcp/resources/file.js +247 -0
  39. package/dist/cjs/mcp/resources/file.js.map +1 -0
  40. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  41. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  42. package/dist/cjs/mcp/resources/index.js +17 -0
  43. package/dist/cjs/mcp/resources/index.js.map +1 -0
  44. package/dist/cjs/mcp/tools/file-move-to-trash.d.cts +59 -0
  45. package/dist/cjs/mcp/tools/file-move-to-trash.d.ts +59 -0
  46. package/dist/cjs/mcp/tools/file-move-to-trash.js +334 -0
  47. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -0
  48. package/dist/cjs/mcp/tools/file-move.d.cts +73 -0
  49. package/dist/cjs/mcp/tools/file-move.d.ts +73 -0
  50. package/dist/cjs/mcp/tools/file-move.js +613 -0
  51. package/dist/cjs/mcp/tools/file-move.js.map +1 -0
  52. package/dist/cjs/mcp/tools/files-search.d.cts +135 -0
  53. package/dist/cjs/mcp/tools/files-search.d.ts +135 -0
  54. package/dist/cjs/mcp/tools/files-search.js +558 -0
  55. package/dist/cjs/mcp/tools/files-search.js.map +1 -0
  56. package/dist/cjs/mcp/tools/folder-contents.d.cts +139 -0
  57. package/dist/cjs/mcp/tools/folder-contents.d.ts +139 -0
  58. package/dist/cjs/mcp/tools/folder-contents.js +513 -0
  59. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -0
  60. package/dist/cjs/mcp/tools/folder-create.d.cts +59 -0
  61. package/dist/cjs/mcp/tools/folder-create.d.ts +59 -0
  62. package/dist/cjs/mcp/tools/folder-create.js +368 -0
  63. package/dist/cjs/mcp/tools/folder-create.js.map +1 -0
  64. package/dist/cjs/mcp/tools/folder-path.d.cts +49 -0
  65. package/dist/cjs/mcp/tools/folder-path.d.ts +49 -0
  66. package/dist/cjs/mcp/tools/folder-path.js +367 -0
  67. package/dist/cjs/mcp/tools/folder-path.js.map +1 -0
  68. package/dist/cjs/mcp/tools/folder-search.d.cts +139 -0
  69. package/dist/cjs/mcp/tools/folder-search.d.ts +139 -0
  70. package/dist/cjs/mcp/tools/folder-search.js +760 -0
  71. package/dist/cjs/mcp/tools/folder-search.js.map +1 -0
  72. package/dist/cjs/mcp/tools/index.d.cts +7 -0
  73. package/dist/cjs/mcp/tools/index.d.ts +7 -0
  74. package/dist/cjs/mcp/tools/index.js +46 -0
  75. package/dist/cjs/mcp/tools/index.js.map +1 -0
  76. package/dist/cjs/package.json +1 -0
  77. package/dist/cjs/schemas/drive-query-schema.d.cts +40 -0
  78. package/dist/cjs/schemas/drive-query-schema.d.ts +40 -0
  79. package/dist/cjs/schemas/drive-query-schema.js +90 -0
  80. package/dist/cjs/schemas/drive-query-schema.js.map +1 -0
  81. package/dist/cjs/schemas/drive-validation.d.cts +48 -0
  82. package/dist/cjs/schemas/drive-validation.d.ts +48 -0
  83. package/dist/cjs/schemas/drive-validation.js +96 -0
  84. package/dist/cjs/schemas/drive-validation.js.map +1 -0
  85. package/dist/cjs/schemas/index.d.cts +2 -0
  86. package/dist/cjs/schemas/index.d.ts +2 -0
  87. package/dist/cjs/schemas/index.js +20 -0
  88. package/dist/cjs/schemas/index.js.map +1 -0
  89. package/dist/cjs/setup/config.d.cts +44 -0
  90. package/dist/cjs/setup/config.d.ts +44 -0
  91. package/dist/cjs/setup/config.js +201 -0
  92. package/dist/cjs/setup/config.js.map +1 -0
  93. package/dist/cjs/setup/http.d.cts +8 -0
  94. package/dist/cjs/setup/http.d.ts +8 -0
  95. package/dist/cjs/setup/http.js +260 -0
  96. package/dist/cjs/setup/http.js.map +1 -0
  97. package/dist/cjs/setup/index.d.cts +5 -0
  98. package/dist/cjs/setup/index.d.ts +5 -0
  99. package/dist/cjs/setup/index.js +46 -0
  100. package/dist/cjs/setup/index.js.map +1 -0
  101. package/dist/cjs/setup/oauth-google.d.cts +64 -0
  102. package/dist/cjs/setup/oauth-google.d.ts +64 -0
  103. package/dist/cjs/setup/oauth-google.js +347 -0
  104. package/dist/cjs/setup/oauth-google.js.map +1 -0
  105. package/dist/cjs/setup/runtime.d.cts +10 -0
  106. package/dist/cjs/setup/runtime.d.ts +10 -0
  107. package/dist/cjs/setup/runtime.js +353 -0
  108. package/dist/cjs/setup/runtime.js.map +1 -0
  109. package/dist/cjs/setup/stdio.d.cts +7 -0
  110. package/dist/cjs/setup/stdio.d.ts +7 -0
  111. package/dist/cjs/setup/stdio.js +239 -0
  112. package/dist/cjs/setup/stdio.js.map +1 -0
  113. package/dist/cjs/types.d.cts +45 -0
  114. package/dist/cjs/types.d.ts +45 -0
  115. package/dist/cjs/types.js +5 -0
  116. package/dist/cjs/types.js.map +1 -0
  117. package/dist/esm/constants.d.ts +7 -0
  118. package/dist/esm/constants.js +7 -0
  119. package/dist/esm/constants.js.map +1 -0
  120. package/dist/esm/index.d.ts +8 -0
  121. package/dist/esm/index.js +34 -0
  122. package/dist/esm/index.js.map +1 -0
  123. package/dist/esm/lib/create-store.d.ts +2 -0
  124. package/dist/esm/lib/create-store.js +6 -0
  125. package/dist/esm/lib/create-store.js.map +1 -0
  126. package/dist/esm/lib/query-builder.d.ts +45 -0
  127. package/dist/esm/lib/query-builder.js +184 -0
  128. package/dist/esm/lib/query-builder.js.map +1 -0
  129. package/dist/esm/mcp/index.d.ts +3 -0
  130. package/dist/esm/mcp/index.js +6 -0
  131. package/dist/esm/mcp/index.js.map +1 -0
  132. package/dist/esm/mcp/prompts/index.d.ts +2 -0
  133. package/dist/esm/mcp/prompts/index.js +2 -0
  134. package/dist/esm/mcp/prompts/index.js.map +1 -0
  135. package/dist/esm/mcp/prompts/organize-files.d.ts +16 -0
  136. package/dist/esm/mcp/prompts/organize-files.js +21 -0
  137. package/dist/esm/mcp/prompts/organize-files.js.map +1 -0
  138. package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
  139. package/dist/esm/mcp/prompts/query-syntax.js +82 -0
  140. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
  141. package/dist/esm/mcp/resources/file.d.ts +9 -0
  142. package/dist/esm/mcp/resources/file.js +77 -0
  143. package/dist/esm/mcp/resources/file.js.map +1 -0
  144. package/dist/esm/mcp/resources/index.d.ts +1 -0
  145. package/dist/esm/mcp/resources/index.js +1 -0
  146. package/dist/esm/mcp/resources/index.js.map +1 -0
  147. package/dist/esm/mcp/tools/file-move-to-trash.d.ts +59 -0
  148. package/dist/esm/mcp/tools/file-move-to-trash.js +118 -0
  149. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -0
  150. package/dist/esm/mcp/tools/file-move.d.ts +73 -0
  151. package/dist/esm/mcp/tools/file-move.js +274 -0
  152. package/dist/esm/mcp/tools/file-move.js.map +1 -0
  153. package/dist/esm/mcp/tools/files-search.d.ts +135 -0
  154. package/dist/esm/mcp/tools/files-search.js +254 -0
  155. package/dist/esm/mcp/tools/files-search.js.map +1 -0
  156. package/dist/esm/mcp/tools/folder-contents.d.ts +139 -0
  157. package/dist/esm/mcp/tools/folder-contents.js +214 -0
  158. package/dist/esm/mcp/tools/folder-contents.js.map +1 -0
  159. package/dist/esm/mcp/tools/folder-create.d.ts +59 -0
  160. package/dist/esm/mcp/tools/folder-create.js +140 -0
  161. package/dist/esm/mcp/tools/folder-create.js.map +1 -0
  162. package/dist/esm/mcp/tools/folder-path.d.ts +49 -0
  163. package/dist/esm/mcp/tools/folder-path.js +147 -0
  164. package/dist/esm/mcp/tools/folder-path.js.map +1 -0
  165. package/dist/esm/mcp/tools/folder-search.d.ts +139 -0
  166. package/dist/esm/mcp/tools/folder-search.js +343 -0
  167. package/dist/esm/mcp/tools/folder-search.js.map +1 -0
  168. package/dist/esm/mcp/tools/index.d.ts +7 -0
  169. package/dist/esm/mcp/tools/index.js +7 -0
  170. package/dist/esm/mcp/tools/index.js.map +1 -0
  171. package/dist/esm/package.json +1 -0
  172. package/dist/esm/schemas/drive-query-schema.d.ts +40 -0
  173. package/dist/esm/schemas/drive-query-schema.js +84 -0
  174. package/dist/esm/schemas/drive-query-schema.js.map +1 -0
  175. package/dist/esm/schemas/drive-validation.d.ts +48 -0
  176. package/dist/esm/schemas/drive-validation.js +73 -0
  177. package/dist/esm/schemas/drive-validation.js.map +1 -0
  178. package/dist/esm/schemas/index.d.ts +2 -0
  179. package/dist/esm/schemas/index.js +2 -0
  180. package/dist/esm/schemas/index.js.map +1 -0
  181. package/dist/esm/setup/config.d.ts +44 -0
  182. package/dist/esm/setup/config.js +151 -0
  183. package/dist/esm/setup/config.js.map +1 -0
  184. package/dist/esm/setup/http.d.ts +8 -0
  185. package/dist/esm/setup/http.js +54 -0
  186. package/dist/esm/setup/http.js.map +1 -0
  187. package/dist/esm/setup/index.d.ts +5 -0
  188. package/dist/esm/setup/index.js +5 -0
  189. package/dist/esm/setup/index.js.map +1 -0
  190. package/dist/esm/setup/oauth-google.d.ts +64 -0
  191. package/dist/esm/setup/oauth-google.js +168 -0
  192. package/dist/esm/setup/oauth-google.js.map +1 -0
  193. package/dist/esm/setup/runtime.d.ts +10 -0
  194. package/dist/esm/setup/runtime.js +84 -0
  195. package/dist/esm/setup/runtime.js.map +1 -0
  196. package/dist/esm/setup/stdio.d.ts +7 -0
  197. package/dist/esm/setup/stdio.js +38 -0
  198. package/dist/esm/setup/stdio.js.map +1 -0
  199. package/dist/esm/types.d.ts +45 -0
  200. package/dist/esm/types.js +1 -0
  201. package/dist/esm/types.js.map +1 -0
  202. package/package.json +108 -0
@@ -0,0 +1,45 @@
1
+ import type { CachedToken, DcrConfig, OAuthConfig } from '@mcp-z/oauth-google';
2
+ import type { BaseServerConfig, MiddlewareLayer, PromptModule, ResourceModule, Logger as ServerLogger, ToolModule } from '@mcp-z/server';
3
+ import type { Keyv } from 'keyv';
4
+ import type { OAuthAdapters } from './setup/oauth-google.js';
5
+ export type Logger = Pick<Console, 'info' | 'error' | 'warn' | 'debug'>;
6
+ /**
7
+ * Composes transport config, OAuth config, and application-level config
8
+ */
9
+ export interface ServerConfig extends BaseServerConfig, OAuthConfig {
10
+ logLevel: string;
11
+ baseDir: string;
12
+ name: string;
13
+ version: string;
14
+ repositoryUrl: string;
15
+ baseUrl?: string;
16
+ dcrConfig?: DcrConfig;
17
+ }
18
+ /** Runtime dependencies exposed to middleware/factories. */
19
+ export interface RuntimeDeps {
20
+ config: ServerConfig;
21
+ logger: ServerLogger;
22
+ tokenStore: Keyv<CachedToken>;
23
+ oauthAdapters: OAuthAdapters;
24
+ baseUrl?: string;
25
+ }
26
+ /** Collections of MCP modules produced by domain factories. */
27
+ export type DomainModules = {
28
+ tools: ToolModule[];
29
+ resources: ResourceModule[];
30
+ prompts: PromptModule[];
31
+ };
32
+ /** Factory that produces a middleware layer given runtime dependencies. */
33
+ export type MiddlewareFactory = (deps: RuntimeDeps) => MiddlewareLayer;
34
+ /** Shared runtime configuration returned by `createDefaultRuntime`. */
35
+ export interface CommonRuntime {
36
+ deps: RuntimeDeps;
37
+ middlewareFactories: MiddlewareFactory[];
38
+ createDomainModules: () => DomainModules;
39
+ close: () => Promise<void>;
40
+ }
41
+ export interface RuntimeOverrides {
42
+ middlewareFactories?: MiddlewareFactory[];
43
+ createDomainModules?: () => DomainModules;
44
+ }
45
+ export type { DriveFile, DriveQuery, DriveQueryObject, FieldOperator } from './schemas/index.js';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Drive MCP Server Constants
3
+ *
4
+ * These scopes are required for Google Drive functionality and are hardcoded
5
+ * rather than externally configured since this server knows its own requirements.
6
+ */
7
+ export declare const GOOGLE_SCOPE = "openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Drive MCP Server Constants
3
+ *
4
+ * These scopes are required for Google Drive functionality and are hardcoded
5
+ * rather than externally configured since this server knows its own requirements.
6
+ */ // Google OAuth scopes required for Drive operations
7
+ export const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/constants.ts"],"sourcesContent":["/**\n * Drive MCP Server Constants\n *\n * These scopes are required for Google Drive functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\n// Google OAuth scopes required for Drive operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive';\n"],"names":["GOOGLE_SCOPE"],"mappings":"AAAA;;;;;CAKC,GAED,oDAAoD;AACpD,OAAO,MAAMA,eAAe,+IAA+I"}
@@ -0,0 +1,8 @@
1
+ import type { ServerConfig } from './types.js';
2
+ export { GOOGLE_SCOPE } from './constants.js';
3
+ export * as mcp from './mcp/index.js';
4
+ export * as schemas from './schemas/index.js';
5
+ export * as setup from './setup/index.js';
6
+ export * from './types.js';
7
+ export declare function startServer(config: ServerConfig): Promise<void>;
8
+ export default function main(): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import { createConfig, handleVersionHelp } from './setup/config.js';
2
+ import { createHTTPServer } from './setup/http.js';
3
+ import { createStdioServer } from './setup/stdio.js';
4
+ export { GOOGLE_SCOPE } from './constants.js';
5
+ import * as _mcp from './mcp/index.js';
6
+ export { _mcp as mcp };
7
+ import * as _schemas from './schemas/index.js';
8
+ export { _schemas as schemas };
9
+ import * as _setup from './setup/index.js';
10
+ export { _setup as setup };
11
+ export * from './types.js';
12
+ export async function startServer(config) {
13
+ const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);
14
+ process.on('SIGINT', async ()=>{
15
+ await close();
16
+ process.exit(0);
17
+ });
18
+ logger.info(`Server started with ${config.transport.type} transport`);
19
+ await new Promise(()=>{});
20
+ }
21
+ export default async function main() {
22
+ // Check for help/version flags FIRST, before config parsing
23
+ const versionHelpResult = handleVersionHelp(process.argv);
24
+ if (versionHelpResult.handled) {
25
+ console.log(versionHelpResult.output);
26
+ process.exit(0);
27
+ }
28
+ // Only parse config if no help/version flags
29
+ const config = createConfig();
30
+ await startServer(config);
31
+ }
32
+ if (process.argv[1] === new URL(import.meta.url).pathname) {
33
+ main();
34
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.js';\nimport { createHTTPServer } from './setup/http.js';\nimport { createStdioServer } from './setup/stdio.js';\nimport type { ServerConfig } from './types.js';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.js';\nexport * as schemas from './schemas/index.js';\nexport * as setup from './setup/index.js';\nexport * from './types.js';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["createConfig","handleVersionHelp","createHTTPServer","createStdioServer","GOOGLE_SCOPE","mcp","schemas","setup","startServer","config","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","URL","url","pathname"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,oBAAoB;AACpE,SAASC,gBAAgB,QAAQ,kBAAkB;AACnD,SAASC,iBAAiB,QAAQ,mBAAmB;AAGrD,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AACtC,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAC1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGF,OAAOG,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMV,kBAAkBM,UAAU,MAAMP,iBAAiBO;IAEvHK,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAER,OAAOG,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBnB,kBAAkBa,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,6CAA6C;IAC7C,MAAMP,SAAST;IACf,MAAMQ,YAAYC;AACpB;AAEA,IAAIK,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIK,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDT;AACF"}
@@ -0,0 +1,2 @@
1
+ import type Keyv from 'keyv';
2
+ export default function createStore<T>(uri: string): Promise<Keyv<T>>;
@@ -0,0 +1,6 @@
1
+ import keyvRegistry from 'keyv-registry';
2
+ export default async function createStore(uri) {
3
+ const store = await keyvRegistry(uri);
4
+ if (!store) throw new Error(`Failed to create store for URI: ${uri}`);
5
+ return store;
6
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["keyvRegistry","createStore","uri","store","Error"],"mappings":"AACA,OAAOA,kBAAkB,gBAAgB;AAEzC,eAAe,eAAeC,YAAeC,GAAW;IACtD,MAAMC,QAAQ,MAAMH,aAAgBE;IACpC,IAAI,CAACC,OAAO,MAAM,IAAIC,MAAM,CAAC,gCAAgC,EAAEF,KAAK;IACpE,OAAOC;AACT"}
@@ -0,0 +1,45 @@
1
+ import type { DriveQuery } from '../schemas/drive-query-schema.js';
2
+ /**
3
+ * Field operator interface for query filters
4
+ */
5
+ export interface FieldOperator {
6
+ $any?: string[];
7
+ $all?: string[];
8
+ $none?: string[];
9
+ }
10
+ /**
11
+ * Filters object returned by toDriveQuery for debugging/logging
12
+ */
13
+ interface FiltersObject {
14
+ nameIncludes?: string[];
15
+ mimeTypeIncludes?: string[];
16
+ fullTextIncludes?: string[];
17
+ parentIdIncludes?: string[];
18
+ ownerIncludes?: string[];
19
+ starred?: boolean;
20
+ sharedWithMe?: boolean;
21
+ trashed?: boolean;
22
+ }
23
+ /**
24
+ * Convert structured DriveQuery to Google Drive query string
25
+ *
26
+ * Accepts either:
27
+ * - A raw Drive query string (returned as-is)
28
+ * - A structured DriveQueryObject (converted to Drive query syntax)
29
+ *
30
+ * Drive query syntax reference:
31
+ * - name contains 'text' - Search by filename
32
+ * - mimeType = 'type' - Filter by MIME type
33
+ * - fullText contains 'text' - Search content and metadata
34
+ * - 'parent_id' in parents - Search in folder
35
+ * - starred = true/false - Filter by starred status
36
+ * - sharedWithMe = true - Filter by shared status
37
+ * - modifiedTime >= 'date' - Date filtering
38
+ * - 'email' in owners - Filter by owner
39
+ * - trashed = false - Exclude trashed files (always added)
40
+ */
41
+ export declare function toDriveQuery(query: DriveQuery): {
42
+ q: string;
43
+ filters: FiltersObject;
44
+ };
45
+ export {};
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Convert structured DriveQuery to Google Drive query string
3
+ *
4
+ * Accepts either:
5
+ * - A raw Drive query string (returned as-is)
6
+ * - A structured DriveQueryObject (converted to Drive query syntax)
7
+ *
8
+ * Drive query syntax reference:
9
+ * - name contains 'text' - Search by filename
10
+ * - mimeType = 'type' - Filter by MIME type
11
+ * - fullText contains 'text' - Search content and metadata
12
+ * - 'parent_id' in parents - Search in folder
13
+ * - starred = true/false - Filter by starred status
14
+ * - sharedWithMe = true - Filter by shared status
15
+ * - modifiedTime >= 'date' - Date filtering
16
+ * - 'email' in owners - Filter by owner
17
+ * - trashed = false - Exclude trashed files (always added)
18
+ */ export function toDriveQuery(query) {
19
+ // Handle string queries - return as raw query with empty filters
20
+ if (typeof query === 'string') {
21
+ return {
22
+ q: query,
23
+ filters: {}
24
+ };
25
+ }
26
+ const nameIncludes = [];
27
+ const mimeTypeIncludes = [];
28
+ const fullTextIncludes = [];
29
+ const parentIdIncludes = [];
30
+ const ownerIncludes = [];
31
+ let starredFlag;
32
+ let sharedWithMeFlag;
33
+ let trashedFlag;
34
+ function p(s) {
35
+ return `(${String(s !== null && s !== void 0 ? s : '')})`;
36
+ }
37
+ function quote(s) {
38
+ const str = String(s !== null && s !== void 0 ? s : '');
39
+ // Escape single quotes for Drive query syntax
40
+ return `'${str.replace(/'/g, "\\'")}'`;
41
+ }
42
+ function fv(field, raw) {
43
+ const rawVal = String(raw !== null && raw !== void 0 ? raw : '');
44
+ const v = quote(rawVal);
45
+ if (field === 'name') {
46
+ nameIncludes.push(rawVal);
47
+ return `name contains ${v}`;
48
+ }
49
+ if (field === 'mimeType') {
50
+ mimeTypeIncludes.push(rawVal);
51
+ return `mimeType = ${v}`;
52
+ }
53
+ if (field === 'fullText') {
54
+ fullTextIncludes.push(rawVal);
55
+ return `fullText contains ${v}`;
56
+ }
57
+ if (field === 'parentId') {
58
+ parentIdIncludes.push(rawVal);
59
+ return `${v} in parents`;
60
+ }
61
+ if (field === 'owner') {
62
+ ownerIncludes.push(rawVal);
63
+ return `${v} in owners`;
64
+ }
65
+ return '';
66
+ }
67
+ function chain(op, arr) {
68
+ const filtered = arr.filter((s)=>s && s.trim() !== '');
69
+ if (filtered.length === 0) return '';
70
+ if (filtered.length === 1) {
71
+ const first = filtered[0];
72
+ return first !== null && first !== void 0 ? first : '';
73
+ }
74
+ return p(filtered.join(` ${op} `));
75
+ }
76
+ function fieldExpr(field, op) {
77
+ if (op.$any) {
78
+ const nonEmpty = op.$any.filter((v)=>String(v !== null && v !== void 0 ? v : '').trim() !== '');
79
+ const results = nonEmpty.map((v)=>fv(field, String(v !== null && v !== void 0 ? v : ''))).filter((result)=>result.trim() !== '');
80
+ return results.length > 0 ? chain('or', results) : '';
81
+ }
82
+ if (op.$all) {
83
+ const nonEmpty = op.$all.filter((v)=>String(v !== null && v !== void 0 ? v : '').trim() !== '');
84
+ const results = nonEmpty.map((v)=>fv(field, String(v !== null && v !== void 0 ? v : ''))).filter((result)=>result.trim() !== '');
85
+ return results.length > 0 ? chain('and', results) : '';
86
+ }
87
+ if (op.$none) {
88
+ const nonEmpty = op.$none.filter((v)=>String(v !== null && v !== void 0 ? v : '').trim() !== '');
89
+ const results = nonEmpty.map((v)=>fv(field, String(v !== null && v !== void 0 ? v : ''))).filter((result)=>result.trim() !== '');
90
+ return results.length > 0 ? `not ${p(chain('or', results))}` : '';
91
+ }
92
+ throw new Error(`Unknown field operator ${JSON.stringify(op)}`);
93
+ }
94
+ function dateExpr(d) {
95
+ var _parts_;
96
+ const parts = [];
97
+ if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);
98
+ if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);
99
+ return parts.length > 1 ? p(parts.join(' and ')) : (_parts_ = parts[0]) !== null && _parts_ !== void 0 ? _parts_ : '';
100
+ }
101
+ function fieldKeys() {
102
+ return [
103
+ 'name',
104
+ 'mimeType',
105
+ 'fullText',
106
+ 'parentId',
107
+ 'owner'
108
+ ];
109
+ }
110
+ function emit(n) {
111
+ if (n.$and) return p(n.$and.map(emit).join(' and '));
112
+ if (n.$or) return p(n.$or.map(emit).join(' or '));
113
+ if (n.$not) return `not ${emit(n.$not)}`;
114
+ const expressions = [];
115
+ if (typeof n.starred === 'boolean') {
116
+ starredFlag = n.starred;
117
+ expressions.push(`starred = ${n.starred}`);
118
+ }
119
+ if (typeof n.sharedWithMe === 'boolean') {
120
+ sharedWithMeFlag = n.sharedWithMe;
121
+ expressions.push(`sharedWithMe = ${n.sharedWithMe}`);
122
+ }
123
+ if (typeof n.trashed === 'boolean') {
124
+ trashedFlag = n.trashed;
125
+ expressions.push(`trashed = ${n.trashed}`);
126
+ }
127
+ if (n.modifiedTime) {
128
+ expressions.push(dateExpr(n.modifiedTime));
129
+ }
130
+ for (const k of fieldKeys()){
131
+ if (typeof n === 'object' && n !== null && k in n) {
132
+ const op = n[k];
133
+ const normalizedOp = typeof op === 'string' ? {
134
+ $any: [
135
+ op
136
+ ]
137
+ } : op !== null && op !== void 0 ? op : {};
138
+ const result = fieldExpr(k, normalizedOp);
139
+ if (result.trim() !== '') {
140
+ expressions.push(result);
141
+ }
142
+ }
143
+ }
144
+ // Handle empty objects
145
+ if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {
146
+ return '';
147
+ }
148
+ // Combine multiple expressions with AND
149
+ if (expressions.length > 1) {
150
+ return chain('and', expressions);
151
+ }
152
+ if (expressions.length === 1) {
153
+ var _expressions_;
154
+ return (_expressions_ = expressions[0]) !== null && _expressions_ !== void 0 ? _expressions_ : '';
155
+ }
156
+ throw new Error(`Unknown node: ${JSON.stringify(n)}`);
157
+ }
158
+ function emitTop(n) {
159
+ if (!n) return '';
160
+ // Handle empty objects
161
+ if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';
162
+ if (n.$and) return n.$and.map(emit).join(' and ');
163
+ if (n.$or) return n.$or.map(emit).join(' or ');
164
+ if (n.$not) return `not ${emit(n.$not)}`;
165
+ const result = emit(n);
166
+ return result.trim() === '' ? '' : result;
167
+ }
168
+ const q = emitTop(query);
169
+ const cleanedQuery = q.replace(/\s+and\s+$|\s+or\s+$|^\s+and\s+|^\s+or\s+/gi, '').trim();
170
+ const filters = {};
171
+ if (nameIncludes.length) filters.nameIncludes = nameIncludes;
172
+ if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;
173
+ if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;
174
+ if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;
175
+ if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;
176
+ // Use tracked flags from emit() to capture nested boolean conditions
177
+ if (typeof starredFlag === 'boolean') filters.starred = starredFlag;
178
+ if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;
179
+ if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;
180
+ return {
181
+ q: cleanedQuery !== null && cleanedQuery !== void 0 ? cleanedQuery : '',
182
+ filters
183
+ };
184
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/lib/query-builder.ts"],"sourcesContent":["import type { DriveQuery, DriveQueryObject } from '../schemas/drive-query-schema.js';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Filters object returned by toDriveQuery for debugging/logging\n */\ninterface FiltersObject {\n nameIncludes?: string[];\n mimeTypeIncludes?: string[];\n fullTextIncludes?: string[];\n parentIdIncludes?: string[];\n ownerIncludes?: string[];\n starred?: boolean;\n sharedWithMe?: boolean;\n trashed?: boolean;\n}\n\n/**\n * Convert structured DriveQuery to Google Drive query string\n *\n * Accepts either:\n * - A raw Drive query string (returned as-is)\n * - A structured DriveQueryObject (converted to Drive query syntax)\n *\n * Drive query syntax reference:\n * - name contains 'text' - Search by filename\n * - mimeType = 'type' - Filter by MIME type\n * - fullText contains 'text' - Search content and metadata\n * - 'parent_id' in parents - Search in folder\n * - starred = true/false - Filter by starred status\n * - sharedWithMe = true - Filter by shared status\n * - modifiedTime >= 'date' - Date filtering\n * - 'email' in owners - Filter by owner\n * - trashed = false - Exclude trashed files (always added)\n */\nexport function toDriveQuery(query: DriveQuery): {\n q: string;\n filters: FiltersObject;\n} {\n // Handle string queries - return as raw query with empty filters\n if (typeof query === 'string') {\n return { q: query, filters: {} };\n }\n const nameIncludes: string[] = [];\n const mimeTypeIncludes: string[] = [];\n const fullTextIncludes: string[] = [];\n const parentIdIncludes: string[] = [];\n const ownerIncludes: string[] = [];\n\n let starredFlag: boolean | undefined;\n let sharedWithMeFlag: boolean | undefined;\n let trashedFlag: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n // Escape single quotes for Drive query syntax\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n const v = quote(rawVal);\n\n if (field === 'name') {\n nameIncludes.push(rawVal);\n return `name contains ${v}`;\n }\n if (field === 'mimeType') {\n mimeTypeIncludes.push(rawVal);\n return `mimeType = ${v}`;\n }\n if (field === 'fullText') {\n fullTextIncludes.push(rawVal);\n return `fullText contains ${v}`;\n }\n if (field === 'parentId') {\n parentIdIncludes.push(rawVal);\n return `${v} in parents`;\n }\n if (field === 'owner') {\n ownerIncludes.push(rawVal);\n return `${v} in owners`;\n }\n\n return '';\n }\n\n function chain(op: 'and' | 'or', arr: string[]) {\n const filtered = arr.filter((s) => s && s.trim() !== '');\n if (filtered.length === 0) return '';\n if (filtered.length === 1) {\n const first = filtered[0];\n return first ?? '';\n }\n return p(filtered.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const nonEmpty = op.$any.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('or', results) : '';\n }\n if (op.$all) {\n const nonEmpty = op.$all.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('and', results) : '';\n }\n if (op.$none) {\n const nonEmpty = op.$none.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? `not ${p(chain('or', results))}` : '';\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: { $gte?: string; $lt?: string }) {\n const parts: string[] = [];\n if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);\n if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['name', 'mimeType', 'fullText', 'parentId', 'owner'];\n }\n\n function emit(n: DriveQueryObject): string {\n if (n.$and) return p(n.$and.map(emit).join(' and '));\n if (n.$or) return p(n.$or.map(emit).join(' or '));\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const expressions: string[] = [];\n\n if (typeof n.starred === 'boolean') {\n starredFlag = n.starred;\n expressions.push(`starred = ${n.starred}`);\n }\n if (typeof n.sharedWithMe === 'boolean') {\n sharedWithMeFlag = n.sharedWithMe;\n expressions.push(`sharedWithMe = ${n.sharedWithMe}`);\n }\n if (typeof n.trashed === 'boolean') {\n trashedFlag = n.trashed;\n expressions.push(`trashed = ${n.trashed}`);\n }\n if (n.modifiedTime) {\n expressions.push(dateExpr(n.modifiedTime));\n }\n\n for (const k of fieldKeys()) {\n if (typeof n === 'object' && n !== null && k in n) {\n const op = (n as Record<string, string | FieldOperator>)[k];\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n const result = fieldExpr(k, normalizedOp);\n if (result.trim() !== '') {\n expressions.push(result);\n }\n }\n }\n\n // Handle empty objects\n if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {\n return '';\n }\n\n // Combine multiple expressions with AND\n if (expressions.length > 1) {\n return chain('and', expressions);\n }\n if (expressions.length === 1) {\n return expressions[0] ?? '';\n }\n\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: DriveQueryObject): string {\n if (!n) return '';\n\n // Handle empty objects\n if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';\n\n if (n.$and) return n.$and.map(emit).join(' and ');\n if (n.$or) return n.$or.map(emit).join(' or ');\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const result = emit(n);\n return result.trim() === '' ? '' : result;\n }\n\n const q = emitTop(query);\n const cleanedQuery = q.replace(/\\s+and\\s+$|\\s+or\\s+$|^\\s+and\\s+|^\\s+or\\s+/gi, '').trim();\n\n const filters: FiltersObject = {};\n if (nameIncludes.length) filters.nameIncludes = nameIncludes;\n if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;\n if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;\n if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;\n if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;\n // Use tracked flags from emit() to capture nested boolean conditions\n if (typeof starredFlag === 'boolean') filters.starred = starredFlag;\n if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;\n if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;\n\n return { q: cleanedQuery ?? '', filters };\n}\n"],"names":["toDriveQuery","query","q","filters","nameIncludes","mimeTypeIncludes","fullTextIncludes","parentIdIncludes","ownerIncludes","starredFlag","sharedWithMeFlag","trashedFlag","p","s","String","quote","str","replace","fv","field","raw","rawVal","v","push","chain","op","arr","filtered","filter","trim","length","first","join","fieldExpr","$any","nonEmpty","results","map","result","$all","$none","Error","JSON","stringify","dateExpr","d","parts","$gte","$lt","fieldKeys","emit","n","$and","$or","$not","expressions","starred","sharedWithMe","trashed","modifiedTime","k","normalizedOp","Object","keys","emitTop","cleanedQuery"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * as promptFactories from './prompts/index.js';
2
+ export * as resourceFactories from './resources/index.js';
3
+ export * as toolFactories from './tools/index.js';
@@ -0,0 +1,6 @@
1
+ import * as _promptFactories from './prompts/index.js';
2
+ export { _promptFactories as promptFactories };
3
+ import * as _resourceFactories from './resources/index.js';
4
+ export { _resourceFactories as resourceFactories };
5
+ import * as _toolFactories from './tools/index.js';
6
+ export { _toolFactories as toolFactories };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":"AAAA,kCAAiC,qBAAqB;AAAtD,SAAO,oBAAKA,eAAe,GAA2B;AACtD,oCAAmC,uBAAuB;AAA1D,SAAO,sBAAKC,iBAAiB,GAA6B;AAC1D,gCAA+B,mBAAmB;AAAlD,SAAO,kBAAKC,aAAa,GAAyB"}
@@ -0,0 +1,2 @@
1
+ export { default as organizeFiles } from './organize-files.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1,2 @@
1
+ export { default as organizeFiles } from './organize-files.js';
2
+ export { default as querySyntax } from './query-syntax.js';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as organizeFiles } from './organize-files.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["default","organizeFiles","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,aAAa,QAAQ,sBAAsB;AAC/D,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
@@ -0,0 +1,16 @@
1
+ export default function createPrompt(): {
2
+ name: string;
3
+ config: {
4
+ description: string;
5
+ argsSchema: {};
6
+ };
7
+ handler: () => Promise<{
8
+ messages: {
9
+ role: string;
10
+ content: {
11
+ type: string;
12
+ text: string;
13
+ };
14
+ }[];
15
+ }>;
16
+ };
@@ -0,0 +1,21 @@
1
+ export default function createPrompt() {
2
+ const config = {
3
+ description: 'Help organize and manage files in Google Drive',
4
+ argsSchema: {}
5
+ };
6
+ return {
7
+ name: 'organize-files',
8
+ config,
9
+ handler: async ()=>({
10
+ messages: [
11
+ {
12
+ role: 'user',
13
+ content: {
14
+ type: 'text',
15
+ text: 'You are an expert file organizer assistant. Help me organize my Google Drive files.'
16
+ }
17
+ }
18
+ ]
19
+ })
20
+ };
21
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/mcp/prompts/organize-files.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\n\nexport default function createPrompt() {\n const config = {\n description: 'Help organize and manage files in Google Drive',\n argsSchema: {} as const,\n };\n\n return {\n name: 'organize-files',\n config,\n handler: async () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: 'You are an expert file organizer assistant. Help me organize my Google Drive files.',\n },\n },\n ],\n }),\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","argsSchema","name","handler","messages","role","content","type","text"],"mappings":"AAEA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;QACbC,YAAY,CAAC;IACf;IAEA,OAAO;QACLC,MAAM;QACNH;QACAI,SAAS,UAAa,CAAA;gBACpBC,UAAU;oBACR;wBACEC,MAAM;wBACNC,SAAS;4BACPC,MAAM;4BACNC,MAAM;wBACR;oBACF;iBACD;YACH,CAAA;IACF;AACF"}
@@ -0,0 +1,19 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ export default function createPrompt(): {
4
+ name: string;
5
+ config: {
6
+ description: string;
7
+ };
8
+ handler: (_args: {
9
+ [x: string]: unknown;
10
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
11
+ messages: {
12
+ role: "user";
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ };
17
+ }[];
18
+ }>;
19
+ };
@@ -0,0 +1,82 @@
1
+ export default function createPrompt() {
2
+ const config = {
3
+ description: 'Reference guide for Google Drive query syntax'
4
+ };
5
+ const handler = async (_args, _extra)=>{
6
+ return {
7
+ messages: [
8
+ {
9
+ role: 'user',
10
+ content: {
11
+ type: 'text',
12
+ text: `# Google Drive Query Syntax Reference
13
+
14
+ ## Logical Operators
15
+ - \`$and\`: Array of conditions that ALL must match
16
+ - \`$or\`: Array of conditions where ANY must match
17
+ - \`$not\`: Condition that must NOT match
18
+
19
+ ## File/Folder Fields
20
+ - \`name\`: Search by name (partial match, case-insensitive)
21
+ - \`mimeType\`: Filter by MIME type
22
+ - \`fullText\`: Search file content and metadata
23
+ - \`parentId\`: Search within folder (use "root" for My Drive)
24
+ - \`owner\`: Filter by owner email
25
+
26
+ ## Boolean Flags
27
+ - \`starred\`: true/false
28
+ - \`sharedWithMe\`: true/false
29
+ - \`trashed\`: true/false (tools auto-filter trashed by default)
30
+
31
+ ## Date Range
32
+ \`\`\`json
33
+ { "modifiedTime": { "$gte": "2024-01-01", "$lt": "2024-12-31" } }
34
+ \`\`\`
35
+
36
+ ## Common MIME Types
37
+ - \`application/vnd.google-apps.folder\`: Folders
38
+ - \`application/vnd.google-apps.document\`: Google Docs
39
+ - \`application/vnd.google-apps.spreadsheet\`: Google Sheets
40
+ - \`application/vnd.google-apps.presentation\`: Google Slides
41
+ - \`application/pdf\`: PDF files
42
+ - \`image/jpeg\`, \`image/png\`: Images
43
+
44
+ ## Field Operators (for multi-value fields)
45
+ - \`$any\`: OR - matches if ANY value matches
46
+ - \`$all\`: AND - matches if ALL values match
47
+ - \`$none\`: NOT - matches if NONE match
48
+
49
+ ## Escape Hatch
50
+ - \`rawDriveQuery\`: Raw Google Drive query syntax
51
+
52
+ ## Example Queries
53
+ \`\`\`json
54
+ // PDFs modified this year
55
+ { "mimeType": "application/pdf", "modifiedTime": { "$gte": "2024-01-01" } }
56
+
57
+ // Starred spreadsheets
58
+ { "mimeType": "application/vnd.google-apps.spreadsheet", "starred": true }
59
+
60
+ // Files in specific folder
61
+ { "parentId": "1abc123xyz" }
62
+
63
+ // Search by name
64
+ { "name": "budget" }
65
+
66
+ // Complex: shared PDFs or Docs
67
+ { "$or": [
68
+ { "mimeType": "application/pdf", "sharedWithMe": true },
69
+ { "mimeType": "application/vnd.google-apps.document", "sharedWithMe": true }
70
+ ]}
71
+ \`\`\``
72
+ }
73
+ }
74
+ ]
75
+ };
76
+ };
77
+ return {
78
+ name: 'query-syntax',
79
+ config,
80
+ handler
81
+ };
82
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Drive query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Drive Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## File/Folder Fields\n- \\`name\\`: Search by name (partial match, case-insensitive)\n- \\`mimeType\\`: Filter by MIME type\n- \\`fullText\\`: Search file content and metadata\n- \\`parentId\\`: Search within folder (use \"root\" for My Drive)\n- \\`owner\\`: Filter by owner email\n\n## Boolean Flags\n- \\`starred\\`: true/false\n- \\`sharedWithMe\\`: true/false\n- \\`trashed\\`: true/false (tools auto-filter trashed by default)\n\n## Date Range\n\\`\\`\\`json\n{ \"modifiedTime\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Common MIME Types\n- \\`application/vnd.google-apps.folder\\`: Folders\n- \\`application/vnd.google-apps.document\\`: Google Docs\n- \\`application/vnd.google-apps.spreadsheet\\`: Google Sheets\n- \\`application/vnd.google-apps.presentation\\`: Google Slides\n- \\`application/pdf\\`: PDF files\n- \\`image/jpeg\\`, \\`image/png\\`: Images\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Escape Hatch\n- \\`rawDriveQuery\\`: Raw Google Drive query syntax\n\n## Example Queries\n\\`\\`\\`json\n// PDFs modified this year\n{ \"mimeType\": \"application/pdf\", \"modifiedTime\": { \"$gte\": \"2024-01-01\" } }\n\n// Starred spreadsheets\n{ \"mimeType\": \"application/vnd.google-apps.spreadsheet\", \"starred\": true }\n\n// Files in specific folder\n{ \"parentId\": \"1abc123xyz\" }\n\n// Search by name\n{ \"name\": \"budget\" }\n\n// Complex: shared PDFs or Docs\n{ \"$or\": [\n { \"mimeType\": \"application/pdf\", \"sharedWithMe\": true },\n { \"mimeType\": \"application/vnd.google-apps.document\", \"sharedWithMe\": true }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAIA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2Db,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
@@ -0,0 +1,9 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
3
+ import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ export default function createResource(): {
5
+ name: string;
6
+ template: ResourceTemplate;
7
+ config: import("@modelcontextprotocol/sdk/server/mcp.js").ResourceMetadata;
8
+ handler: (uri: URL, variables: Record<string, string | string[]>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ReadResourceResult>;
9
+ };