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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9b15a5f08efcc922a2088d9a4c47fb852794932b4261406312f262905664c09
4
- data.tar.gz: 114f71e6f2ca779315908015cf0b772f374b0e9de04e5775b220f8c3278aa5e5
3
+ metadata.gz: 1bfdf39ef3561cb1c12829bd2d28dfaf9c2062df7f4c4a163ee99e057af9d413
4
+ data.tar.gz: 8f0ee70cc004bfd8e29a1fd4c5d7b5d852c22a3958f2de596cc2c77f9ed044f8
5
5
  SHA512:
6
- metadata.gz: 1545a6259e5a710d4db52267909e7bbbff350aba2e75d617c9e6e2cbb722bb77f9663b5ca8e08483a5606f8030642952c7b1f5c170c4550de706503d15db3fd8
7
- data.tar.gz: 6a63614ed3c9cd16ad5d1cf01b358e49edd5fc46ef285b986e181973ef0c660e9353f40e38ae130265bc470073730314d31fce48639ba3942338989a371042c5
6
+ metadata.gz: 8069638ac5162722bc332a577833da48fb92161ee0b2ca39d6c7c31d1c4aeedecaebcc6bf696f0f9945306bbc4e99b8921718867356b5be87a9d1c22b10ff53e
7
+ data.tar.gz: 0bdca914927e92b873e91d42b7a061502a9558a858e392d1df1c93509c7ec85a281c5f47e309e011fd1ef734259c991a6d3fa761ecd520b5e6913a4d6f83590f
data/README.md CHANGED
@@ -1,188 +1,48 @@
1
1
  # flycal-cli
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/flycal-cli.svg)](https://badge.fury.io/rb/flycal-cli)
3
+ [![Gem Version](https://badge.fury.io/rb/flycal-cli.svg)](https://badge.fury.io/rb/flycal-cli)
4
4
 
5
- A command-line tool to access and search Google Calendar events. Connect your Google account, choose a default calendar, and search events with flexible date ranges and text filters.
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
- ## Requirements
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
- If already connected, the command reports the current status and suggests running `flycal config` to set the default calendar.
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
- List available calendars with name and ID.
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
- ### config
24
+ ## Common examples
101
25
 
102
- Interactive configuration menu.
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 "5 days" --locale it
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
- **Options:**
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
- - incode - antonio
184
- - Polimi 10110009
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
- If a clipboard tool is available (`pbcopy` on macOS, `wl-copy`/`xclip` on Linux, `clip` on Windows), the slot list without the header is also copied to the clipboard.
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
- Slot search windows are configured in `~/.flycal/config.yml`:
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
- Missing keys are filled from `config/defaults.yml` in the gem and saved to your `config.yml` on first read.
234
-
235
- - `calendar_default: ~` means no default calendar is set (`~` is YAML null)
236
- - `templates` named schedules; default used is the first one (`work`)
237
- - `templates.*.days` weekdays as numbers: `1` Monday `7` Sunday
238
- - `templates.*.hours` one or more ranges (`H-H`, `HH:MM-HH:MM`, mixed)
239
- - `defaults.from` default `--from` for slots (`now` or a date string)
240
- - `defaults.default_duration` default slot length when `--duration` is omitted
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
- **Output example:**
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
- monday 21/7
254
- 12 - 13
255
- 14 - 15
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
- ## Configuration
122
+ ---
259
123
 
260
- Data is stored in `~/.flycal/`:
124
+ ## Parameters (reference)
261
125
 
262
- | File | Purpose |
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
- ## Publishing to RubyGems
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
- ### First release
137
+ ### `flycal search`
271
138
 
272
- 1. Create an account at [rubygems.org](https://rubygems.org) if needed
273
- 2. Update `flycal-cli.gemspec` with your author, email, and homepage
274
- 3. Build and push:
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
- ```bash
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
- ### Subsequent releases
150
+ ---
282
151
 
283
- 1. Update the version in `lib/flycal_cli/version.rb`
284
- 2. Build and push:
152
+ ## Optional: your own Google Cloud credentials
285
153
 
286
- ```bash
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
- 3. Optionally tag and push:
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
- ```bash
294
- git tag vX.Y.Z
295
- git push origin vX.Y.Z
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
- ### Using rake release
165
+ You can also ask a teammate who manages the Cloud project to share that JSON with you.
299
166
 
300
- With `bundler/gem_tasks` in your Rakefile:
167
+ ---
301
168
 
302
- ```bash
303
- bundle exec rake release
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
- This builds the gem, pushes to RubyGems, and can handle git tagging and pushing.
177
+ MCP catalog for agents: [`mcp/tools.json`](mcp/tools.json)
307
178
 
308
179
  ## License
309
180
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FlycalCli
4
- VERSION = '0.7.3'
4
+ VERSION = '0.7.4'
5
5
  end
data/mcp/README.md CHANGED
@@ -1,29 +1,68 @@
1
1
  # flycal MCP catalog
2
2
 
3
- This directory contains a machine-readable description of **flycal-cli** commands for MCP (Model Context Protocol) servers.
3
+ Machine-readable description of **flycal-cli** for MCP servers.
4
4
 
5
5
  ## File
6
6
 
7
- - [`tools.json`](./tools.json) — tools catalog with MCP-style `inputSchema`, CLI argv templates, auth/interactivity flags, and config keys.
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 (`server.tool(...)`), using `name`, `description`, and `inputSchema`.
13
- 3. On tool call, build the argv:
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 append pairs from `command.option_map` for each provided argument
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 content.
18
- 5. Skip or gate tools with `"interactive": true` (`flycal_login`, `flycal_config`) unless a TTY is available.
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 --in ... --duration ...` | Free 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 in the catalog but are usually better left to the user terminal.
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 via the `command` template. Non-interactive tools are safe to run from an MCP host; interactive tools require a TTY and should be surfaced as guidance only or refused unless the client can attach a terminal.",
6
- "version": "0.5.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
- "locale": {
10
- "global_option": "--locale",
11
- "supported": ["en", "it"],
12
- "default": "en",
13
- "config_key": "locale"
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
- "description": "Default Google Calendar ID used by search and as slots fallback. YAML null (~) means unset."
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 templates with days (1=Mon..7=Sun) and hours ranges. Default template is the first key (work)."
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
- "description": "Default --from for slots (e.g. now or a date string)"
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
- "description": "Default slot duration when --duration is omitted (e.g. 45min)"
122
+ "default": "45min",
123
+ "description": "Default value for slots --duration when omitted"
39
124
  },
40
125
  "slots.free_before": {
41
126
  "type": "string",
42
- "description": "Buffer before each slot; events block this window before slot start"
127
+ "default": "0m",
128
+ "description": "Busy buffer before each slot start"
43
129
  },
44
130
  "slots.free_after": {
45
131
  "type": "string",
46
- "description": "Buffer after each slot; gaps must fit duration + free_after"
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 duration values that contain spaces (e.g. --in \"3 days\").",
59
- "Duration formats without spaces also work (e.g. 30days, 48hours, 1h, 30min)."
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 for this invocation"
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 for Google Calendar. Requires ~/.flycal/credentials.json and a browser. Interactive.",
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\". Does not change configuration.",
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 molinari@incode.it\nPersonal user@gmail.com"
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. Options: calendar_default (single select), exclude_calendars (multi-select, min 1), edit config (opens ~/.flycal/config.yml in $EDITOR or vi). Ctrl+C prints \"config cancelled...\". Prefer editing config.yml or using dedicated non-interactive flows from MCP hosts.",
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
- "calendar_default",
183
- "exclude_calendars",
184
- "edit config"
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 in hours/minutes and 8-hour working days. For ranges >7 days adds a weekly breakdown; for >30 days a monthly breakdown. Contains-filter on title/description when description is set. Read-only.",
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", "--in", "2months", "-d", "placeholder", "--locale", "it"]
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. Formats: YYYY-MM-DD or YYYY-MM-DDTHH:MM"
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` (or now/from default), overrides `to`. Prefer no spaces or quote values: 30days, 48hours, 2months, 1year, or \"30 days\"."
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 slots using a config template (days + hours). Default template is the first one (work). Use --template dinner for evening hours. Subtracts busy events from slots.exclude_calendars. Starts from --from (default: now) for --in (default: 1 week). Duration defaults to 45min. Respects free_before/free_after. Output: header, template name, calendars, Google Calendar day link, continuous free ranges.",
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
- "example": "found 6 slots\nfrom sat 1 August 2026 to sat 8 August 2026\nwith duration 45min, template dinner\nconsidering calendars\n- Work\nlink: https://calendar.google.com/calendar/r/day/2026/8/1\n\nsaturday 1/8\n19 - 23"
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 from config slots.defaults.default_duration (45min)."
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": "Start date/time. Default: now. Absolute dates, or relative: monday, next monday, tomorrow, lunedi, prossimo lunedi, etc."
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": "Search window from --from. Default: 1 week. Examples: 3 days, 1 week, 48 hours (quote if spaces)."
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 (default: first template, usually work)."
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 not configured."
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
- "interactive_tools": "Do not auto-run tools with interactive=true unless the host provides a TTY. Instead tell the user to run the command in a terminal.",
315
- "auth_errors": "If stdout/stderr indicates the user is not connected, suggest flycal login.",
316
- "locale_arg": "If input.locale is set, append --locale <value> to argv for any tool.",
317
- "tool_filter": "Expose at least flycal_search, flycal_slots, flycal_calendars, and flycal_version for agent use."
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
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flycal-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - flycal-cli