{"_id":"@a-bonus/google-docs-mcp","_rev":"16-21a05c13c6510d66875b5b6787ded9c0","name":"@a-bonus/google-docs-mcp","dist-tags":{"latest":"1.11.3"},"versions":{"1.0.0":{"name":"@a-bonus/google-docs-mcp","version":"1.0.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.0.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"99eb3d6eb4e4c4ed512f5333017af1fb908c479b","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.0.0.tgz","fileCount":81,"integrity":"sha512-veRY40gibeNl0bCXpINPZrVfuS7wTbT+2XlNKp4i+AQ0p/m6xEmXnLL+fAky9ALGhGK2OtiUIs+aoxvrc1kcDw==","signatures":[{"sig":"MEUCIQD3514mrIcd1N/94kx/65hMo3LkYh7+MIdLfQsukwvUWwIgSSApKPgmifIlySZdtH3aiaEh0k/C1GmzHuVxz3HMbO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":442398},"type":"module","gitHead":"def96db6616d909c2c30e139959096e7f6114665","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.2","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.0.0_1771946709159_0.3076826486872748","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@a-bonus/google-docs-mcp","version":"1.0.1","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.0.1","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"16e936ece9267077a4f3783fd18e7dd2bfcf4c5c","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.0.1.tgz","fileCount":67,"integrity":"sha512-AAOjfnNZlDLsiMYXQqmCiQBmwxje5rS4BBuua1iYRMPD1X7spDZHXi/C493p7aBNTxVgMArS3P3ji0bi0sIOHQ==","signatures":[{"sig":"MEUCIQCXKZJLgEVRm9raD7DNQIM7ZJi0ytmFjvmSRPHjWia6mAIgCkv8KrbPhjl+IVt637uNrZVNfjSKiYejwsEYtP6V+aI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300664},"type":"module","gitHead":"e8b53fcba4dcbbe7c8881ff2b4f235642914f4fa","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.0.1_1771947714437_0.133147498335912","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@a-bonus/google-docs-mcp","version":"1.0.2","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.0.2","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"38653fb5d650f953becd85971f72c68d436bf949","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.0.2.tgz","fileCount":69,"integrity":"sha512-Wr8IbLJ60smC8jenQbsvNzyrCx75pKNN0xZOPiAtnF8aKUj1uxdjH5oxL2XaZSUrYdVWm04Vp9wb45J+gn4h2Q==","signatures":[{"sig":"MEUCIA+NxMtIrKiPPK3m+llucMPlxj1SwMBA0ofvTczYkoizAiEA4ho2SACpHek8u46uJgFh4bAmxO5DboCd3W+oYlNmQq4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313131},"type":"module","gitHead":"4eb5bc6d47802e7a8e4a38f31e76faaa56a005eb","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.0.2_1772029778046_0.5672234427968894","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@a-bonus/google-docs-mcp","version":"1.1.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.1.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"ab432b850fc22acbb420b41d259d197be862530e","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.1.0.tgz","fileCount":75,"integrity":"sha512-yBcM2tAlXNQP8cNm4hhUw8YHFNSMRv5upo8JFAduQlX7Db73pMEosm8fUNtfrAWpqFnNOJf4pT0Ywln3nCPpFA==","signatures":[{"sig":"MEYCIQDDxhA6udI5ryugjVOLCcBFd7gdXRThoMXvC6QqHj9QvQIhANJpZV9621A/0CEpdWpYBXm7PG18PYlCStk0HeiapoXQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":341728},"type":"module","gitHead":"ea9b895876085a8c8df104822487add7ed49054d","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.1.0_1773016365533_0.20469923588454475","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@a-bonus/google-docs-mcp","version":"1.2.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.2.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"64581ab209254b8cedb9177735ff9de9867d97f5","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.2.0.tgz","fileCount":78,"integrity":"sha512-WaAlWD4Tv+47XDIpt4RIb3cV0RmEMWlyUuQawTsMlofeJ0pcCFDdCz8ZN2OK0QZC81jwpaT1AUp4m+G5c+14wA==","signatures":[{"sig":"MEUCIQD7t/EmAvkTUdtuX/IUC0XL6YAFkHBaqM86C7rfrUwCmAIgCks03tgkkXftnlGBNpH5difbcW63ZmpHMVZCZw+IEo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359886},"type":"module","gitHead":"b722383b22815c430a259e1932fec51991953df8","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.2.0_1773603200101_0.9327920720466281","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@a-bonus/google-docs-mcp","version":"1.3.1","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.3.1","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"2cd0e7fdc143c659a196348f6802911e8637a54a","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.3.1.tgz","fileCount":83,"integrity":"sha512-j5FbX9KpMu1gEqiIE3jVC+mbtbShAKnen0x6ErNmIZCX05prs9UxpYW9EEJIdBubH4ggl1iyK993HNkVXY/sHg==","signatures":[{"sig":"MEYCIQDrMCccg/TuXadL601ddc9yGW8ohLkH4KJveqp3t3yuZAIhALeveg3nozvTJsTt1qcbLtg54m9+OcvTXU2WRhHVl9xN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":381681},"type":"module","gitHead":"13f1c7d4ed044332d0bc08d02c8a4450f7cb5c8e","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.3.1_1774029990382_0.4832285581641027","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@a-bonus/google-docs-mcp","version":"1.4.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.4.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"1b48e2facc54624ac27c57e1b7ac7998d5da6f03","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.4.0.tgz","fileCount":86,"integrity":"sha512-V4KFZjdYeiw/nMuGGKjQVvNNZisXAOrniJnc1DKCve6wZ3RDkTZF/79XqhgU79H9mJDoj4PcCfcXzq4LOB77Qw==","signatures":[{"sig":"MEUCIQCZ13OdJNvwJxz0pLEA/57cSh0ewCBG5CvtK406d9UQnAIgatZjc5fSEojsoWaT+rvStNzclMJA4qPcTm/cAUlA+dM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":398212},"type":"module","gitHead":"564d2497663424e4b081fc2215dcfe54aeb09323","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.2","fastmcp":"^3.24.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.4.0_1774285932264_0.48512764294711563","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@a-bonus/google-docs-mcp","version":"1.5.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.5.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"a336fc83d1f6af694aca5e9a0f751a0211a8b354","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.5.0.tgz","fileCount":92,"integrity":"sha512-yj54+wIWOK6abUCvJu55hn/gcpfcOO3td9KuF8v9zXk83ppLX2QZIs6LtmdSyI6XAxCacOTm9+5oPdD8i5WmVw==","signatures":[{"sig":"MEYCIQCIEesvicQ+19VbnPS6zxgHcditrMk2ClPXwkFQEJ7QsQIhAO1k4L9UgQOEqV2C6h644G/pNVPZARQf6jPofR3q0e3a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":431372},"type":"module","gitHead":"069d67681d6b9e8a10e69df1672a6def373bbc07","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.5.0_1774631330589_0.22199714912710378","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@a-bonus/google-docs-mcp","version":"1.6.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.6.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"3b9ab21ccd7534cb31b89e5113472cacfae07a6f","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.6.0.tgz","fileCount":94,"integrity":"sha512-pCkzmSHlEoT4XvodOWBYnKziENMC8pOiAWIwgjFUxqV9KSwXrYWIfl1588kmRebJh4X3dFlirR/JMjnP+Mom+w==","signatures":[{"sig":"MEQCIB46P8SLzl5JESNUg3TC6F26GpGzxMhR4ycEVA+wSt7iAiAls1VmkPOKoluTXo7CnfFn4jjTymv1oBJuSCggkEdsnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":446205},"type":"module","gitHead":"7ec45c4fcbdf7648a69561d882a36ad2a9b68dc1","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.4","description":"MCP server for Google Docs, Sheets, and Drive","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.6.0_1774708091477_0.2271234997516669","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@a-bonus/google-docs-mcp","version":"1.7.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.7.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"f6a6e62dd867d61699b764f6c79f80c1e62a4e6f","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.7.0.tgz","fileCount":110,"integrity":"sha512-NaK62rYHirGpQbQwerHQtsnT4n0ZWy77+knRT4a+Od3KyQI3gmC//Kj0WR5L2lfzQmHNZ4MBXa3Yy7bWAM4K5g==","signatures":[{"sig":"MEUCIGKjZSDOuTPxoR+25LoIKMiMTuuYAWTkdN7BfebkybQ8AiEAjFy3lCOSdSken6rgJEJC1qOnGNqDsaJ6qBLGfUTzmAc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":503276},"type":"module","gitHead":"5eecb4c3aea33a594f00269f51cc52b52454565a","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.7","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.7.0_1775840859467_0.3683826157288326","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@a-bonus/google-docs-mcp","version":"1.8.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.8.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"5a6210792cae9d43c6acbaa52b04b924d83a3748","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.8.0.tgz","fileCount":126,"integrity":"sha512-MqnvrOIvNz4N9D+91r/sD0/r/B8vQ6+PUg4r2mffdvUsJsxCDRSD5HsFnOBdmm81FIHvOzCzfwE3KLW12ZBF8g==","signatures":[{"sig":"MEUCID3xm6xXN4jgOq68WtR+jNHUHjxNc18uCRC59+Plt5t/AiEAjDwXjDJGTJhlfdW+Dqvb86MWHBgiXYuNZPrI7xMpNjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":567964},"type":"module","gitHead":"01f6b2bb26757aa00e2bafe12555dfd98467f704","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.7","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.8.0_1776802140161_0.8248778588194499","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@a-bonus/google-docs-mcp","version":"1.9.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.9.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"e6ed2d924d5b22df93ec04a43a61b0962d6dfac0","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.9.0.tgz","fileCount":132,"integrity":"sha512-vGVkMFSlSRPxl7MyEhCwpGnpd7paOXZUoFlHVd/pYZHoW+rxUvXV26+RR9L8GBjOb75wBenF9z7wboQbcD9spA==","signatures":[{"sig":"MEUCID5fpnt6LiUqsWgjrOPOdCWqdX0/M43OkLLC8+r6JC+VAiEAv6tbGoT7fOcRuEz0TuHYD6QaUBpy3JgFzoQK3cqRpIc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":588530},"type":"module","gitHead":"6f740cc1eb569eae3b1fa8060512a637c827dcd0","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.7","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.9.0_1777237343702_0.6838792622843202","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@a-bonus/google-docs-mcp","version":"1.10.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.10.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"66dfd08cc7c73dbf721a86ce208630a48adbb7c7","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.10.0.tgz","fileCount":151,"integrity":"sha512-WFRUvKqu8dFfSHqDszLCsYaqzw8uufX6DnpXD9s2nMGpHt0KxDcTX1oaNiG854ty7LYUJ9rQzLzJbfu1twhHeA==","signatures":[{"sig":"MEQCIAoGJG01NNRn8jebsLF1IfQ0MzZD7HhJ+fpnVYB7lhvtAiAW06jtfXmkkHzMSIOQql0Ua1ZpQLdKHTwERwRS4FrDAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":680534},"type":"module","gitHead":"d0c237b1fb449301e2ca1affc151d242f01617b0","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build","test:live:docs":"vitest run src/tools/docs/cloneTable.live.test.ts"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.7","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.22.2","dependencies":{"zod":"^3.24.2","fastmcp":"^3.34.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.10.0_1779204694631_0.9168800704514395","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@a-bonus/google-docs-mcp","version":"1.11.0","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.11.0","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"a9457a57953ab9b031bf96cea5ee2ddac6011a38","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.11.0.tgz","fileCount":154,"integrity":"sha512-6pHQPrZSiVQH00k7toeO01JRVblwthj3/cFKNI9QEfJ5P/jO0+MVvGbKZ6k7vXavEfEpJvQf0ugbphTVUDSo8A==","signatures":[{"sig":"MEYCIQDggH4TX6Jvn/rUWmwciqOZdQPk2y83wjM5WcolgFnPOAIhANgHREfQ3EUpI2I4YcPNZKFzoYh65KDInHIGFSNT+O+s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":690688},"type":"module","gitHead":"66a6ad44c1775059f5ff3754ec20ef5f493663d5","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build","test:live:docs":"vitest run src/tools/docs/cloneTable.live.test.ts"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.8","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.24.2","fastmcp":"^4.0.1","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.11.0_1781103352943_0.2454532032281287","host":"s3://npm-registry-packages-npm-production"}},"1.11.2":{"name":"@a-bonus/google-docs-mcp","version":"1.11.2","keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","_id":"@a-bonus/google-docs-mcp@1.11.2","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"bin":{"google-docs-mcp":"dist/index.js"},"dist":{"shasum":"87331334f1b8d631a94d1848904fc9a8a0818438","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.11.2.tgz","fileCount":158,"integrity":"sha512-/pZUlUgDErZ0a0mmWvMP0cXj4nJrkmN8W5ac++Z6wuJedta2QODIlgXyOrtRGM/MrUXaiZADXXXDvjnA8ZT+jQ==","signatures":[{"sig":"MEQCIBJy6DQNPYAdvTH9f5NptR0ymJpEJdB1xXT0L6jG3pieAiB4xWzhbMgG3gxWyPSYKKCKV7rALh4GBLnbHCldKur94g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":706935},"type":"module","gitHead":"e75b3653406a2cb8ba5cbe16440c9f03333e6a37","scripts":{"test":"vitest run","build":"tsc","start":"node ./dist/index.js","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build","test:live:docs":"vitest run src/tools/docs/cloneTable.live.test.ts"},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"_npmVersion":"10.9.8","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.2","fastmcp":"^4.0.1","xsschema":"^0.4.4","googleapis":"^171.4.0","markdown-it":"^14.1.0","google-auth-library":"^10.5.0","@google-cloud/firestore":"^8.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^4.0.18","prettier":"^3.4.2","typescript":"^5.8.3","@types/node":"^22.14.1","@types/markdown-it":"^14.1.2"},"_npmOperationalInternal":{"tmp":"tmp/google-docs-mcp_1.11.2_1784905327596_0.6701000567272981","host":"s3://npm-registry-packages-npm-production"}},"1.11.3":{"name":"@a-bonus/google-docs-mcp","version":"1.11.3","type":"module","bin":{"google-docs-mcp":"dist/index.js"},"scripts":{"start":"node ./dist/index.js","build":"tsc","test":"vitest run","test:live:docs":"vitest run src/tools/docs/cloneTable.live.test.ts","format":"prettier --write .","format:check":"prettier --check .","prepublishOnly":"npm run build"},"publishConfig":{"access":"public"},"keywords":["mcp","google-docs","google-sheets","google-drive"],"author":{"name":"a-bonus"},"license":"ISC","description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","dependencies":{"@google-cloud/firestore":"^8.3.0","fastmcp":"^4.0.1","google-auth-library":"^10.5.0","googleapis":"^171.4.0","markdown-it":"^14.1.0","xsschema":"^0.4.4","zod":"^3.24.2"},"devDependencies":{"@types/markdown-it":"^14.1.2","@types/node":"^22.14.1","prettier":"^3.4.2","tsx":"^4.19.3","typescript":"^5.8.3","vitest":"^4.0.18"},"_id":"@a-bonus/google-docs-mcp@1.11.3","gitHead":"3192ee5fc02cbb0838ff8bb135a1f159ad9fcb34","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-nAe0q3KdTS/nO2ppWQGUEzuzwSdcD7mKEWoZkA29IEDfZTIG+p7up/pve1RCCZYLPPpIGBRX0ZXrWdOb9glW+Q==","shasum":"1cf64f9cc39735929847504e3e85740794c13f99","tarball":"https://registry.npmjs.org/@a-bonus/google-docs-mcp/-/google-docs-mcp-1.11.3.tgz","fileCount":158,"unpackedSize":708008,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFLTGgcxi7AtOJb+kF0D3hZNPsq4kVHntFoJ2ASxPyoyAiEAwjaKngl7tWugAz7gcSy/8fTavZLTYgBhz88B3hEWmz0="}]},"_npmUser":{"name":"a-bonus","email":"alain@mobela.app"},"directories":{},"maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/google-docs-mcp_1.11.3_1785189489773_0.5280450142423561"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-24T15:25:09.094Z","modified":"2026-07-27T21:58:10.099Z","1.0.0":"2026-02-24T15:25:09.316Z","1.0.1":"2026-02-24T15:41:54.576Z","1.0.2":"2026-02-25T14:29:38.198Z","1.1.0":"2026-03-09T00:32:45.690Z","1.2.0":"2026-03-15T19:33:20.247Z","1.3.1":"2026-03-20T18:06:30.614Z","1.4.0":"2026-03-23T17:12:12.429Z","1.5.0":"2026-03-27T17:08:50.738Z","1.6.0":"2026-03-28T14:28:11.622Z","1.7.0":"2026-04-10T17:07:39.730Z","1.8.0":"2026-04-21T20:09:00.341Z","1.9.0":"2026-04-26T21:02:23.867Z","1.10.0":"2026-05-19T15:31:34.812Z","1.11.0":"2026-06-10T14:55:53.184Z","1.11.2":"2026-07-24T15:02:07.804Z","1.11.3":"2026-07-27T21:58:09.951Z"},"author":{"name":"a-bonus"},"license":"ISC","keywords":["mcp","google-docs","google-sheets","google-drive"],"description":"MCP server for Google Docs, Sheets, Drive, Gmail, and Calendar","maintainers":[{"name":"a-bonus","email":"alain@mobela.app"}],"readme":"# Google Docs, Sheets, Drive, Gmail & Calendar MCP Server\n\n![Demo Animation](assets/google.docs.mcp.1.gif)\n\nConnect Claude Desktop, Cursor, or any MCP client to your Google Docs, Google Sheets, Google Drive, Gmail, and Google Calendar.\n\n---\n\n## Quick Start\n\n### 1. Create a Google Cloud OAuth Client\n\n1. Go to the [Google Cloud Console](https://console.cloud.google.com/)\n2. Create or select a project\n3. Enable the **Google Docs API**, **Google Sheets API**, **Google Drive API**, **Gmail API**, and **Google Calendar API**\n4. Configure the **OAuth consent screen** (External, add your email as a test user, and add the `gmail.modify` and `calendar.events` scopes alongside the Docs/Sheets/Drive scopes)\n5. Create an **OAuth client ID** (Desktop app type)\n6. Copy the **Client ID** and **Client Secret** from the confirmation screen\n\n> Need more detail? See [step-by-step instructions](#google-cloud-setup-details) at the bottom of this page.\n\n### 2. Authorize\n\n```bash\nGOOGLE_CLIENT_ID=\"your-client-id\" \\\nGOOGLE_CLIENT_SECRET=\"your-client-secret\" \\\nnpx -y @a-bonus/google-docs-mcp auth\n```\n\nThis opens your browser for Google authorization. After you approve, the refresh token is saved to `~/.config/google-docs-mcp/token.json`.\n\n### 3. Add to Your MCP Client\n\n**Claude Desktop / Cursor / Windsurf:**\n\n```json\n{\n  \"mcpServers\": {\n    \"google-docs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@a-bonus/google-docs-mcp\"],\n      \"env\": {\n        \"GOOGLE_CLIENT_ID\": \"your-client-id\",\n        \"GOOGLE_CLIENT_SECRET\": \"your-client-secret\"\n      }\n    }\n  }\n}\n```\n\nThe server starts automatically when your MCP client needs it.\n\n### Remote Deployment (Cloud Run)\n\nDeploy once for your team -- no local installs required. The server uses MCP OAuth 2.1 so your MCP client handles authentication automatically.\n\n```bash\ngcloud run deploy google-docs-mcp \\\n  --source . \\\n  --region europe-west3 \\\n  --port 8080 \\\n  --allow-unauthenticated \\\n  --set-env-vars \"^|^MCP_TRANSPORT=httpStream|BASE_URL=https://your-service.run.app|GOOGLE_CLIENT_ID=...|GOOGLE_CLIENT_SECRET=...|TOKEN_STORE=firestore|JWT_SIGNING_KEY=your-secret-key\"\n```\n\nThen each user just adds the URL to their MCP client -- no npx, no tokens, no local setup:\n\n```json\n{\n  \"mcpServers\": {\n    \"google-docs\": {\n      \"type\": \"streamableHttp\",\n      \"url\": \"https://your-service.run.app/mcp\"\n    }\n  }\n}\n```\n\nYour MCP client will prompt for Google sign-in on first connection. See [Remote Deployment](#remote-deployment) for details.\n\n---\n\n## What Can It Do?\n\nTools across Google Docs, Sheets, and Drive:\n\n### Google Docs\n\n| Tool                          | Description                                                           |\n| ----------------------------- | --------------------------------------------------------------------- |\n| `readDocument`                | Read content as plain text, JSON, or markdown                         |\n| `appendText`                  | Append text to a document                                             |\n| `insertText`                  | Insert text at a specific position                                    |\n| `deleteRange`                 | Remove content by index range                                         |\n| `modifyText`                  | Replace, prepend, or transform text in a document                     |\n| `findAndReplace`              | Find and replace text across a document                               |\n| `findElement`                 | Locate text occurrences (with index ranges) or list paragraphs/tables |\n| `listTabs`                    | List all tabs in a multi-tab document                                 |\n| `addTab`                      | Add a new tab to a document                                           |\n| `renameTab`                   | Rename a document tab                                                 |\n| `replaceDocumentWithMarkdown` | Replace entire document content from markdown                         |\n| `replaceRangeWithMarkdown`    | Replace a specific range with markdown content                        |\n| `appendMarkdown`              | Append markdown-formatted content                                     |\n| `applyTextStyle`              | Bold, italic, colors, font size, links                                |\n| `applyParagraphStyle`         | Alignment, spacing, indentation                                       |\n| `insertTable`                 | Create an empty table                                                 |\n| `insertTableWithData`         | Create a table pre-filled with data                                   |\n| `insertPageBreak`             | Insert page breaks                                                    |\n| `insertSectionBreak`          | Insert section break (NEXT_PAGE or CONTINUOUS)                        |\n| `updateSectionStyle`          | Update section style: flip orientation, margins                       |\n| `insertImage`                 | Insert images from URLs or local files                                |\n\n### Comments\n\n| Tool             | Description                            |\n| ---------------- | -------------------------------------- |\n| `listComments`   | View all comments with author and date |\n| `getComment`     | Get a specific comment with replies    |\n| `addComment`     | Create a comment anchored to text      |\n| `replyToComment` | Reply to an existing comment           |\n| `resolveComment` | Mark a comment as resolved             |\n| `deleteComment`  | Remove a comment                       |\n\n### Google Sheets\n\n| Tool                          | Description                                                           |\n| ----------------------------- | --------------------------------------------------------------------- |\n| `readSpreadsheet`             | Read data from a range (A1 notation)                                  |\n| `writeSpreadsheet`            | Write data to a range                                                 |\n| `batchWrite`                  | Write to multiple ranges in one call                                  |\n| `appendRows`                  | Add rows to a sheet                                                   |\n| `clearRange`                  | Clear cell values                                                     |\n| `createSpreadsheet`           | Create a new spreadsheet                                              |\n| `addSheet`                    | Add a sheet/tab                                                       |\n| `deleteSheet`                 | Remove a sheet/tab                                                    |\n| `duplicateSheet`              | Duplicate a sheet within the same spreadsheet                         |\n| `copySheetTo`                 | Copy a sheet into another spreadsheet                                 |\n| `renameSheet`                 | Rename a sheet/tab                                                    |\n| `getSpreadsheetInfo`          | Get metadata and sheet list                                           |\n| `listSpreadsheets`            | Find spreadsheets                                                     |\n| `formatCells`                 | Bold, colors, alignment, vertical alignment, wrap strategy on ranges  |\n| `copyFormatting`              | Copy formatting from one range to another                             |\n| `readCellFormat`              | Read formatting details of a cell range                               |\n| `setCellBorders`              | Set per-side borders (top/bottom/left/right/inner) with style & color |\n| `freezeRowsAndColumns`        | Pin header rows/columns                                               |\n| `setDropdownValidation`       | Add/remove dropdown lists on cells                                    |\n| `setColumnWidths`             | Set column widths in pixels                                           |\n| `setRowHeights`               | Set row heights in pixels                                             |\n| `autoResizeColumns`           | Auto-fit column widths to content                                     |\n| `autoResizeRows`              | Auto-fit row heights to content                                       |\n| `protectRange`                | Lock a range or entire sheet (warning-only or fully locked)           |\n| `addConditionalFormatting`    | Add a conditional formatting rule                                     |\n| `getConditionalFormatting`    | List conditional formatting rules with their index (JSON)             |\n| `deleteConditionalFormatting` | Delete conditional formatting rules by index                          |\n| `groupRows`                   | Group rows for collapsible sections                                   |\n| `ungroupAllRows`              | Remove all row groupings                                              |\n| `createSheetsComment`         | Create a spreadsheet comment, optionally with a direct cell link      |\n| `createSheetsCellNote`        | Create a native cell note attached to a cell or range                 |\n| `insertChart`                 | Create a chart from data                                              |\n| `deleteChart`                 | Remove a chart                                                        |\n\n### Google Sheets Tables\n\n| Tool               | Description                                    |\n| ------------------ | ---------------------------------------------- |\n| `createTable`      | Create a new named table with column types     |\n| `listTables`       | List all tables in a spreadsheet or sheet      |\n| `getTable`         | Get detailed table metadata by name or ID      |\n| `deleteTable`      | Delete a table (optionally clear data)         |\n| `updateTableRange` | Modify table dimensions (add/remove rows/cols) |\n| `appendTableRows`  | Append rows to a table (table-aware insertion) |\n\n### Google Drive\n\n| Tool                         | Description                                 |\n| ---------------------------- | ------------------------------------------- |\n| `listDocuments`              | List documents, optionally filtered by date |\n| `searchDocuments`            | Search by name or content                   |\n| `getDocumentInfo`            | Get document metadata                       |\n| `createDocument`             | Create a new document                       |\n| `createDocumentFromTemplate` | Create from an existing template            |\n| `createFolder`               | Create a folder                             |\n| `listFolderContents`         | List folder contents                        |\n| `getFolderInfo`              | Get folder metadata                         |\n| `moveFile`                   | Move a file to another folder               |\n| `copyFile`                   | Duplicate a file                            |\n| `renameFile`                 | Rename a file                               |\n| `deleteFile`                 | Move to trash or permanently delete         |\n| `listDriveFiles`             | List any file type in Drive with filters    |\n| `searchDriveFiles`           | Search all Drive files by name or content   |\n| `downloadFile`               | Download a file's content                   |\n\n### Gmail\n\n| Tool                  | Description                                                                                                                 |\n| --------------------- | --------------------------------------------------------------------------------------------------------------------------- |\n| `listMessages`        | List or search messages using Gmail query syntax (`is:unread`, `from:`, `newer_than:`, etc.)                                |\n| `getMessage`          | Fetch a single message with decoded headers, plain-text body, HTML body, and attachment metadata                            |\n| `sendEmail`           | Send a plain-text email. Supports cc/bcc and threaded replies via `replyToMessageId`                                        |\n| `trashMessage`        | Move a message to Trash (reversible, same as clicking Delete in the Gmail UI)                                               |\n| `modifyMessageLabels` | Add or remove labels on a message — use to star, archive (remove `INBOX`), mark read (remove `UNREAD`)                      |\n| `listLabels`          | List all system and custom labels with their IDs                                                                            |\n| `createDraft`         | Compose a draft instead of sending immediately — for compose/review/send workflows                                          |\n| `listDrafts`          | List existing drafts with recipient, subject, and snippet                                                                   |\n| `getDraft`            | Fetch a single draft with full headers and body                                                                             |\n| `updateDraft`         | Replace the contents of an existing draft (full replace, not patch)                                                         |\n| `sendDraft`           | Send an existing draft by ID                                                                                                |\n| `deleteDraft`         | Permanently delete a draft (not moved to Trash — gone)                                                                      |\n| `triageInbox`         | **Composite:** fetch unread messages with content + heuristic flags (newsletter, meeting, action) for one-shot inbox triage |\n\n### Google Calendar\n\n| Tool            | Description                                                                                        |\n| --------------- | -------------------------------------------------------------------------------------------------- |\n| `listEvents`    | List or search events with `q`, `timeMin`, `timeMax`, `maxResults` (defaults to primary calendar)  |\n| `createEvent`   | Create an event with title, start/end, description, location, attendees, optional Google Meet link |\n| `updateEvent`   | PATCH-style update — only the fields you pass change. Use to reschedule, retitle, change attendees |\n| `deleteEvent`   | Permanently delete an event. Optional `sendUpdates` emails cancellations to attendees              |\n| `quickAddEvent` | Natural-language event creation: `\"Lunch with Sarah tomorrow 12pm\"` — Google parses the rest       |\n\n---\n\n## Usage Examples\n\n### Google Docs\n\n```\n\"Read document ABC123 as markdown\"\n\"Append 'Meeting notes for today' to document ABC123\"\n\"Make the text 'Important' bold and red in document ABC123\"\n\"Replace the entire document with this markdown: # Title\\n\\nNew content here\"\n\"Insert a 3x4 table at index 50 in document ABC123\"\n```\n\n### Google Sheets\n\n```\n\"Read range A1:D10 from spreadsheet XYZ789\"\n\"Write [[Name, Score], [Alice, 95], [Bob, 87]] to range A1 in spreadsheet XYZ789\"\n\"Create a new spreadsheet titled 'Q1 Report'\"\n\"Format row 1 as bold with a light blue background in spreadsheet XYZ789\"\n\"Freeze the first row in spreadsheet XYZ789\"\n\"Add a dropdown with options [Open, In Progress, Done] to range C2:C100\"\n\"Create a table named 'Tasks' in range A1:D10 with columns: Task (TEXT), Status (DROPDOWN: 'Not Started','In Progress','Done'), Priority (NUMBER)\"\n\"Add a medium solid border around A1:D10 in spreadsheet XYZ789\"\n\"Protect the header row so collaborators can't accidentally edit it\"\n\"Auto-fit row heights for rows 2–50 after wrapping text\"\n```\n\n### Google Drive\n\n```\n\"List my 10 most recent Google Docs\"\n\"Search for documents containing 'project proposal'\"\n\"Create a folder called 'Meeting Notes' and move document ABC123 into it\"\n```\n\n### Gmail\n\n```\n\"Show me my 20 most recent unread emails\"\n\"Search Gmail for messages from alice@example.com in the last 7 days\"\n\"Read the full body of message ID 18c3f4a2b1d9\"\n\"Send an email to bob@example.com with the subject 'Weekly update' and this body...\"\n\"Reply to message 18c3f4a2b1d9 with 'Thanks, confirmed.'\"\n\"Star message 18c3f4a2b1d9 and archive it\"\n\"Move message 18c3f4a2b1d9 to Trash\"\n\"List all my Gmail labels\"\n\"Draft a reply to that email but don't send it yet — let me review first\"\n\"Show me my drafts, then send the one to bob@\"\n\"Triage my unread inbox: tell me which 20 emails need attention and which are noise\"\n```\n\n### Google Calendar\n\n```\n\"What's on my calendar this week?\"\n\"Create an event titled 'Project review' tomorrow from 2pm to 3pm Pacific time\"\n\"Quick add: lunch with Alex Friday 12:30\"\n\"Reschedule event abc123 to next Monday at 10am\"\n\"Delete the 'Standup' event tomorrow\"\n\"List all events on my calendar between April 15 and April 22\"\n\"Schedule a 30-minute meeting with bob@example.com next Wednesday at 11am with a Google Meet link\"\n```\n\n### Markdown Workflow\n\nThe server supports a full round-trip markdown workflow:\n\n1. Read a document as markdown: `readDocument` with `format='markdown'`\n2. Edit the markdown locally\n3. Push changes back: `replaceDocumentWithMarkdown`\n\nSupported: headings, bold, italic, strikethrough, links, bullet/numbered lists, horizontal rules.\n\n### Live Docs Verification\n\nThe repository includes an opt-in live integration test for `cloneTable` against the real Google Docs API. It is skipped by default.\n\nRequirements:\n\n- valid `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`\n- an authorized token already stored via `npx -y @a-bonus/google-docs-mcp auth`\n\nRun it with:\n\n```bash\nGOOGLE_DOCS_LIVE_TESTS=1 npm run test:live:docs\n```\n\nThis test creates temporary source/target Google Docs, verifies `cloneTable`, and then deletes the test files.\n\n---\n\n## Remote Deployment\n\nDeploy the server centrally on Google Cloud Run (or any container host) so your team can use it without local installs. The server uses **MCP OAuth 2.1** with FastMCP's built-in `GoogleProvider` -- MCP clients handle the auth flow automatically.\n\nVisit the server root URL (`/`) for setup instructions and a ready-to-copy client config.\n\n### Environment Variables\n\n| Variable               | Description                                                                                                         |\n| ---------------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `MCP_TRANSPORT`        | Set to `httpStream` to enable remote mode (default: `stdio`)                                                        |\n| `BASE_URL`             | Public URL of the deployed server (required for OAuth redirects)                                                    |\n| `GOOGLE_CLIENT_ID`     | OAuth client ID (Web application type)                                                                              |\n| `GOOGLE_CLIENT_SECRET` | OAuth client secret                                                                                                 |\n| `MCP_TOOL_GROUPS`      | Optional comma-separated tool groups to register: `docs`, `drive`, `sheets`, `utils`, `gmail`, `calendar`, or `all` |\n| `ALLOWED_DOMAINS`      | Comma-separated list of allowed Google Workspace domains (optional)                                                 |\n| `PORT`                 | HTTP port (default: `8080`)                                                                                         |\n| `TOKEN_STORE`          | Set to `firestore` for persistent token storage (default: in-memory)                                                |\n| `JWT_SIGNING_KEY`      | Fixed signing key so tokens survive restarts (auto-generated if not set)                                            |\n| `REFRESH_TOKEN_TTL`    | Refresh token lifetime in seconds (default: `2592000` / 30 days)                                                    |\n| `GCLOUD_PROJECT`       | GCP project ID for Firestore (required when `TOKEN_STORE=firestore`)                                                |\n| `MCP_STATELESS`        | Set to `true` for serverless deployments (Cloud Run, etc.) — disables session tracking to survive scale-to-zero     |\n\n### Setup\n\n1. Create a GCP project and enable Docs, Sheets, and Drive APIs\n2. Create an OAuth client (**Web application** type, not Desktop)\n3. Set the authorized redirect URI to `{BASE_URL}/oauth/callback`\n4. Deploy to Cloud Run:\n\n```bash\ngcloud run deploy google-docs-mcp \\\n  --source . \\\n  --region europe-west3 \\\n  --port 8080 \\\n  --allow-unauthenticated \\\n  --set-env-vars \"^|^MCP_TRANSPORT=httpStream|BASE_URL=https://your-service.run.app|ALLOWED_DOMAINS=yourdomain.com|GOOGLE_CLIENT_ID=...|GOOGLE_CLIENT_SECRET=...|TOKEN_STORE=firestore|JWT_SIGNING_KEY=your-secret-key\"\n```\n\n> **Note:** The `^|^` prefix changes the env var delimiter from `,` to `|` because `ALLOWED_DOMAINS` contains commas.\n\n### How It Works\n\n- By default, OAuth sessions are stored in memory and lost on restart\n- For production, set `TOKEN_STORE=firestore` and `JWT_SIGNING_KEY` for persistent auth across deploys and cold starts\n- On serverless platforms (Cloud Run, etc.), set `MCP_STATELESS=true` — MCP sessions are held in memory, so scale-to-zero wipes them. Stateless mode disables session tracking entirely; each request authenticates independently via the JWT/Firestore token flow\n- `ALLOWED_DOMAINS` restricts access to specific Google Workspace domains\n- Access tokens refresh automatically; inactive sessions expire after 30 days\n- Users can revoke access at any time via [Google Account permissions](https://myaccount.google.com/permissions)\n\n### Updating Your Deployment\n\nMerging changes to `main` does **not** automatically update your Cloud Run service. Each deployment is independent — you need to redeploy manually when you want new features or fixes.\n\n**To update:**\n\n1. Pull the latest code:\n\n   ```bash\n   git pull origin main\n   ```\n\n2. Redeploy to Cloud Run:\n   ```bash\n   gcloud run deploy your-service-name --source . --region your-region\n   ```\n   Your existing environment variables are preserved — no need to pass `--set-env-vars` again.\n\n**When to redeploy:**\n\n- **Bug fixes and security patches** — redeploy as soon as possible\n- **New features** — redeploy at your convenience\n- **Breaking changes** — check the release notes before redeploying\n\nYou can check your current version against the latest release on the [releases page](https://github.com/a-bonus/google-docs-mcp/releases).\n\n---\n\n## Authentication Options\n\n### OAuth (Default)\n\nPass your Google Cloud OAuth client credentials as environment variables:\n\n| Variable               | Description                                   |\n| ---------------------- | --------------------------------------------- |\n| `GOOGLE_CLIENT_ID`     | OAuth client ID from Google Cloud Console     |\n| `GOOGLE_CLIENT_SECRET` | OAuth client secret from Google Cloud Console |\n\n### Service Account (Enterprise)\n\nFor Google Workspace with domain-wide delegation:\n\n| Variable                  | Description                                 |\n| ------------------------- | ------------------------------------------- |\n| `SERVICE_ACCOUNT_PATH`    | Path to the service account JSON key file   |\n| `GOOGLE_IMPERSONATE_USER` | Email of the user to impersonate (optional) |\n\n```json\n{\n  \"mcpServers\": {\n    \"google-docs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@a-bonus/google-docs-mcp\"],\n      \"env\": {\n        \"SERVICE_ACCOUNT_PATH\": \"/path/to/service-account-key.json\",\n        \"GOOGLE_IMPERSONATE_USER\": \"user@yourdomain.com\"\n      }\n    }\n  }\n}\n```\n\n### Token Storage\n\nOAuth refresh tokens are stored in `~/.config/google-docs-mcp/token.json` (respects `XDG_CONFIG_HOME`). OAuth client IDs and client secrets are not stored in the token file. To re-authorize, run the `auth` command again or delete the token file.\n\n### Multiple Google Accounts\n\nSet `GOOGLE_MCP_PROFILE` to store tokens in a profile-specific subdirectory. This allows using different Google accounts for different projects:\n\n| Variable             | Description                                        |\n| -------------------- | -------------------------------------------------- |\n| `GOOGLE_MCP_PROFILE` | Profile name for isolated token storage (optional) |\n\n```json\n{\n  \"mcpServers\": {\n    \"google-docs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@a-bonus/google-docs-mcp\"],\n      \"env\": {\n        \"GOOGLE_CLIENT_ID\": \"...\",\n        \"GOOGLE_CLIENT_SECRET\": \"...\",\n        \"GOOGLE_MCP_PROFILE\": \"work\"\n      }\n    }\n  }\n}\n```\n\nTokens are stored per profile:\n\n```\n~/.config/google-docs-mcp/\n├── token.json              # default (no profile)\n├── work/token.json         # GOOGLE_MCP_PROFILE=work\n├── personal/token.json     # GOOGLE_MCP_PROFILE=personal\n```\n\nWithout `GOOGLE_MCP_PROFILE`, behavior is unchanged.\n\n---\n\n## Known Limitations\n\n- **Comment anchoring:** Programmatically created comments appear in the comment list but aren't visibly anchored to text in the Google Docs UI. This is a Google Drive API limitation.\n- **Sheets comment anchoring:** API-created spreadsheet comments can store anchor metadata, but Google Workspace editors treat Drive API anchors as unanchored comments. Use `createSheetsComment` with `includeCellLink=true` for a clickable link to the target cell, or `createSheetsCellNote` when the review text must be attached to the cell itself.\n- **Comment resolution:** Resolved status may not persist in the Google Docs UI.\n- **Converted documents:** Docs converted from Word may not support all API operations.\n- **Markdown images:** Not yet supported in the markdown-to-Docs conversion.\n- **Deeply nested lists:** Lists with 3+ nesting levels may have formatting quirks.\n- **Gmail hard delete:** `trashMessage` moves messages to Trash (reversible). Permanent deletion requires the broader `https://mail.google.com/` scope and is not exposed in v0.1.\n- **Gmail attachments:** `getMessage` returns attachment metadata but does not download attachment bytes yet.\n- **Gmail HTML email send:** `sendEmail` sends plain-text only. For HTML bodies, paste HTML into the `body` field — it will be delivered as text, not rendered.\n- **Calendar scope:** `calendar.events` permits event CRUD on existing calendars but cannot create or delete entire calendars themselves.\n- **Calendar recurring events:** `updateEvent` and `deleteEvent` modify the entire recurring series unless you target a specific instance ID returned by `listEvents` with `singleEvents=true`.\n\n## Troubleshooting\n\n- **Server won't start:**\n  - Verify `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` are set in the `env` block of your MCP config.\n  - Try running manually: `npx @a-bonus/google-docs-mcp` and check stderr for errors.\n- **Authorization errors:**\n  - Ensure Docs, Sheets, Drive, Gmail, and Calendar APIs are enabled in Google Cloud Console.\n  - Confirm your email is listed as a Test User on the OAuth consent screen and that all required scopes (Docs, Sheets, Drive, `gmail.modify`, `calendar.events`) are added to the consent screen.\n  - Re-authorize: `npx @a-bonus/google-docs-mcp auth`\n  - Delete `~/.config/google-docs-mcp/token.json` and re-authorize if upgrading — Gmail and Calendar scopes were added in later versions, so existing tokens must be refreshed.\n  - Remote (Cloud Run) users must sign out and sign back in from their MCP client so Google reissues consent with the new scope list.\n- **Tab errors:**\n  - Use `listTabs` to see available tab IDs.\n  - Omit `tabId` for single-tab documents.\n- **\"Page not found\" on claude.ai during OAuth sign-in (remote deployments):**\n  - Symptom: clicking Connect on a custom MCP connector lands on the Claude \"Page not found\" page instead of the Google sign-in screen.\n  - Cause: Cloud Run cold start. The first request to an idle service times out before the container finishes spinning up, and Claude routes the failed redirect to its 404 page.\n  - Workaround: hard-refresh the page (`Cmd+Shift+R` on macOS, `Ctrl+Shift+R` on Windows/Linux). The second request hits a now-warm instance and the OAuth flow proceeds normally.\n  - Permanent fix: set `--min-instances=1` on your Cloud Run service to keep one instance always warm (`gcloud run services update <service> --region <region> --min-instances=1`). Costs ~$2–3/month for the memory reservation.\n- **Re-authenticated unexpectedly after a redeploy (remote deployments):**\n  - Cause: `JWT_SIGNING_KEY` is auto-generated on each container start, so redeploys invalidate all previously issued sessions.\n  - Fix: set a stable `JWT_SIGNING_KEY` env var on the Cloud Run service so it survives restarts: `gcloud run services update <service> --region <region> --update-env-vars JWT_SIGNING_KEY=$(openssl rand -hex 32)`. Sessions minted after this change will survive future redeploys.\n- **High CPU with multiple MCP sessions:** Some clients call `tools/list` very often. FastMCP otherwise recomputes JSON Schema for every tool on every request, which can pin a CPU core per process. This server precomputes the payload once before stdio starts and replaces the `tools/list` handler with a cached snapshot. If you still see sustained load, capture a few seconds with `sample <pid> 1 10` (macOS) or `node --cpu-prof` and report it.\n\n---\n\n## Google Cloud Setup Details\n\n<details>\n<summary>Step-by-step Google Cloud Console instructions</summary>\n\n> For **remote deployment**, create an OAuth client of type **Web application** (not Desktop app). Use Desktop app only for local stdio usage.\n\n1. **Go to Google Cloud Console:** Open [console.cloud.google.com](https://console.cloud.google.com/)\n2. **Create or Select a Project:** Click the project dropdown > \"NEW PROJECT\". Name it (e.g., \"MCP Docs Server\") and click \"CREATE\".\n3. **Enable APIs:**\n   - Navigate to \"APIs & Services\" > \"Library\"\n   - Search for and enable: **Google Docs API**, **Google Sheets API**, **Google Drive API**, **Gmail API**, **Google Calendar API**\n4. **Configure OAuth Consent Screen:**\n   - Go to \"APIs & Services\" > \"OAuth consent screen\"\n   - Choose \"External\" and click \"CREATE\"\n   - Fill in: App name, User support email, Developer contact email\n   - Click \"SAVE AND CONTINUE\"\n   - Add scopes: `documents`, `spreadsheets`, `drive`, `gmail.modify`, `calendar.events`\n   - Click \"SAVE AND CONTINUE\"\n   - Add your Google email as a Test User\n   - Click \"SAVE AND CONTINUE\"\n5. **Create Credentials:**\n   - Go to \"APIs & Services\" > \"Credentials\"\n   - Click \"+ CREATE CREDENTIALS\" > \"OAuth client ID\"\n   - Application type: \"Desktop app\"\n   - Click \"CREATE\"\n   - Copy the **Client ID** and **Client Secret**\n\n</details>\n\n---\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, architecture overview, and guidelines.\n\n## License\n\nMIT -- see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}