Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
2d87687
feat(registry): restore Supabase integration files
JonasJesus42 Dec 31, 2025
2a3fe27
feat(registry): update to full Supabase-based implementation
JonasJesus42 Jan 2, 2026
da17066
fix(registry): code review fixes and translate PT-BR to EN
JonasJesus42 Jan 2, 2026
b27be61
fix(registry): add underscore escape to search sanitization
JonasJesus42 Jan 2, 2026
ff8f6ae
security: remove hardcoded OpenRouter API key
JonasJesus42 Jan 2, 2026
181f60f
chore(registry): add .env to gitignore and create setup docs
JonasJesus42 Jan 2, 2026
99f0833
chore(registry): remove ENV_SETUP.md file
JonasJesus42 Jan 2, 2026
715d3bb
docs(registry): fix incorrect GET tool documentation
JonasJesus42 Jan 2, 2026
36ed2b5
Merge pull request #75 from decocms/feat/registry-updates-from-main
JonasJesus42 Jan 2, 2026
afd82b5
feat(registry): add tags and categories filters to LIST tool
JonasJesus42 Jan 2, 2026
d755358
feat(registry): add FILTERS tool to discover available tags and categ…
JonasJesus42 Jan 2, 2026
25a88d1
Merge pull request #78 from decocms/feat/registry-updates-from-main
JonasJesus42 Jan 2, 2026
a0b325a
feat(grain): add official grain mcp
JonasJesus42 Jan 2, 2026
81a9c8f
refactor(grain): update app.json with new name and icon URL
JonasJesus42 Jan 2, 2026
972f85f
fix(grain): correct icon URL in app.json
JonasJesus42 Jan 2, 2026
52d4517
fix rogue y
tlgimenes Jan 2, 2026
b74b624
Merge pull request #79 from decocms/fix/rogue-y
tlgimenes Jan 2, 2026
b8dc9c8
feat: add Google Calendar MCP with OAuth 2.0 support
JonasJesus42 Jan 5, 2026
1b3659e
fix: handle Google OAuth state parameter correctly
JonasJesus42 Jan 5, 2026
c576fda
fix: improve type safety for accessRole and OAuth params
JonasJesus42 Jan 5, 2026
bd59c30
chore: remove debug console.log statements
JonasJesus42 Jan 5, 2026
088a393
chore: remove debug logs
JonasJesus42 Jan 5, 2026
de17ee1
fix: initialize tools with env context for OAuth
JonasJesus42 Jan 5, 2026
be1b0ca
feat: add typed env and fix numeric coercion in tools
JonasJesus42 Jan 5, 2026
586a91e
fix: preserve event duration when duplicating with newStart only
JonasJesus42 Jan 5, 2026
ac1272d
fix: update Google Calendar icon URL in app.json
JonasJesus42 Jan 5, 2026
a63eca1
Merge pull request #81 from decocms/feat/google-calendar-mcp
JonasJesus42 Jan 5, 2026
baefc3d
feat(google-calendar): add initial app.json for Google Calendar integ…
JonasJesus42 Jan 5, 2026
d8eedaa
feat(google-calendar): add friendlyName to app.json for better user d…
JonasJesus42 Jan 5, 2026
562462f
feat(google-calendar): add Google Calendar integration with dependenc…
JonasJesus42 Jan 5, 2026
eef6ad5
happy wasm
pedrofrxncx Jan 5, 2026
c03ae9c
wip wasm funny
pedrofrxncx Jan 5, 2026
1973cfe
wipflows
pedrofrxncx Jan 5, 2026
661b7d8
okay
pedrofrxncx Jan 5, 2026
8b21e16
bump zod
pedrofrxncx Jan 5, 2026
8b49c30
Merge pull request #83 from decocms/chore/bump-zod
pedrofrxncx Jan 5, 2026
3bd6cc0
Fixes zod v4 record
mcandeia Jan 5, 2026
d20e64d
fix openrouter binding
tlgimenes Jan 5, 2026
d0a4040
Merge pull request #84 from decocms/fix/llm-bindings
tlgimenes Jan 5, 2026
14167a5
Update dependencies and improve LLM binding in OpenRouter
pedrofrxncx Jan 6, 2026
ff997bc
Enhance execution queries and workflow handling
pedrofrxncx Jan 6, 2026
e73a942
Update @decocms/bindings to version 1.0.6 and enhance LLM binding tra…
pedrofrxncx Jan 6, 2026
e19f08b
Close client connection after executing tool step
pedrofrxncx Jan 6, 2026
d341db9
ok
pedrofrxncx Jan 6, 2026
2eb4dc6
Feat/reddit (#86)
viniciusventura29 Jan 6, 2026
efc81fb
fix llm streaming
tlgimenes Jan 6, 2026
9fab04a
Merge pull request #88 from decocms/chore/fix-llm-streaming
tlgimenes Jan 6, 2026
2e01995
Revert "Merge pull request #88 from decocms/chore/fix-llm-streaming"
tlgimenes Jan 6, 2026
0e1beee
Merge pull request #89 from decocms/revert
tlgimenes Jan 6, 2026
54a7656
fix llm
tlgimenes Jan 6, 2026
84e85fa
Merge pull request #90 from decocms/fix/llm
tlgimenes Jan 6, 2026
54f5cd4
Feat/supabase (#91)
viniciusventura29 Jan 6, 2026
40e4892
Update @decocms/bindings to version 1.0.7 and enhance workflow execut…
pedrofrxncx Jan 6, 2026
f724442
Refactor execution response to exclude workflow_id from output schema
pedrofrxncx Jan 6, 2026
20c1fdc
feat(local-fs): introduce local filesystem MCP server
vibegui Dec 31, 2025
11b44d9
feat(pilot): workflow-driven AI agent for MCP Mesh
vibegui Jan 5, 2026
b01da0a
WIP
vibegui Jan 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
272 changes: 159 additions & 113 deletions bun.lock

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions google-calendar/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Google Calendar MCP - Environment Variables
# Copy this file to .env and fill in your credentials

# Google OAuth 2.0 Credentials
# Get these from Google Cloud Console: https://console.cloud.google.com/
# 1. Create a project or select existing
# 2. Enable Google Calendar API
# 3. Create OAuth 2.0 credentials (Web application type)
# 4. Add authorized redirect URIs for your deployment

GOOGLE_CLIENT_ID=your_client_id_here
GOOGLE_CLIENT_SECRET=your_client_secret_here
4 changes: 4 additions & 0 deletions google-calendar/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
dist
.env

219 changes: 219 additions & 0 deletions google-calendar/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
# Google Calendar MCP

MCP Server for Google Calendar integration. Manage calendars, events and check availability using the Google Calendar API.

## Features

### Calendar Management
- **list_calendars** - List all user's calendars
- **get_calendar** - Get details of a specific calendar
- **create_calendar** - Create a new secondary calendar
- **delete_calendar** - Delete a calendar

### Event Management
- **list_events** - List events with date filters and search
- **get_event** - Get details of an event
- **create_event** - Create event with attendees and reminders
- **update_event** - Update existing event
- **delete_event** - Delete event
- **quick_add_event** - Create event using natural language

### Availability
- **get_freebusy** - Check busy/free time slots

### Advanced Operations
- **move_event** - Move an event between calendars
- **find_available_slots** - Find free time slots across multiple calendars
- **duplicate_event** - Create a copy of an existing event

## Setup

### 1. Create Project in Google Cloud Console

1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project or select an existing one
3. Enable **Google Calendar API**:
- Sidebar → APIs & Services → Library
- Search for "Google Calendar API" and enable it

### 2. Configure OAuth 2.0

1. Go to "APIs & Services" → "Credentials"
2. Click "Create credentials" → "OAuth client ID"
3. Select "Web application"
4. Configure:
- Name: Google Calendar MCP
- Authorized JavaScript origins: your URL
- Authorized redirect URIs: your callback URL

### 3. Configure Environment Variables

Create a `.env` file with:

```bash
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
```

## Development

```bash
# Install dependencies (from monorepo root)
bun install

# Run in development (hot reload)
bun run dev

# Type check
bun run check

# Build for production
bun run build
```

## Usage Examples

### List events for next week

```json
{
"tool": "list_events",
"input": {
"timeMin": "2024-01-15T00:00:00Z",
"timeMax": "2024-01-22T00:00:00Z",
"singleEvents": true,
"orderBy": "startTime"
}
}
```

### Create event with attendees

```json
{
"tool": "create_event",
"input": {
"summary": "Planning Meeting",
"description": "Q1 roadmap discussion",
"location": "Conference Room",
"start": {
"dateTime": "2024-01-15T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"end": {
"dateTime": "2024-01-15T15:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"attendees": [
{ "email": "[email protected]" },
{ "email": "[email protected]" }
],
"sendUpdates": "all"
}
}
```

### Quick add event with natural language

```json
{
"tool": "quick_add_event",
"input": {
"text": "Lunch with client tomorrow at 12pm at Central Restaurant"
}
}
```

### Check availability

```json
{
"tool": "get_freebusy",
"input": {
"timeMin": "2024-01-15T08:00:00-03:00",
"timeMax": "2024-01-15T18:00:00-03:00",
"calendarIds": ["primary", "[email protected]"]
}
}
```

### Find available meeting slots

```json
{
"tool": "find_available_slots",
"input": {
"calendarIds": ["primary", "[email protected]"],
"timeMin": "2024-01-15T09:00:00-03:00",
"timeMax": "2024-01-15T18:00:00-03:00",
"slotDurationMinutes": 30,
"maxSlots": 5
}
}
```

### Move event to another calendar

```json
{
"tool": "move_event",
"input": {
"sourceCalendarId": "primary",
"eventId": "abc123",
"destinationCalendarId": "[email protected]",
"sendUpdates": "all"
}
}
```

### Duplicate an event

```json
{
"tool": "duplicate_event",
"input": {
"eventId": "abc123",
"newStart": {
"dateTime": "2024-01-22T14:00:00-03:00",
"timeZone": "America/Sao_Paulo"
},
"newEnd": {
"dateTime": "2024-01-22T15:00:00-03:00",
"timeZone": "America/Sao_Paulo"
}
}
}
```

## Project Structure

```
google-calendar/
├── server/
│ ├── main.ts # Entry point with OAuth
│ ├── constants.ts # API URLs and constants
│ ├── lib/
│ │ ├── google-client.ts # API client
│ │ └── types.ts # TypeScript types
│ └── tools/
│ ├── index.ts # Exports all tools
│ ├── calendars.ts # Calendar tools
│ ├── events.ts # Event tools
│ ├── freebusy.ts # Availability tool
│ └── advanced.ts # Advanced tools (move, find slots, duplicate)
├── app.json # MCP configuration
├── package.json
├── tsconfig.json
└── README.md
```

## OAuth Scopes

This MCP requests the following scopes:

- `https://www.googleapis.com/auth/calendar` - Full calendar access
- `https://www.googleapis.com/auth/calendar.events` - Event management

## License

MIT
13 changes: 13 additions & 0 deletions google-calendar/app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"scopeName": "deco",
"name": "google-calendar",
"friendlyName": "Google Calendar",
"connection": {
"type": "HTTP",
"url": "https://sites-google-calendar.decocache.com/mcp"
},
"description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.",
"icon": "https://assets.decocache.com/mcp/b5fffe71-647a-461c-aa39-3da07b86cc96/Google-Meets.svg",
"unlisted": false
}

28 changes: 28 additions & 0 deletions google-calendar/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "google-calendar",
"version": "1.0.0",
"description": "Google Calendar MCP Server - Manage calendars and events",
"private": true,
"type": "module",
"scripts": {
"dev": "bun run --hot server/main.ts",
"build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js",
"build": "bun run build:server",
"publish": "cat app.json | deco registry publish -w /shared/deco -y",
"check": "tsc --noEmit"
},
"dependencies": {
"@decocms/runtime": "^1.1.0",
"zod": "^4.0.0"
},
"devDependencies": {
"@decocms/mcps-shared": "workspace:*",
"@modelcontextprotocol/sdk": "1.25.1",
"deco-cli": "^0.28.0",
"typescript": "^5.7.2"
},
"engines": {
"node": ">=22.0.0"
}
}

