← MCP directory
Low
github · 154 files analyzed

nspady/google-calendar-mcp

Minor capabilities, nothing alarming.

View source ↗

Check your own MCP server

Free · no signup · instant shareable report.

Outbound network 1
Environment variables (config / keys) 26
Filesystem writes 3
Shell / command execution 5
Sensitive credential files 4

AI review

This is a legitimate Google Calendar MCP server implementation with standard OAuth2 authentication and no deceptive behavior. The flagged items are normal Node.js patterns for a CLI tool that spawns child processes, accesses environment variables, and manages local files—all expected for a calendar integration tool.

Model: deepseek-chat

Static findings

Environment variables (config / keys) · Reads environment variables (config / API keys)

low future_features/ARCHITECTURE_REDESIGN.md:102 locale: process.env.LANG || 'en-US'
low scripts/account-manager.js:63 const fullEnv = { ...process.env, ...env };
low scripts/dev.js:236 ...process.env,
low scripts/test-docker.sh:207 env: { ...process.env, NODE_ENV: 'test' }
low src/auth-server.ts:8 process.env.GOOGLE_ACCOUNT_MODE = args[0];
low src/auth/paths.js:17 if (process.env.GOOGLE_CALENDAR_MCP_TOKEN_PATH) {
low src/auth/tokenManager.ts:179 if (process.env.NODE_ENV !== 'test') {
low src/auth/utils.ts:37 const envCredentialsPath = process.env.GOOGLE_OAUTH_CREDENTIALS;
low src/config/TransportConfig.ts:31 type: (process.env.TRANSPORT as 'stdio' | 'http') || 'stdio',
low src/handlers/core/ManageAccountsHandler.ts:211 process.env.GOOGLE_ACCOUNT_MODE = normalizedId;
low src/index.ts:47 process.env.GOOGLE_ACCOUNT_MODE = accountId;
low src/server.ts:72 if (process.env.NODE_ENV === 'test') {

+ 14 more

Shell / command execution · Executes shell / system commands

medium scripts/account-manager.js:19 import { spawn } from 'child_process';
medium scripts/check-imports.js:25 'util', 'events', 'buffer', 'querystring', 'net', 'child_process',
medium scripts/dev.js:8 import { spawn } from 'child_process';
medium scripts/test-docker.sh:192 const { spawn } = require('child_process');
info src/tests/integration/docker-integration.test.ts:4 import { spawn, ChildProcess, exec } from 'child_process';

Filesystem writes · Reads or writes the filesystem

low scripts/account-manager.js:226 await fs.unlink(tokenPath);
low src/auth/tokenManager.ts:217 await fs.unlink(legacyPath);
info src/tests/integration/docker-integration.test.ts:256 await fs.unlink(composeOverridePath).catch(() => {});

Outbound network · Makes outbound network requests

low src/handlers/core/BatchRequestHandler.ts:62 const response = await fetch(this.batchEndpoint, {

Sensitive credential files · Reads sensitive credential files

info src/tests/unit/auth/accountValidation.test.ts:71 process.env.GOOGLE_ACCOUNT_MODE = '../../../etc/passwd';
info src/tests/unit/auth/multi-account.test.ts:82 '../../../etc/passwd': { // Invalid account ID
info src/tests/unit/handlers/BaseToolHandler-accounts.test.ts:76 expect(() => handler.getClientForAccount('../../../etc/passwd', accounts))
info src/tests/unit/handlers/ManageAccountsHandler.test.ts:219 const invalidIds = ['../../../etc/passwd', 'test@email', 'test space'];

Scanning every extension your team installs?

Pro & Team add monitoring, private scans, and a CI gate for unsafe extensions.

MCPVet is a heuristic aid, not a security guarantee. A clean grade does not prove an extension is safe; always review code and instructions you don't trust.