Google Workspace代码执行服务

一个本地JavaScript/TypeScript MCP服务器,提供单一工具'execute',用于运行用户提供的代码并访问Google Workspace API。

  • by mitsuhiko
  • JavaScript
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 mitsuhiko/google-workspace-mcp

使用说明

谷歌工作区代码MCP

重要提示:这是一个替代实验,不是我的主要设置

如果你正在寻找我日常使用的Google Workspace集成,请使用以下技能:

  • 主要技能: https://github.com/mitsuhiko/agent-stuff/tree/main/skills/google-workspace

此存储库是 替代代码优先MCP实验 围绕一个 execute 工具。 它有意与以下想法保持一致:

  • 你的MCP不需要30个工具:它需要代码 — https://lucumr.pocoo.org/2025/8/18/code-mcps/

这篇文章探讨了代码支持/代码优先的MCP设计(更少的固定工具,更多的可编程能力)。


本地JavaScript/TypeScript MCP服务器 单一工具: execute.

execute 运行JavaScript(或带有类型剥离的TypeScript),并赋予该代码对Google Workspace API的身份验证访问权限。

此服务器的功能

  • 暴露 一个MCP工具: execute
  • 运行用户提供的JavaScript/TypeScript(异步函数体;去除TS类型)
  • 首次使用时自动执行OAuth登录(浏览器流)
  • 在后续调用中重复使用存储的令牌
  • 在执行代码中提供小型运行时API:
    • auth --谷歌OAuth客户端
    • google — googleapis SDK根目录
    • workspace --辅助方法(call, service, whoAmI)
    • state --跨调用的持久可变对象

这遵循了一种代码模式设计:一个灵活的执行工具,而不是许多固定的工具。

需求

  • Node.js 20+
  • 初始OAuth登录的本地桌面/浏览器访问权限

安装

npm install

跑

npm start

或者:

node src/server.js

MCP配置

此回购已包含 .mcp.json:

{
  "mcpServers": {
    "google-workspace-code": {
      "type": "stdio",
      "command": "node",
      "args": [
        "/Users/mitsuhiko/Development/workspace-mcp/src/server.js"
      ],
      "env": {
        "GOOGLE_WORKSPACE_AUTH_MODE": "cloud"
      }
    }
  }
}

如果移动项目,请更新 args 路径。

工具合同

工具名称

  • execute

输入架构

  • script (string,必填):JavaScript/TypeScript异步函数体(TS类型语法在执行前被剥离)
  • timeoutMs (数字,可选):执行超时(毫秒)(默认值 30000,最大值 300000)
  • scopes (string[],可选):覆盖调用的OAuth作用域
  • resetState (布尔值,可选):清除持久值 state 执行前

执行环境

您的脚本作为异步函数体运行,其作用域中包含以下变量:

  • auth
  • google
  • workspace
  • state

返回值被序列化并作为工具输出发回。

示例脚本

1) 我是谁+列出驱动器文件

const me = await workspace.whoAmI();
const files = await workspace.call('drive', 'files.list', {
  pageSize: 5,
  fields: 'files(id,name,mimeType)'
});

state.lastEmail = me.email;

return {
  user: me,
  files: files.files,
  remembered: state.lastEmail
};

2) 列出今天的日历事件

const start = new Date();
start.setHours(0, 0, 0, 0);

const end = new Date(start);
end.setDate(end.getDate() + 1);

return await workspace.call('calendar', 'events.list', {
  calendarId: 'primary',
  timeMin: start.toISOString(),
  timeMax: end.toISOString(),
  singleEvents: true,
  orderBy: 'startTime'
});

OAuth和令牌存储

  • 首次无令牌调用会自动触发浏览器登录
  • 默认配置目录: ~/.pi/google-workspace
  • 默认令牌路径: ~/.pi/google-workspace/token.json
  • 默认身份验证模式: cloud (除非被覆盖)

环境变量

  • GOOGLE_WORKSPACE_CONFIG_DIR
  • GOOGLE_WORKSPACE_CREDENTIALS
  • GOOGLE_WORKSPACE_TOKEN
  • GOOGLE_WORKSPACE_AUTH_MODE (cloud 或 local)
  • GOOGLE_WORKSPACE_CLIENT_ID
  • GOOGLE_WORKSPACE_CLOUD_FUNCTION_URL
  • GOOGLE_WORKSPACE_CALLBACK_HOST

安全说明

  • 使用节点 vm 为了便于执行, 不是一个坚固的沙箱.
  • 将其视为值得信赖的本地工具。
  • 不要将此服务器暴露给不受信任的用户或网络。