55 changes: 55 additions & 0 deletions google-calendar/server/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
* Google Calendar API constants and configuration
*/

export const GOOGLE_CALENDAR_API_BASE =
"https://www.googleapis.com/calendar/v3";

// API Endpoints
export const ENDPOINTS = {
CALENDAR_LIST: `${GOOGLE_CALENDAR_API_BASE}/users/me/calendarList`,
CALENDARS: `${GOOGLE_CALENDAR_API_BASE}/calendars`,
EVENTS: (calendarId: string) =>
`${GOOGLE_CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events`,
EVENT: (calendarId: string, eventId: string) =>
`${GOOGLE_CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`,
QUICK_ADD: (calendarId: string) =>
`${GOOGLE_CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/quickAdd`,
FREEBUSY: `${GOOGLE_CALENDAR_API_BASE}/freeBusy`,
};

// Default calendar ID
export const PRIMARY_CALENDAR = "primary";

// Default pagination
export const DEFAULT_MAX_RESULTS = 50;

// Event colors (Google Calendar color IDs)
export const EVENT_COLORS = {
LAVENDER: "1",
SAGE: "2",
GRAPE: "3",
FLAMINGO: "4",
BANANA: "5",
TANGERINE: "6",
PEACOCK: "7",
GRAPHITE: "8",
BLUEBERRY: "9",
BASIL: "10",
TOMATO: "11",
} as const;

// Event visibility options
export const EVENT_VISIBILITY = {
DEFAULT: "default",
PUBLIC: "public",
PRIVATE: "private",
CONFIDENTIAL: "confidential",
} as const;

// Event status
export const EVENT_STATUS = {
CONFIRMED: "confirmed",
TENTATIVE: "tentative",
CANCELLED: "cancelled",
} as const;
17 changes: 17 additions & 0 deletions google-calendar/server/lib/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import type { Env } from "../../shared/deco.gen.ts";

/**
* Get Google OAuth access token from environment context
* @param env - The environment containing the mesh request context
* @returns The OAuth access token
* @throws Error if not authenticated
*/
export const getGoogleAccessToken = (env: Env): string => {
const authorization = env.MESH_REQUEST_CONTEXT?.authorization;
if (!authorization) {
throw new Error(
"Not authenticated. Please authorize with Google Calendar first.",
);
}
return authorization;
};
Loading