flycal-cli 0.7.3 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +98 -227
- data/lib/flycal_cli/version.rb +1 -1
- data/mcp/README.md +48 -9
- data/mcp/tools.json +307 -52
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1bfdf39ef3561cb1c12829bd2d28dfaf9c2062df7f4c4a163ee99e057af9d413
|
|
4
|
+
data.tar.gz: 8f0ee70cc004bfd8e29a1fd4c5d7b5d852c22a3958f2de596cc2c77f9ed044f8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8069638ac5162722bc332a577833da48fb92161ee0b2ca39d6c7c31d1c4aeedecaebcc6bf696f0f9945306bbc4e99b8921718867356b5be87a9d1c22b10ff53e
|
|
7
|
+
data.tar.gz: 0bdca914927e92b873e91d42b7a061502a9558a858e392d1df1c93509c7ec85a281c5f47e309e011fd1ef734259c991a6d3fa761ecd520b5e6913a4d6f83590f
|
data/README.md
CHANGED
|
@@ -1,188 +1,48 @@
|
|
|
1
1
|
# flycal-cli
|
|
2
2
|
|
|
3
|
-
[](https://badge.fury.io/rb/flycal-cli)
|
|
3
|
+
[](https://badge.fury.io/rb/flycal-cli)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Read your Google Calendar from the terminal: search events, find free slots, copy them into an email. **Read-only** — nothing is modified on the calendar.
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
- Ruby 3.1 or later
|
|
10
|
-
- A Google Cloud project with Calendar API enabled
|
|
11
|
-
|
|
12
|
-
## Installation
|
|
7
|
+
## Quick start
|
|
13
8
|
|
|
14
9
|
```bash
|
|
15
10
|
gem install flycal-cli
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Or add to your Gemfile:
|
|
19
|
-
|
|
20
|
-
```ruby
|
|
21
|
-
gem "flycal-cli"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Then run `bundle install`.
|
|
25
|
-
|
|
26
|
-
## Setup
|
|
27
|
-
|
|
28
|
-
Before using flycal, you need OAuth credentials from Google Cloud Console:
|
|
29
|
-
|
|
30
|
-
1. Go to [Google Cloud Console - Credentials](https://console.cloud.google.com/apis/credentials)
|
|
31
|
-
2. Create a project or select an existing one
|
|
32
|
-
3. Enable the **Google Calendar API** (APIs & Services → Library → search for "Google Calendar API")
|
|
33
|
-
4. Create **Desktop app** credentials (OAuth 2.0 Client IDs)
|
|
34
|
-
5. Add this URI as an authorized redirect:
|
|
35
|
-
```
|
|
36
|
-
http://127.0.0.1:9292/oauth2callback
|
|
37
|
-
```
|
|
38
|
-
6. Download the JSON file and save it as `~/.flycal/credentials.json`
|
|
39
|
-
|
|
40
|
-
## Commands
|
|
41
|
-
|
|
42
|
-
All commands support a per-invocation locale override:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
flycal search --locale it --in 7days
|
|
46
|
-
flycal slots --locale en --in "3 days" --duration 1h
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### login
|
|
50
|
-
|
|
51
|
-
Connect to your Google account. Opens a browser for OAuth authentication when not yet connected.
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
11
|
flycal login
|
|
55
12
|
```
|
|
56
13
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
### logout
|
|
60
|
-
|
|
61
|
-
Disconnect from your Google account and remove stored tokens.
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
flycal logout
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### update
|
|
68
|
-
|
|
69
|
-
Update `flycal-cli` to the latest published gem version.
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
flycal update
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### version
|
|
76
|
-
|
|
77
|
-
Show the current installed `flycal-cli` version.
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
flycal version
|
|
81
|
-
flycal --version
|
|
82
|
-
flycal -v
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### calendars
|
|
14
|
+
During the test phase the project already provides the Google API credentials.
|
|
15
|
+
Open the browser, approve access, done.
|
|
86
16
|
|
|
87
|
-
|
|
17
|
+
Optional but useful once:
|
|
88
18
|
|
|
89
19
|
```bash
|
|
90
|
-
flycal calendars
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
Example output:
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
Work user@example.com
|
|
97
|
-
Personal user@gmail.com
|
|
20
|
+
flycal config # set default calendar + calendars that block free slots
|
|
21
|
+
flycal calendars # list calendars (name + id)
|
|
98
22
|
```
|
|
99
23
|
|
|
100
|
-
|
|
24
|
+
## Common examples
|
|
101
25
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
flycal config
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
Options:
|
|
109
|
-
|
|
110
|
-
- `calendar_default` — choose the default calendar and save it to `~/.flycal/config.yml`
|
|
111
|
-
- `exclude_calendars` — multi-select one or more calendars whose events block free slots (default selection includes the current default calendar)
|
|
112
|
-
- `edit config` — open `~/.flycal/config.yml` with `$EDITOR` (or `vi`)
|
|
113
|
-
|
|
114
|
-
Press Ctrl+C during configuration to cancel without error (`config cancelled...`).
|
|
115
|
-
|
|
116
|
-
The default calendar is used by the search command when no calendar is specified.
|
|
117
|
-
|
|
118
|
-
### search
|
|
119
|
-
|
|
120
|
-
Search for events in your calendar(s). Supports flexible date ranges and text filtering.
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
flycal search
|
|
124
|
-
flycal search --in 30days --description placeholder
|
|
125
|
-
flycal search -f 2025-03-01 -t 2025-03-31 -c "Work"
|
|
126
|
-
flycal search -i 2months -d placeholder
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Options:**
|
|
130
|
-
|
|
131
|
-
- `--from` / `-f` — Start date/time. Default: midnight of current day. Formats: `YYYY-MM-DD`, locale forms (`DD-MM-YYYY` for `it`, `MM-DD-YYYY` for `en`, `/` or `-`), or with time `YYYY-MM-DDTHH:MM`
|
|
132
|
-
- `--to` / `-t` — End date/time. Default: 23:59 of the 30th day from today. Same formats as `--from`
|
|
133
|
-
- `--in` / `-i` — Duration from `--from`, overrides `--to`. Format: `30days`, `48hours`, `2months`, `1year` (no space). With space use quotes: `--in "30 days"`
|
|
134
|
-
- `--calendar` / `-c` — Calendar name or ID. Default: calendar set via `flycal config`
|
|
135
|
-
- `--description` / `-d` — Filter events by text. Matches events where the string appears in title or description (case-insensitive, contains)
|
|
136
|
-
|
|
137
|
-
**Time range behavior:**
|
|
138
|
-
|
|
139
|
-
- If neither `--from` nor `--to` is given: searches from today at midnight to 23:59 of the 30th day from today
|
|
140
|
-
- If `--in` is given: `--to` is ignored; the end time is computed from `--from` plus the duration
|
|
141
|
-
- Examples: `--in 30days`, `--in 48hours`, `--in 1months`, `--in 1year`
|
|
142
|
-
|
|
143
|
-
**Output:**
|
|
144
|
-
|
|
145
|
-
Each event is printed as: `Calendar | Start | End | Title`
|
|
146
|
-
|
|
147
|
-
The summary shows:
|
|
148
|
-
- From and To dates used
|
|
149
|
-
- Number of events found
|
|
150
|
-
- Total time occupied (hours, minutes, and working days based on 8-hour days)
|
|
151
|
-
|
|
152
|
-
For time frames longer than 7 days, a weekly breakdown is added (week number, start/end dates, hours, working days per week). For time frames longer than 30 days, a monthly breakdown is shown instead (month number, month name, hours, working days per month).
|
|
153
|
-
|
|
154
|
-
### slots
|
|
155
|
-
|
|
156
|
-
Find free time slots in your calendar. Output is a simple list for copy/paste into email or other tools.
|
|
26
|
+
**Find free slots (most useful day-to-day)**
|
|
157
27
|
|
|
158
28
|
```bash
|
|
159
29
|
flycal slots
|
|
30
|
+
flycal slots --in "5 days"
|
|
160
31
|
flycal slots --from monday --in "5 days"
|
|
161
|
-
flycal slots --from "next monday" --in "
|
|
162
|
-
flycal slots --from lunedi --in "5 days" --locale it
|
|
32
|
+
flycal slots --from "next monday" --in "2 weeks" --duration 1h
|
|
163
33
|
flycal slots --in "12 days" --template dinner
|
|
34
|
+
flycal slots --locale it --from lunedi --in "5 days"
|
|
164
35
|
```
|
|
165
36
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
- `--duration` — Slot length. Default: `slots.defaults.default_duration` in config (`45min`). Examples: `1h`, `30 minutes`
|
|
169
|
-
- `--from` / `-f` — Start date/time. Default: `slots.defaults.from` in config (`now`). Accepts:
|
|
170
|
-
- absolute: `YYYY-MM-DD`, locale dates (`DD-MM-YYYY` / `MM-DD-YYYY`), optional time
|
|
171
|
-
- relative: `now`, `today`/`oggi`, `tomorrow`/`domani`, `monday`/`lunedi`, `next monday`/`prossimo lunedi`, `last friday`/`scorso venerdi`
|
|
172
|
-
- `--in` / `-i` — Search window from `--from`. Default: `1 week`.
|
|
173
|
-
- `--template` / `-T` — Template from `slots.templates` in config. Default: first template (`work`)
|
|
174
|
-
- `--calendar` / `-c` — Calendar name or ID used as fallback when `exclude_calendars` is not configured
|
|
175
|
-
|
|
176
|
-
**Output:**
|
|
37
|
+
Output is a short header plus a clean list ready to paste (and copied to the clipboard when `pbcopy` / `clip` / `wl-copy` / `xclip` is available):
|
|
177
38
|
|
|
178
39
|
```
|
|
179
40
|
found 6 slots
|
|
180
41
|
from sat 1 August 2026 to sat 8 August 2026
|
|
181
42
|
with duration 45min, template dinner
|
|
182
43
|
considering calendars
|
|
183
|
-
-
|
|
184
|
-
-
|
|
185
|
-
- antoniomolinari1977@gmail.com
|
|
44
|
+
- Work
|
|
45
|
+
- Personal
|
|
186
46
|
link: https://calendar.google.com/calendar/r/day/2026/8/1
|
|
187
47
|
|
|
188
48
|
saturday 1/8
|
|
@@ -192,9 +52,31 @@ monday 3/8
|
|
|
192
52
|
19 - 23
|
|
193
53
|
```
|
|
194
54
|
|
|
195
|
-
|
|
55
|
+
**Search events**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
flycal search
|
|
59
|
+
flycal search --in 30days
|
|
60
|
+
flycal search --in 30days --description meeting
|
|
61
|
+
flycal search --from 2026-08-01 --to 2026-08-31 -c Work
|
|
62
|
+
flycal search --from monday --in "2 weeks" --locale it
|
|
63
|
+
```
|
|
196
64
|
|
|
197
|
-
|
|
65
|
+
**Other commands**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
flycal version
|
|
69
|
+
flycal update
|
|
70
|
+
flycal logout
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
All commands accept `--locale en|it`.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Configuration (`~/.flycal/config.yml`)
|
|
78
|
+
|
|
79
|
+
Defaults are created automatically on first run. Edit with `flycal config` → `edit config`, or by hand.
|
|
198
80
|
|
|
199
81
|
```yaml
|
|
200
82
|
calendar_default: ~
|
|
@@ -202,27 +84,15 @@ locale: en
|
|
|
202
84
|
slots:
|
|
203
85
|
templates:
|
|
204
86
|
work:
|
|
205
|
-
days:
|
|
206
|
-
- 1
|
|
207
|
-
- 2
|
|
208
|
-
- 3
|
|
209
|
-
- 4
|
|
210
|
-
- 5
|
|
87
|
+
days: [1, 2, 3, 4, 5] # 1=Mon … 7=Sun
|
|
211
88
|
hours:
|
|
212
89
|
- 9:30-13:00
|
|
213
90
|
- 14:00-18:30
|
|
214
91
|
dinner:
|
|
215
|
-
days:
|
|
216
|
-
- 1
|
|
217
|
-
- 2
|
|
218
|
-
- 3
|
|
219
|
-
- 4
|
|
220
|
-
- 5
|
|
221
|
-
- 6
|
|
222
|
-
- 7
|
|
92
|
+
days: [1, 2, 3, 4, 5, 6, 7]
|
|
223
93
|
hours:
|
|
224
94
|
- 19-23
|
|
225
|
-
exclude_calendars: []
|
|
95
|
+
exclude_calendars: [] # calendars whose events block free slots
|
|
226
96
|
defaults:
|
|
227
97
|
from: now
|
|
228
98
|
default_duration: 45min
|
|
@@ -230,80 +100,81 @@ slots:
|
|
|
230
100
|
free_after: 15m
|
|
231
101
|
```
|
|
232
102
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
- `free_before` — buffer before each slot
|
|
242
|
-
- `free_after` — buffer after each slot; gaps must fit `duration + free_after`, output shows continuous free ranges
|
|
243
|
-
- `exclude_calendars` — calendars whose events block free slots; if empty, `calendar_default` is used
|
|
244
|
-
- `locale` supports `en` and `it` (default is `en`)
|
|
103
|
+
| Key | Meaning |
|
|
104
|
+
|---|---|
|
|
105
|
+
| `calendar_default` | Default calendar (`~` = unset) |
|
|
106
|
+
| `locale` | `en` or `it` |
|
|
107
|
+
| `slots.templates` | Named schedules; `flycal slots` uses the first one unless `--template` is set |
|
|
108
|
+
| `slots.exclude_calendars` | Events here block free slots (fallback: `calendar_default`) |
|
|
109
|
+
| `slots.defaults.*` | Defaults for `--from` / `--duration` |
|
|
110
|
+
| `slots.free_before` / `free_after` | Buffers around busy events |
|
|
245
111
|
|
|
246
|
-
|
|
112
|
+
Interactive helpers:
|
|
247
113
|
|
|
114
|
+
```bash
|
|
115
|
+
flycal config
|
|
248
116
|
```
|
|
249
|
-
friday 15/7
|
|
250
|
-
10 - 12
|
|
251
|
-
13 - 15.30
|
|
252
117
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
```
|
|
118
|
+
- `calendar_default` — pick the default calendar
|
|
119
|
+
- `exclude_calendars` — multi-select calendars that block slots
|
|
120
|
+
- `edit config` — open the YAML in `$EDITOR`
|
|
257
121
|
|
|
258
|
-
|
|
122
|
+
---
|
|
259
123
|
|
|
260
|
-
|
|
124
|
+
## Parameters (reference)
|
|
261
125
|
|
|
262
|
-
|
|
263
|
-
|:-----|---------|
|
|
264
|
-
| `config.yml` | Default calendar ID and other settings |
|
|
265
|
-
| `credentials.json` | OAuth credentials (created manually from Google Cloud Console) |
|
|
266
|
-
| `tokens.yml` | Access tokens (managed automatically) |
|
|
126
|
+
### `flycal slots`
|
|
267
127
|
|
|
268
|
-
|
|
128
|
+
| Option | Default | Notes |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| `--duration` | `45min` | Min free range length (`1h`, `90min`, …) |
|
|
131
|
+
| `--from` / `-f` | `now` | Absolute date or relative: `monday`, `next monday`, `tomorrow`, `lunedi`, … |
|
|
132
|
+
| `--in` / `-i` | `1 week` | Window from `--from` (`"5 days"`, `2weeks`, …) |
|
|
133
|
+
| `--template` / `-T` | first template (`work`) | e.g. `dinner` |
|
|
134
|
+
| `--calendar` / `-c` | — | Fallback if `exclude_calendars` is empty |
|
|
135
|
+
| `--locale` | config / `en` | `en` or `it` |
|
|
269
136
|
|
|
270
|
-
###
|
|
137
|
+
### `flycal search`
|
|
271
138
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
139
|
+
| Option | Default | Notes |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| `--from` / `-f` | today midnight | Absolute or relative date |
|
|
142
|
+
| `--to` / `-t` | +30 days | Ignored if `--in` is set |
|
|
143
|
+
| `--in` / `-i` | — | Duration from `--from` |
|
|
144
|
+
| `--description` / `-d` | — | Contains filter on title/description |
|
|
145
|
+
| `--calendar` / `-c` | `calendar_default` | Name or ID |
|
|
146
|
+
| `--locale` | config / `en` | `en` or `it` |
|
|
275
147
|
|
|
276
|
-
|
|
277
|
-
gem build flycal-cli.gemspec
|
|
278
|
-
gem push flycal-cli-0.1.0.gem
|
|
279
|
-
```
|
|
148
|
+
Relative dates work in English and Italian: `today`/`oggi`, `tomorrow`/`domani`, `monday`/`lunedi`, `next monday`/`prossimo lunedi`, `last friday`/`scorso venerdi`.
|
|
280
149
|
|
|
281
|
-
|
|
150
|
+
---
|
|
282
151
|
|
|
283
|
-
|
|
284
|
-
2. Build and push:
|
|
152
|
+
## Optional: your own Google Cloud credentials
|
|
285
153
|
|
|
286
|
-
|
|
287
|
-
gem build flycal-cli.gemspec
|
|
288
|
-
gem push flycal-cli-X.Y.Z.gem
|
|
289
|
-
```
|
|
154
|
+
**Not needed** for the default test API — `flycal login` is enough.
|
|
290
155
|
|
|
291
|
-
|
|
156
|
+
Use this only if you want flycal to talk to **your own** Google Cloud OAuth client instead of the project-provided test credentials.
|
|
292
157
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
158
|
+
1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials)
|
|
159
|
+
2. Enable **Google Calendar API**
|
|
160
|
+
3. Create **Desktop app** OAuth credentials
|
|
161
|
+
4. Authorized redirect URI: `http://127.0.0.1:9292/oauth2callback`
|
|
162
|
+
5. Save the JSON as `~/.flycal/credentials.json`
|
|
163
|
+
6. Run `flycal login`
|
|
297
164
|
|
|
298
|
-
|
|
165
|
+
You can also ask a teammate who manages the Cloud project to share that JSON with you.
|
|
299
166
|
|
|
300
|
-
|
|
167
|
+
---
|
|
301
168
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
169
|
+
## Files
|
|
170
|
+
|
|
171
|
+
| Path | Purpose |
|
|
172
|
+
|---|---|
|
|
173
|
+
| `~/.flycal/config.yml` | Settings (calendars, templates, locale, …) |
|
|
174
|
+
| `~/.flycal/credentials.json` | Own OAuth client (optional) |
|
|
175
|
+
| `~/.flycal/tokens.yml` | Login tokens (managed automatically) |
|
|
305
176
|
|
|
306
|
-
|
|
177
|
+
MCP catalog for agents: [`mcp/tools.json`](mcp/tools.json)
|
|
307
178
|
|
|
308
179
|
## License
|
|
309
180
|
|
data/lib/flycal_cli/version.rb
CHANGED
data/mcp/README.md
CHANGED
|
@@ -1,29 +1,68 @@
|
|
|
1
1
|
# flycal MCP catalog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Machine-readable description of **flycal-cli** for MCP servers.
|
|
4
4
|
|
|
5
5
|
## File
|
|
6
6
|
|
|
7
|
-
- [`tools.json`](./tools.json) —
|
|
7
|
+
- [`tools.json`](./tools.json) — full catalog:
|
|
8
|
+
- `global_options` / `shared_formats` — shared `--locale`, date and duration formats
|
|
9
|
+
- `config.keys` — `~/.flycal/config.yml` keys used by the CLI
|
|
10
|
+
- `tools[].parameters` — human-readable parameter docs (cli flags, defaults, examples)
|
|
11
|
+
- `tools[].inputSchema` — JSON Schema for MCP tool registration
|
|
12
|
+
- `command.option_map` — how to build argv from tool arguments
|
|
8
13
|
|
|
9
14
|
## How an MCP server can use it
|
|
10
15
|
|
|
11
16
|
1. Load `tools.json` at startup.
|
|
12
|
-
2. Register each entry in `tools` with your MCP SDK
|
|
13
|
-
3. On tool call, build
|
|
17
|
+
2. Register each entry in `tools` with your MCP SDK using `name`, `description`, and `inputSchema`.
|
|
18
|
+
3. On tool call, build argv:
|
|
14
19
|
- static tools → `command.argv`
|
|
15
|
-
- parameterized tools → start from `command.argv_template`, then
|
|
20
|
+
- parameterized tools → start from `command.argv_template`, then for each provided arg append `command.option_map[arg]`
|
|
16
21
|
- if `locale` is set → append `--locale <value>`
|
|
17
|
-
4. Run `flycal` as a subprocess and return stdout as text
|
|
18
|
-
5. Skip
|
|
22
|
+
4. Run `flycal` as a subprocess and return stdout as text.
|
|
23
|
+
5. Skip tools with `"interactive": true` (`flycal_login`, `flycal_config`) unless a TTY is available.
|
|
24
|
+
|
|
25
|
+
## Parameters cheat sheet
|
|
26
|
+
|
|
27
|
+
### Global
|
|
28
|
+
|
|
29
|
+
| Param | CLI | Values |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `locale` | `--locale` | `en`, `it` |
|
|
32
|
+
|
|
33
|
+
### `flycal_search`
|
|
34
|
+
|
|
35
|
+
| Param | CLI | Default | Notes |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| `calendar` | `--calendar` / `-c` | `calendar_default` | name or ID |
|
|
38
|
+
| `from` | `--from` / `-f` | today midnight | absolute or relative date |
|
|
39
|
+
| `to` | `--to` / `-t` | +30 days 23:59 | ignored if `in` set |
|
|
40
|
+
| `in` | `--in` / `-i` | — | duration from `from`, overrides `to` |
|
|
41
|
+
| `description` | `--description` / `-d` | — | contains filter |
|
|
42
|
+
| `locale` | `--locale` | config/`en` | |
|
|
43
|
+
|
|
44
|
+
### `flycal_slots`
|
|
45
|
+
|
|
46
|
+
| Param | CLI | Default | Notes |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `duration` | `--duration` | `45min` (config) | min free-range length |
|
|
49
|
+
| `from` | `--from` / `-f` | `now` (config) | absolute or relative (`monday`, `next monday`, …) |
|
|
50
|
+
| `in` | `--in` / `-i` | `1 week` | window from `--from` |
|
|
51
|
+
| `template` | `--template` / `-T` | first template (`work`) | from `slots.templates` |
|
|
52
|
+
| `calendar` | `--calendar` / `-c` | — | fallback if `exclude_calendars` empty |
|
|
53
|
+
| `locale` | `--locale` | config/`en` | |
|
|
54
|
+
|
|
55
|
+
### Relative `--from` examples
|
|
56
|
+
|
|
57
|
+
`now`, `today`/`oggi`, `tomorrow`/`domani`, `monday`/`lunedi`, `next monday`/`prossimo lunedi`, `last friday`/`scorso venerdi`
|
|
19
58
|
|
|
20
59
|
## Suggested tools to expose
|
|
21
60
|
|
|
22
61
|
| MCP tool | CLI | Notes |
|
|
23
62
|
|---|---|---|
|
|
24
63
|
| `flycal_search` | `flycal search ...` | Primary read tool |
|
|
25
|
-
| `flycal_slots` | `flycal slots
|
|
64
|
+
| `flycal_slots` | `flycal slots ...` | Free slots |
|
|
26
65
|
| `flycal_calendars` | `flycal calendars` | List name + id |
|
|
27
66
|
| `flycal_version` | `flycal version` | Health / version check |
|
|
28
67
|
|
|
29
|
-
Interactive / side-effect tools (`login`, `logout`, `config`, `update`) are documented
|
|
68
|
+
Interactive / side-effect tools (`login`, `logout`, `config`, `update`) are documented but usually better left to a user terminal.
|
data/mcp/tools.json
CHANGED
|
@@ -2,52 +2,140 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"name": "flycal-cli",
|
|
4
4
|
"title": "flycal CLI MCP tools catalog",
|
|
5
|
-
"description": "Machine-readable catalog of flycal-cli commands for MCP servers. Each tool maps to a CLI invocation
|
|
6
|
-
"version": "0.
|
|
5
|
+
"description": "Machine-readable catalog of flycal-cli commands for MCP servers. Each tool maps to a CLI invocation. Non-interactive tools are safe to run from an MCP host; interactive tools require a TTY.",
|
|
6
|
+
"version": "0.7.3",
|
|
7
7
|
"binary": "flycal",
|
|
8
8
|
"homepage": "https://github.com/magnum/flycal-cli",
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
"read_only": true,
|
|
10
|
+
"global_options": {
|
|
11
|
+
"locale": {
|
|
12
|
+
"cli": ["--locale"],
|
|
13
|
+
"type": "string",
|
|
14
|
+
"enum": ["en", "it"],
|
|
15
|
+
"default": "en",
|
|
16
|
+
"config_key": "locale",
|
|
17
|
+
"description": "Override UI locale for this invocation only. Falls back to config locale, then en."
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"shared_formats": {
|
|
21
|
+
"absolute_date": {
|
|
22
|
+
"description": "Absolute calendar date/time",
|
|
23
|
+
"examples": [
|
|
24
|
+
"2026-08-01",
|
|
25
|
+
"2026/08/01",
|
|
26
|
+
"2026-08-01T14:30",
|
|
27
|
+
"01-08-2026 (locale it)",
|
|
28
|
+
"08-01-2026 (locale en)",
|
|
29
|
+
"01/08/2026 09:00"
|
|
30
|
+
],
|
|
31
|
+
"notes": [
|
|
32
|
+
"YYYY-MM-DD and YYYY/MM/DD always accepted",
|
|
33
|
+
"locale it also accepts DD-MM-YYYY / DD/MM/YYYY",
|
|
34
|
+
"locale en also accepts MM-DD-YYYY / MM/DD/YYYY",
|
|
35
|
+
"optional time: THH:MM or space + HH:MM(:SS)"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"relative_date": {
|
|
39
|
+
"description": "Relative start expressions (en + it)",
|
|
40
|
+
"examples": [
|
|
41
|
+
"now",
|
|
42
|
+
"today",
|
|
43
|
+
"oggi",
|
|
44
|
+
"tomorrow",
|
|
45
|
+
"domani",
|
|
46
|
+
"yesterday",
|
|
47
|
+
"ieri",
|
|
48
|
+
"monday",
|
|
49
|
+
"lunedi",
|
|
50
|
+
"next monday",
|
|
51
|
+
"prossimo lunedi",
|
|
52
|
+
"last friday",
|
|
53
|
+
"scorso venerdi"
|
|
54
|
+
],
|
|
55
|
+
"notes": [
|
|
56
|
+
"bare weekday = next occurrence including today if it matches",
|
|
57
|
+
"next/prossimo = next occurrence excluding today",
|
|
58
|
+
"last/scorso = previous occurrence excluding today"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"duration": {
|
|
62
|
+
"description": "Duration / window length",
|
|
63
|
+
"examples": [
|
|
64
|
+
"45min",
|
|
65
|
+
"1h",
|
|
66
|
+
"90min",
|
|
67
|
+
"3 days",
|
|
68
|
+
"5days",
|
|
69
|
+
"1 week",
|
|
70
|
+
"1week",
|
|
71
|
+
"48 hours",
|
|
72
|
+
"2 months",
|
|
73
|
+
"1 year"
|
|
74
|
+
],
|
|
75
|
+
"notes": [
|
|
76
|
+
"quote values that contain spaces",
|
|
77
|
+
"no-space forms also work (30days, 48hours)"
|
|
78
|
+
]
|
|
79
|
+
}
|
|
14
80
|
},
|
|
15
81
|
"config": {
|
|
16
82
|
"path": "~/.flycal/config.yml",
|
|
17
83
|
"credentials_path": "~/.flycal/credentials.json",
|
|
84
|
+
"tokens_path": "~/.flycal/tokens.yml",
|
|
85
|
+
"credentials_note": "Default/test phase: project-provided API credentials — just run flycal login. Creating your own Google Cloud Console OAuth client is optional and only needed if you want to use your own API project; save that JSON as ~/.flycal/credentials.json then run flycal login.",
|
|
18
86
|
"keys": {
|
|
19
87
|
"calendar_default": {
|
|
20
88
|
"type": ["string", "null"],
|
|
21
|
-
"
|
|
89
|
+
"cli_related": ["flycal_config", "flycal_search.calendar", "flycal_slots.calendar"],
|
|
90
|
+
"description": "Default Google Calendar ID. YAML null (~) means unset."
|
|
22
91
|
},
|
|
23
92
|
"locale": {
|
|
24
93
|
"type": "string",
|
|
25
94
|
"enum": ["en", "it"],
|
|
95
|
+
"default": "en",
|
|
26
96
|
"description": "Default CLI locale"
|
|
27
97
|
},
|
|
28
98
|
"slots.templates": {
|
|
29
99
|
"type": "object",
|
|
30
|
-
"description": "Named
|
|
100
|
+
"description": "Named day/hour schedules for flycal slots. Default used = first key (usually work).",
|
|
101
|
+
"item_shape": {
|
|
102
|
+
"days": {
|
|
103
|
+
"type": "array",
|
|
104
|
+
"items": { "type": "integer", "minimum": 1, "maximum": 7 },
|
|
105
|
+
"description": "1=Monday ... 7=Sunday"
|
|
106
|
+
},
|
|
107
|
+
"hours": {
|
|
108
|
+
"type": "array",
|
|
109
|
+
"items": { "type": "string" },
|
|
110
|
+
"description": "Ranges like 9:30-13:00 or 19-23"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"default_templates": ["work", "dinner"]
|
|
31
114
|
},
|
|
32
115
|
"slots.defaults.from": {
|
|
33
116
|
"type": "string",
|
|
34
|
-
"
|
|
117
|
+
"default": "now",
|
|
118
|
+
"description": "Default value for slots --from when omitted"
|
|
35
119
|
},
|
|
36
120
|
"slots.defaults.default_duration": {
|
|
37
121
|
"type": "string",
|
|
38
|
-
"
|
|
122
|
+
"default": "45min",
|
|
123
|
+
"description": "Default value for slots --duration when omitted"
|
|
39
124
|
},
|
|
40
125
|
"slots.free_before": {
|
|
41
126
|
"type": "string",
|
|
42
|
-
"
|
|
127
|
+
"default": "0m",
|
|
128
|
+
"description": "Busy buffer before each slot start"
|
|
43
129
|
},
|
|
44
130
|
"slots.free_after": {
|
|
45
131
|
"type": "string",
|
|
46
|
-
"
|
|
132
|
+
"default": "15m",
|
|
133
|
+
"description": "Busy buffer after each slot; free gaps must fit duration + free_after"
|
|
47
134
|
},
|
|
48
135
|
"slots.exclude_calendars": {
|
|
49
136
|
"type": "array",
|
|
50
137
|
"items": { "type": "string" },
|
|
138
|
+
"default": [],
|
|
51
139
|
"description": "Calendar IDs whose events block free slots. If empty, calendar_default is used."
|
|
52
140
|
}
|
|
53
141
|
}
|
|
@@ -55,20 +143,23 @@
|
|
|
55
143
|
"notes": [
|
|
56
144
|
"flycal is read-only against Google Calendar (no create/update/delete of events).",
|
|
57
145
|
"Auth uses OAuth desktop flow; tokens live under ~/.flycal/.",
|
|
58
|
-
"Prefer quoting
|
|
59
|
-
"
|
|
146
|
+
"Prefer quoting values with spaces (e.g. --in \"3 days\", --from \"next monday\").",
|
|
147
|
+
"slots copies the availability list (without header) to clipboard when pbcopy, wl-copy, xclip, or clip is available."
|
|
60
148
|
],
|
|
61
149
|
"tools": [
|
|
62
150
|
{
|
|
63
151
|
"name": "flycal_version",
|
|
64
152
|
"title": "Show flycal version",
|
|
65
|
-
"description": "Print the installed flycal-cli version.",
|
|
153
|
+
"description": "Print the installed flycal-cli version string (e.g. flycal 0.7.3).",
|
|
66
154
|
"interactive": false,
|
|
67
155
|
"requires_auth": false,
|
|
68
156
|
"command": {
|
|
69
157
|
"argv": ["flycal", "version"],
|
|
70
158
|
"alternatives": [["flycal", "--version"], ["flycal", "-v"]]
|
|
71
159
|
},
|
|
160
|
+
"parameters": {
|
|
161
|
+
"locale": { "$ref": "#/global_options/locale" }
|
|
162
|
+
},
|
|
72
163
|
"inputSchema": {
|
|
73
164
|
"type": "object",
|
|
74
165
|
"additionalProperties": false,
|
|
@@ -76,7 +167,7 @@
|
|
|
76
167
|
"locale": {
|
|
77
168
|
"type": "string",
|
|
78
169
|
"enum": ["en", "it"],
|
|
79
|
-
"description": "Optional locale override
|
|
170
|
+
"description": "Optional locale override (--locale)."
|
|
80
171
|
}
|
|
81
172
|
}
|
|
82
173
|
}
|
|
@@ -84,20 +175,30 @@
|
|
|
84
175
|
{
|
|
85
176
|
"name": "flycal_update",
|
|
86
177
|
"title": "Update flycal gem",
|
|
87
|
-
"description": "Run gem update flycal-cli to install the latest published version.",
|
|
178
|
+
"description": "Run `gem update flycal-cli` to install the latest published version.",
|
|
88
179
|
"interactive": false,
|
|
89
180
|
"requires_auth": false,
|
|
90
181
|
"side_effects": ["updates_local_gem"],
|
|
91
182
|
"command": {
|
|
92
183
|
"argv": ["flycal", "update"]
|
|
93
184
|
},
|
|
185
|
+
"parameters": {
|
|
186
|
+
"locale": {
|
|
187
|
+
"cli": ["--locale"],
|
|
188
|
+
"type": "string",
|
|
189
|
+
"enum": ["en", "it"],
|
|
190
|
+
"required": false,
|
|
191
|
+
"description": "Optional locale override."
|
|
192
|
+
}
|
|
193
|
+
},
|
|
94
194
|
"inputSchema": {
|
|
95
195
|
"type": "object",
|
|
96
196
|
"additionalProperties": false,
|
|
97
197
|
"properties": {
|
|
98
198
|
"locale": {
|
|
99
199
|
"type": "string",
|
|
100
|
-
"enum": ["en", "it"]
|
|
200
|
+
"enum": ["en", "it"],
|
|
201
|
+
"description": "Optional locale override (--locale)."
|
|
101
202
|
}
|
|
102
203
|
}
|
|
103
204
|
}
|
|
@@ -105,20 +206,30 @@
|
|
|
105
206
|
{
|
|
106
207
|
"name": "flycal_login",
|
|
107
208
|
"title": "Connect Google account",
|
|
108
|
-
"description": "Start OAuth browser login
|
|
209
|
+
"description": "Start OAuth browser login. Requires ~/.flycal/credentials.json and a browser/TTY. Interactive.",
|
|
109
210
|
"interactive": true,
|
|
110
211
|
"requires_auth": false,
|
|
111
212
|
"side_effects": ["writes_tokens"],
|
|
112
213
|
"command": {
|
|
113
214
|
"argv": ["flycal", "login"]
|
|
114
215
|
},
|
|
216
|
+
"parameters": {
|
|
217
|
+
"locale": {
|
|
218
|
+
"cli": ["--locale"],
|
|
219
|
+
"type": "string",
|
|
220
|
+
"enum": ["en", "it"],
|
|
221
|
+
"required": false,
|
|
222
|
+
"description": "Optional locale override."
|
|
223
|
+
}
|
|
224
|
+
},
|
|
115
225
|
"inputSchema": {
|
|
116
226
|
"type": "object",
|
|
117
227
|
"additionalProperties": false,
|
|
118
228
|
"properties": {
|
|
119
229
|
"locale": {
|
|
120
230
|
"type": "string",
|
|
121
|
-
"enum": ["en", "it"]
|
|
231
|
+
"enum": ["en", "it"],
|
|
232
|
+
"description": "Optional locale override (--locale)."
|
|
122
233
|
}
|
|
123
234
|
}
|
|
124
235
|
}
|
|
@@ -133,13 +244,23 @@
|
|
|
133
244
|
"command": {
|
|
134
245
|
"argv": ["flycal", "logout"]
|
|
135
246
|
},
|
|
247
|
+
"parameters": {
|
|
248
|
+
"locale": {
|
|
249
|
+
"cli": ["--locale"],
|
|
250
|
+
"type": "string",
|
|
251
|
+
"enum": ["en", "it"],
|
|
252
|
+
"required": false,
|
|
253
|
+
"description": "Optional locale override."
|
|
254
|
+
}
|
|
255
|
+
},
|
|
136
256
|
"inputSchema": {
|
|
137
257
|
"type": "object",
|
|
138
258
|
"additionalProperties": false,
|
|
139
259
|
"properties": {
|
|
140
260
|
"locale": {
|
|
141
261
|
"type": "string",
|
|
142
|
-
"enum": ["en", "it"]
|
|
262
|
+
"enum": ["en", "it"],
|
|
263
|
+
"description": "Optional locale override (--locale)."
|
|
143
264
|
}
|
|
144
265
|
}
|
|
145
266
|
}
|
|
@@ -147,15 +268,24 @@
|
|
|
147
268
|
{
|
|
148
269
|
"name": "flycal_calendars",
|
|
149
270
|
"title": "List calendars",
|
|
150
|
-
"description": "List available Google calendars as lines of \"name id\".
|
|
271
|
+
"description": "List available Google calendars as lines of \"name id\". Read-only; does not change config.",
|
|
151
272
|
"interactive": false,
|
|
152
273
|
"requires_auth": true,
|
|
153
274
|
"command": {
|
|
154
275
|
"argv": ["flycal", "calendars"]
|
|
155
276
|
},
|
|
277
|
+
"parameters": {
|
|
278
|
+
"locale": {
|
|
279
|
+
"cli": ["--locale"],
|
|
280
|
+
"type": "string",
|
|
281
|
+
"enum": ["en", "it"],
|
|
282
|
+
"required": false,
|
|
283
|
+
"description": "Optional locale override."
|
|
284
|
+
}
|
|
285
|
+
},
|
|
156
286
|
"output": {
|
|
157
287
|
"format": "text/lines",
|
|
158
|
-
"example": "Work
|
|
288
|
+
"example": "Work work@example.com\nPersonal personal@example.com"
|
|
159
289
|
},
|
|
160
290
|
"inputSchema": {
|
|
161
291
|
"type": "object",
|
|
@@ -163,7 +293,8 @@
|
|
|
163
293
|
"properties": {
|
|
164
294
|
"locale": {
|
|
165
295
|
"type": "string",
|
|
166
|
-
"enum": ["en", "it"]
|
|
296
|
+
"enum": ["en", "it"],
|
|
297
|
+
"description": "Optional locale override (--locale)."
|
|
167
298
|
}
|
|
168
299
|
}
|
|
169
300
|
}
|
|
@@ -171,7 +302,7 @@
|
|
|
171
302
|
{
|
|
172
303
|
"name": "flycal_config",
|
|
173
304
|
"title": "Configure flycal (interactive)",
|
|
174
|
-
"description": "Interactive configuration menu.
|
|
305
|
+
"description": "Interactive configuration menu. Prefer editing ~/.flycal/config.yml from MCP hosts unless a TTY is available.",
|
|
175
306
|
"interactive": true,
|
|
176
307
|
"requires_auth": true,
|
|
177
308
|
"side_effects": ["writes_config"],
|
|
@@ -179,17 +310,36 @@
|
|
|
179
310
|
"argv": ["flycal", "config"]
|
|
180
311
|
},
|
|
181
312
|
"menu_options": [
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
313
|
+
{
|
|
314
|
+
"id": "calendar_default",
|
|
315
|
+
"description": "Single-select default calendar; saved as calendar_default"
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"id": "exclude_calendars",
|
|
319
|
+
"description": "Multi-select calendars whose events block slots; saved as slots.exclude_calendars (min 1)"
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"id": "edit config",
|
|
323
|
+
"description": "Open ~/.flycal/config.yml with $EDITOR or vi"
|
|
324
|
+
}
|
|
185
325
|
],
|
|
326
|
+
"parameters": {
|
|
327
|
+
"locale": {
|
|
328
|
+
"cli": ["--locale"],
|
|
329
|
+
"type": "string",
|
|
330
|
+
"enum": ["en", "it"],
|
|
331
|
+
"required": false,
|
|
332
|
+
"description": "Optional locale override."
|
|
333
|
+
}
|
|
334
|
+
},
|
|
186
335
|
"inputSchema": {
|
|
187
336
|
"type": "object",
|
|
188
337
|
"additionalProperties": false,
|
|
189
338
|
"properties": {
|
|
190
339
|
"locale": {
|
|
191
340
|
"type": "string",
|
|
192
|
-
"enum": ["en", "it"]
|
|
341
|
+
"enum": ["en", "it"],
|
|
342
|
+
"description": "Optional locale override (--locale)."
|
|
193
343
|
}
|
|
194
344
|
}
|
|
195
345
|
}
|
|
@@ -197,7 +347,7 @@
|
|
|
197
347
|
{
|
|
198
348
|
"name": "flycal_search",
|
|
199
349
|
"title": "Search calendar events",
|
|
200
|
-
"description": "Search Google Calendar events. Prints one line per event (Calendar | Start | End | Title) plus a summary with total occupied time
|
|
350
|
+
"description": "Search Google Calendar events. Prints one line per event (Calendar | Start | End | Title) plus a summary with total occupied time (hours/minutes and 8-hour working days). Ranges >7 days add weekly breakdown; >30 days monthly. Read-only.",
|
|
201
351
|
"interactive": false,
|
|
202
352
|
"requires_auth": true,
|
|
203
353
|
"command": {
|
|
@@ -214,36 +364,82 @@
|
|
|
214
364
|
["flycal", "search"],
|
|
215
365
|
["flycal", "search", "--in", "30days", "--description", "placeholder"],
|
|
216
366
|
["flycal", "search", "-f", "2025-03-01", "-t", "2025-03-31", "-c", "Work"],
|
|
217
|
-
["flycal", "search", "--
|
|
367
|
+
["flycal", "search", "--from", "monday", "--in", "2 weeks", "--locale", "it"]
|
|
218
368
|
]
|
|
219
369
|
},
|
|
370
|
+
"parameters": {
|
|
371
|
+
"calendar": {
|
|
372
|
+
"cli": ["--calendar", "-c"],
|
|
373
|
+
"type": "string",
|
|
374
|
+
"required": false,
|
|
375
|
+
"default": "config.calendar_default (or primary)",
|
|
376
|
+
"description": "Calendar name or ID to search."
|
|
377
|
+
},
|
|
378
|
+
"from": {
|
|
379
|
+
"cli": ["--from", "-f"],
|
|
380
|
+
"type": "string",
|
|
381
|
+
"required": false,
|
|
382
|
+
"default": "today midnight",
|
|
383
|
+
"description": "Range start. Absolute or relative date/time.",
|
|
384
|
+
"formats": ["absolute_date", "relative_date"]
|
|
385
|
+
},
|
|
386
|
+
"to": {
|
|
387
|
+
"cli": ["--to", "-t"],
|
|
388
|
+
"type": "string",
|
|
389
|
+
"required": false,
|
|
390
|
+
"default": "23:59 of day 30 from today",
|
|
391
|
+
"description": "Range end. Ignored when `in` is set.",
|
|
392
|
+
"formats": ["absolute_date", "relative_date"]
|
|
393
|
+
},
|
|
394
|
+
"in": {
|
|
395
|
+
"cli": ["--in", "-i"],
|
|
396
|
+
"type": "string",
|
|
397
|
+
"required": false,
|
|
398
|
+
"description": "Duration from `from`; overrides `to`.",
|
|
399
|
+
"formats": ["duration"]
|
|
400
|
+
},
|
|
401
|
+
"description": {
|
|
402
|
+
"cli": ["--description", "-d"],
|
|
403
|
+
"type": "string",
|
|
404
|
+
"required": false,
|
|
405
|
+
"description": "Case-insensitive contains filter on event summary or description."
|
|
406
|
+
},
|
|
407
|
+
"locale": {
|
|
408
|
+
"cli": ["--locale"],
|
|
409
|
+
"type": "string",
|
|
410
|
+
"enum": ["en", "it"],
|
|
411
|
+
"required": false,
|
|
412
|
+
"description": "Optional locale override."
|
|
413
|
+
}
|
|
414
|
+
},
|
|
220
415
|
"inputSchema": {
|
|
221
416
|
"type": "object",
|
|
222
417
|
"additionalProperties": false,
|
|
223
418
|
"properties": {
|
|
224
419
|
"calendar": {
|
|
225
420
|
"type": "string",
|
|
226
|
-
"description": "Calendar name or ID. Default: calendar_default from config."
|
|
421
|
+
"description": "--calendar / -c. Calendar name or ID. Default: calendar_default from config."
|
|
227
422
|
},
|
|
228
423
|
"from": {
|
|
229
424
|
"type": "string",
|
|
230
|
-
"description": "Start datetime. Default: today midnight.
|
|
425
|
+
"description": "--from / -f. Start datetime. Default: today midnight. Absolute (YYYY-MM-DD, locale dates) or relative (monday, tomorrow, next monday, lunedi, …)."
|
|
231
426
|
},
|
|
232
427
|
"to": {
|
|
233
428
|
"type": "string",
|
|
234
|
-
"description": "End datetime. Default: 23:59 of day 30 from today. Ignored when `in` is set."
|
|
429
|
+
"description": "--to / -t. End datetime. Default: 23:59 of day 30 from today. Ignored when `in` is set. Same formats as from."
|
|
235
430
|
},
|
|
236
431
|
"in": {
|
|
237
432
|
"type": "string",
|
|
238
|
-
"description": "Duration from `from
|
|
433
|
+
"description": "--in / -i. Duration from `from`, overrides `to`. Examples: 30days, \"3 days\", 2months, 1week, 48hours."
|
|
239
434
|
},
|
|
240
435
|
"description": {
|
|
241
436
|
"type": "string",
|
|
242
|
-
"description": "Case-insensitive contains filter on event summary or description."
|
|
437
|
+
"description": "--description / -d. Case-insensitive contains filter on event summary or description."
|
|
243
438
|
},
|
|
244
439
|
"locale": {
|
|
245
440
|
"type": "string",
|
|
246
|
-
"enum": ["en", "it"]
|
|
441
|
+
"enum": ["en", "it"],
|
|
442
|
+
"description": "--locale. Optional locale override (en, it)."
|
|
247
443
|
}
|
|
248
444
|
}
|
|
249
445
|
}
|
|
@@ -251,7 +447,7 @@
|
|
|
251
447
|
{
|
|
252
448
|
"name": "flycal_slots",
|
|
253
449
|
"title": "Find free time slots",
|
|
254
|
-
"description": "Find free
|
|
450
|
+
"description": "Find continuous free ranges using a slots.templates schedule (days + hours). Default template = first key (usually work). Busy events come from slots.exclude_calendars (or calendar_default if empty). Respects free_before/free_after. Prints header + availability; copies availability list to clipboard when a clipboard tool exists.",
|
|
255
451
|
"interactive": false,
|
|
256
452
|
"requires_auth": true,
|
|
257
453
|
"command": {
|
|
@@ -268,13 +464,71 @@
|
|
|
268
464
|
"examples": [
|
|
269
465
|
["flycal", "slots"],
|
|
270
466
|
["flycal", "slots", "--in", "5 days"],
|
|
467
|
+
["flycal", "slots", "--from", "monday", "--in", "5 days", "--locale", "it"],
|
|
271
468
|
["flycal", "slots", "--in", "12 days", "--template", "dinner"],
|
|
272
|
-
["flycal", "slots", "--duration", "1h"]
|
|
469
|
+
["flycal", "slots", "--from", "next monday", "--duration", "1h", "--template", "work"]
|
|
273
470
|
]
|
|
274
471
|
},
|
|
472
|
+
"parameters": {
|
|
473
|
+
"duration": {
|
|
474
|
+
"cli": ["--duration"],
|
|
475
|
+
"type": "string",
|
|
476
|
+
"required": false,
|
|
477
|
+
"default": "config slots.defaults.default_duration (45min)",
|
|
478
|
+
"description": "Minimum free-range length to keep a slot.",
|
|
479
|
+
"formats": ["duration"],
|
|
480
|
+
"examples": ["45min", "1h", "90min"]
|
|
481
|
+
},
|
|
482
|
+
"from": {
|
|
483
|
+
"cli": ["--from", "-f"],
|
|
484
|
+
"type": "string",
|
|
485
|
+
"required": false,
|
|
486
|
+
"default": "config slots.defaults.from (now)",
|
|
487
|
+
"description": "Search window start. Absolute or relative date/time. If date-only is today, starts from now.",
|
|
488
|
+
"formats": ["absolute_date", "relative_date"],
|
|
489
|
+
"examples": ["now", "monday", "next monday", "lunedi", "2026-08-01"]
|
|
490
|
+
},
|
|
491
|
+
"in": {
|
|
492
|
+
"cli": ["--in", "-i"],
|
|
493
|
+
"type": "string",
|
|
494
|
+
"required": false,
|
|
495
|
+
"default": "1 week",
|
|
496
|
+
"description": "Search window length from --from.",
|
|
497
|
+
"formats": ["duration"],
|
|
498
|
+
"examples": ["5 days", "1 week", "12 days", "48 hours"]
|
|
499
|
+
},
|
|
500
|
+
"template": {
|
|
501
|
+
"cli": ["--template", "-T"],
|
|
502
|
+
"type": "string",
|
|
503
|
+
"required": false,
|
|
504
|
+
"default": "first key in slots.templates (usually work)",
|
|
505
|
+
"description": "Named schedule from config slots.templates (e.g. work, dinner).",
|
|
506
|
+
"examples": ["work", "dinner"]
|
|
507
|
+
},
|
|
508
|
+
"calendar": {
|
|
509
|
+
"cli": ["--calendar", "-c"],
|
|
510
|
+
"type": "string",
|
|
511
|
+
"required": false,
|
|
512
|
+
"default": null,
|
|
513
|
+
"description": "Fallback calendar name/ID only when slots.exclude_calendars is empty/unset."
|
|
514
|
+
},
|
|
515
|
+
"locale": {
|
|
516
|
+
"cli": ["--locale"],
|
|
517
|
+
"type": "string",
|
|
518
|
+
"enum": ["en", "it"],
|
|
519
|
+
"required": false,
|
|
520
|
+
"description": "Optional locale override."
|
|
521
|
+
}
|
|
522
|
+
},
|
|
275
523
|
"output": {
|
|
276
524
|
"format": "text/plain",
|
|
277
|
-
"
|
|
525
|
+
"includes": [
|
|
526
|
+
"count + from/to + duration + template",
|
|
527
|
+
"bullet list of considered calendars",
|
|
528
|
+
"link: Google Calendar day URL at --from",
|
|
529
|
+
"availability ranges grouped by day (copied to clipboard without header)"
|
|
530
|
+
],
|
|
531
|
+
"example": "found 6 slots\nfrom sat 1 August 2026 to sat 8 August 2026\nwith duration 45min, template dinner\nconsidering calendars\n- Work\n- Personal\nlink: https://calendar.google.com/calendar/r/day/2026/8/1\n\nsaturday 1/8\n19 - 23"
|
|
278
532
|
},
|
|
279
533
|
"inputSchema": {
|
|
280
534
|
"type": "object",
|
|
@@ -283,37 +537,38 @@
|
|
|
283
537
|
"properties": {
|
|
284
538
|
"duration": {
|
|
285
539
|
"type": "string",
|
|
286
|
-
"description": "Slot length. Default
|
|
540
|
+
"description": "--duration. Slot length. Optional. Default: slots.defaults.default_duration (45min). Examples: 45min, 1h, 90min."
|
|
287
541
|
},
|
|
288
542
|
"from": {
|
|
289
543
|
"type": "string",
|
|
290
|
-
"description": "
|
|
544
|
+
"description": "--from / -f. Window start. Optional. Default: slots.defaults.from (now). Absolute dates (YYYY-MM-DD, locale dates) or relative (now, today/oggi, tomorrow/domani, monday/lunedi, next monday/prossimo lunedi, last friday/scorso venerdi)."
|
|
291
545
|
},
|
|
292
546
|
"in": {
|
|
293
547
|
"type": "string",
|
|
294
|
-
"description": "
|
|
548
|
+
"description": "--in / -i. Window length from --from. Optional. Default: 1 week. Examples: \"5 days\", 1week, \"12 days\", 48hours."
|
|
295
549
|
},
|
|
296
550
|
"template": {
|
|
297
551
|
"type": "string",
|
|
298
|
-
"description": "Template name from slots.templates
|
|
552
|
+
"description": "--template / -T. Template name from slots.templates. Optional. Default: first template (usually work). Built-ins: work (Mon-Fri office hours), dinner (evening hours)."
|
|
299
553
|
},
|
|
300
554
|
"calendar": {
|
|
301
555
|
"type": "string",
|
|
302
|
-
"description": "Fallback calendar name/ID when exclude_calendars is
|
|
556
|
+
"description": "--calendar / -c. Fallback calendar name/ID when slots.exclude_calendars is empty."
|
|
303
557
|
},
|
|
304
558
|
"locale": {
|
|
305
559
|
"type": "string",
|
|
306
|
-
"enum": ["en", "it"]
|
|
560
|
+
"enum": ["en", "it"],
|
|
561
|
+
"description": "--locale. Optional locale override (en, it)."
|
|
307
562
|
}
|
|
308
563
|
}
|
|
309
564
|
}
|
|
310
565
|
}
|
|
311
566
|
],
|
|
312
567
|
"mcp_implementation_hints": {
|
|
313
|
-
"execution": "Spawn the flycal binary with argv from command.argv or build argv from option_map. Capture stdout/stderr and exit code. Return stdout as MCP text content.",
|
|
314
|
-
"
|
|
315
|
-
"
|
|
316
|
-
"
|
|
317
|
-
"tool_filter": "
|
|
568
|
+
"execution": "Spawn the flycal binary with argv from command.argv, or build argv from argv_template + option_map for each provided parameter. Capture stdout/stderr and exit code. Return stdout as MCP text content.",
|
|
569
|
+
"parameter_building": "For each non-null input property present in option_map, append the mapped flag and value. Quote values with spaces. Always append --locale when locale is set.",
|
|
570
|
+
"interactive_tools": "Do not auto-run tools with interactive=true unless the host provides a TTY. Tell the user to run them in a terminal.",
|
|
571
|
+
"auth_errors": "If output indicates the user is not connected, suggest flycal login (after credentials.json is in place).",
|
|
572
|
+
"tool_filter": "Prefer exposing flycal_search, flycal_slots, flycal_calendars, and flycal_version to agents."
|
|
318
573
|
}
|
|
319
574
|
}
|