日历事件管理服务

一个基于Model Context Protocol (MCP)的Google Calendar集成服务,支持通过CLI或Server-Sent Events (SSE)管理日历事件。

  • by ymello
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 ymello/mcp-google-calendar-server

使用说明

谷歌日历MCP服务器

Google Calendar 的模型上下文协议 (MCP) 实现,可通过 CLI 或服务器发送事件 (SSE) 与日历事件进行交互。

功能

  • 列出日历事件
  • 创建新事件
  • 临时事件存在
  • 删除事件
  • 查找可用时间

先决条件

  • Node.js 18或更高级
  • Google 帐户可访问 Google 日历 API
  • Google Cloud Console OAuth 2.0 凭据

配置

  1. 复制文件 .env.example 段落 .env:

    cp .env.example .env
    
  2. 在档案中设定 Google OAuth 2.0 凭据 .env:

    GOOGLE_CLIENT_ID=seu-client-id
    GOOGLE_CLIENT_SECRET=seu-client-secret
    GOOGLE_REDIRECT_URI=http://localhost:3000/oauth2callback
    GOOGLE_REFRESH_TOKEN=seu-refresh-token
    PORT=3334
    
  3. 安装依赖关系 :

    npm install
    
  4. 编译代码 :

    npm run build
    

谎言

作为 HTTP/SSE 服务器运行

服务于HTTP/SSE:

npm run start:http

这将在指定端口启动服务器(默认:3334)。

可用的端点 :

  • GET /sse - 连接到 SSE 流
  • POST /messages - 将信件发送到服务器

以 CLI (stdio) 运行

以 stdio 模式运行服务器作为 CLI 工具 :

npm run start:stdio

与 MCP 客户端集成

克劳德桌面

要将此服务器与 Claude Desktop 配合使用,请将以下设置添加到 Claude 配置文件:

没有MacOS:

code ~/Library/Application\ Support/Claude/claude_desktop_config.json

无窗口:

code %AppData%\Claude\claude_desktop_config.json

添加配置 :

{
  "mcpServers": {
    "google-calendar": {
      "command": "node",
      "args": [
        "/caminho/absoluto/para/o/build/index.js"
      ],
      "env": {
        "GOOGLE_CLIENT_ID": "seu-client-id",
        "GOOGLE_CLIENT_SECRET": "seu-client-secret",
        "GOOGLE_REDIRECT_URI": "seu-redirect-uri",
        "GOOGLE_REFRESH_TOKEN": "seu-refresh-token"
      }
    }
  }
}

与其他 MCP 客户端集成

对于支持 SSE 通信的其他 MCP 客户端,请将其指向端点:

  • SSE 端点: http://localhost:3334/sse
  • 消息终结点: http://localhost:3334/messages

可用工具

Google Calendar MCP 服务器提供以下工具:

list_事件

列出指定时间范围内的事件 。

{
  "timeMin": "2023-09-01T00:00:00Z",
  "timeMax": "2023-09-30T23:59:59Z",
  "maxResults": 10
}

create_event

在日历中创建新事件 。

{
  "summary": "Reunião importante",
  "description": "Discussão sobre o projeto XYZ",
  "startTime": "2023-09-15T14:00:00Z",
  "endTime": "2023-09-15T15:00:00Z",
  "attendees": ["pessoa1@exemplo.com", "pessoa2@exemplo.com"]
}

update_事件

更新已有事件 。

{
  "eventId": "abc123xyz",
  "summary": "Reunião atualizada",
  "startTime": "2023-09-15T14:30:00Z",
  "endTime": "2023-09-15T15:30:00Z"
}

删除事件

从日历中删除事件 。

{
  "eventId": "abc123xyz"
}

find_free_time

查找时间范围内的可用时间。

{
  "timeMin": "2023-09-01T00:00:00Z",
  "timeMax": "2023-09-30T23:59:59Z",
  "duration": 60
}

获取 Refresh Token

要从 Google 获取刷新令牌,您可以使用以下脚本:

const { google } = require('googleapis');
const http = require('http');
const url = require('url');

// Substituir com suas credenciais
const CLIENT_ID = 'seu-client-id';
const CLIENT_SECRET = 'seu-client-secret';
const REDIRECT_URI = 'http://localhost:3000/oauth2callback';

const oauth2Client = new google.auth.OAuth2(
  CLIENT_ID,
  CLIENT_SECRET,
  REDIRECT_URI
);

const scopes = [
  'https://www.googleapis.com/auth/calendar',
  'https://www.googleapis.com/auth/calendar.events'
];

function getRefreshToken() {
  const server = http.createServer(async (req, res) => {
    const queryParams = url.parse(req.url, true).query;
    
    if (queryParams.code) {
      try {
        const { tokens } = await oauth2Client.getToken(queryParams.code);
        console.log('Refresh Token:', tokens.refresh_token);
        res.end('Autenticação bem-sucedida! Você pode fechar esta janela.');
        server.close();
      } catch (error) {
        console.error('Erro ao obter tokens:', error);
        res.end('Falha na autenticação!');
      }
    }
  }).listen(3000, () => {
    const authUrl = oauth2Client.generateAuthUrl({
      access_type: 'offline',
      scope: scopes,
      prompt: 'consent'
    });

    console.log('Acesse esta URL no navegador:');
    console.log(authUrl);
  });
}

getRefreshToken();

Salve este的剧本 getToken.js,执行-o-com node getToken.js然后按照说明获取您的刷新令牌。

开发

对于开发,您可以运行:

npm run dev

这将以观察模式编译TypeScript,允许您进行更改并实时查看结果。

解决问题

常见问题

  1. Google 认证错误

    • 请检查您的凭据是否正确
    • 确认刷新令牌是否有效
    • 确保所需的范围已启用
  2. 服务器未启动

    • 检查是否设置了所有环境变量
    • 确认构建过程是否成功
    • 检查 build/index.js 文件的权限
  3. SSE 连接失败

    • 确认端口(默认为 3334)是否可用
    • 检查日志是否有特定错误
    • 确保端点设置正确

许可证

国际协调委员会