Content
<p align="center">
<img src="./assets/readme-hero.png" alt="yacli hero" width="100%">
</p>
<h1 align="center">yacli</h1>
<p align="center"><strong>CLI, MCP server and MCP Apps for Yandex Mail, Calendar, and Disk</strong></p>
<p align="center">One neat product interface for terminal, AI-agents, and MCP-hosts.</p>
<p align="center">
<a href="https://github.com/NextStat/yacli/releases"><img src="https://img.shields.io/github/v/release/NextStat/yacli?display_name=tag&style=for-the-badge&label=Release" alt="Release"></a>
<a href="https://github.com/NextStat/yacli/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/NextStat/yacli/ci.yml?branch=main&style=for-the-badge&label=Checks" alt="Checks"></a>
<img src="https://img.shields.io/badge/MCP-Apps-ffb703?style=for-the-badge" alt="MCP Apps">
<img src="https://img.shields.io/badge/macOS%20%7C%20Linux%20%7C%20Windows-ready-219ebc?style=for-the-badge" alt="Ready builds">
<img src="https://img.shields.io/badge/Auto-update-ready-8ecae6?style=for-the-badge" alt="Auto-update">
<a href="https://github.com/NextStat/yacli/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-90be6d?style=for-the-badge" alt="MIT"></a>
</p>
<p align="center">
<a href="#installation"><strong>Installation</strong></a> •
<a href="#quick-start"><strong>Quick Start</strong></a> •
<a href="#everyday-commands"><strong>Commands</strong></a> •
<a href="#cross-service-scenarios"><strong>Scenarios</strong></a> •
<a href="#mcp"><strong>MCP</strong></a>
</p>
`yacli` connects Yandex Mail, Calendar, and Disk into one clear interface: in terminal, agent clients, and within MCP Apps. One binary covers daily routine, agent integrations, and composite scenarios like `email → .ics → event` or `file → email`.
<table>
<tr>
<td width="33%" valign="top">
<strong>CLI for daily work</strong><br/><br/>
Mail, calendar, attachments, events, and private Disk in one binary and one config.
</td>
<td width="33%" valign="top">
<strong>MCP for agents</strong><br/><br/>
Full-fledged MCP server with <code>stdio</code>, <code>http</code>, prompts, skills, resources, completions, roots, and write-tools.
</td>
<td width="33%" valign="top">
<strong>MCP Apps for UI-hosts</strong><br/><br/>
Dashboard, deep links, prompts, resource browser, and live cross-service scenarios.
</td>
</tr>
</table>
<table>
<tr>
<td width="33%" valign="top">
<strong>Email → attachment → file</strong><br/><br/>
Find an email, download the required attachment, and save it locally without intermediate scripts.
</td>
<td width="33%" valign="top">
<strong>Email → <code>.ics</code> → event</strong><br/><br/>
Parse an invitation from an email and immediately create a meeting in the desired calendar.
</td>
<td width="33%" valign="top">
<strong>File → email</strong><br/><br/>
Take a local file, attach it to an email, and send it through the same interface.
</td>
</tr>
</table>
<!--
TODO: add GIF / terminal screenshot with yacli mail list + yacli status
-->
## Installation
### macOS and Linux
```bash
curl -fsSL https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.sh | sh
```
### Windows
```powershell
irm https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.ps1 | iex
```
Ready builds for macOS `x86_64`/`arm64`, Linux `x86_64`/`arm64`, and Windows `x86_64` are available in [GitHub Releases](https://github.com/NextStat/yacli/releases).
<details>
<summary>From sources / update / private mirror</summary>
```bash
cargo install --path . # build from sources
yacli update # update to the latest release
yacli update --check # check without installation
```
For private release mirror:
```bash
export YACLI_UPDATE_BASE_URL='https://mirror.example.test/releases/download/v0.5.5'
yacli update --check
```
</details>
## Quick Start
**Get started in a minute**
```bash
curl -fsSL https://raw.githubusercontent.com/NextStat/yacli/main/scripts/install.sh | sh
yacli setup me@yandex.ru --calendar-app-password <password> --client claude
```
After that, you will have:
- local CLI for Mail, Calendar, and Disk;
- MCP server for Claude, Codex, Gemini, and other clients;
- prompts, embedded skills, resources, and dashboard for MCP Apps;
- ready cross-service scenarios without glue scripts.
- live onboarding checklist in Unified Home to complete the remaining steps without guessing.
- terminal home screen via `yacli home` to see onboarding, workflows, and recent actions in one place.
- product health-check via `yacli doctor` and `resource://yacli/doctor` to quickly understand what still prevents readiness.
- safe remediation via `yacli doctor --apply-safe` and the `Apply safe fixes` button in Unified Home to automatically close safe local fixes.
- ranked next actions via `yacli next` and `resource://yacli/next-actions` to immediately see the most beneficial next steps.
- proactive suggestions via `yacli suggest` and `resource://yacli/suggestions` to receive recovery / cleanup / undo hints from real activity history and live product signals.
In `Unified Home`, these suggestions are now not only visible but also lead directly to `undo` or the canonical workflow/review path.
- `workflow show` and `resource://yacli/workflow/{workflow}` now return server-driven `execution.state` and `execution.available_actions` so that CLI, MCP, and Apps see the same actionable lifecycle workflow: `needs_input`, `review_ready`, `ready`, `recovery_ready`, `undo_ready`, `applied`, `undone`.
- Workflow panel in Apps now uses server-driven `execution.actions` for `next action`, so `connect / review / resume / cleanup / undo / replay` come from one canonical workflow contract, not from UI heuristics.
- For partial recovery, `execution.actions` now carries exact `tool_name + tool_arguments` whenever possible, so Apps can open or apply a retry-step without manually jumping into the activity/replay shell command.
### Where to Start
| If you need | What to do |
| --- | --- |
| **Pass setup in one go** | `yacli setup me@yandex.ru --calendar-app-password <password> --client claude` |
| **Quickly connect Mail and Disk** | `yacli add` → `yacli login` |
| **Connect Calendar** | get Yandex ID app password → `yacli login calendar --app-password <password>` |
| **Set up MCP in Claude / Codex / Gemini** | `yacli mcp install --client <client>` |
| **Launch local HTTP MCP** | `yacli mcp --transport http --listen 127.0.0.1:8787` |
For agent and headless scenarios, `yacli login` now works in two steps without fragile `stdin` dialog:
```bash
yacli login
# => status=pending, authorization_url, resume_command
yacli login --code <code>
```
`yacli` saves the pending PKCE session in the local config dir and reuses it on the second call, so the confirmation code no longer breaks due to a new `code_verifier`.
<details>
<summary><strong>How to get an app password for Calendar</strong></summary>
1. Open [Yandex ID App Passwords](https://yandex.com/support/id/en/authorization/app-passwords).
2. Go to `Security` → `Access to your data` → `App passwords`.
3. Select the `Calendar` type.
4. Enter a name, e.g., `yacli calendar`, and copy the password.
If you don't want to store the password locally:
```bash
export YACLI_CALENDAR_APP_PASSWORD='<password>'
yacli login calendar --env-var YACLI_CALENDAR_APP_PASSWORD
```
In release builds, OAuth tokens and app passwords are stored in the system keyring/keychain. In debug/test builds, the `file` backend is used by default to avoid spamming keychain prompts during local development and `cargo test`. For explicit override: `export YACLI_SECRET_BACKEND=keyring` or `export YACLI_SECRET_BACKEND=file`.
</details>
### Check that everything works
```bash
yacli home
yacli doctor
yacli doctor --apply-safe
yacli next
yacli suggest
yacli status
yacli mail list
yacli calendar calendars
yacli disk info
```
## Live Scenario in Claude Cowork
`yacli` is already pulling real composite tasks within the agent interface, not just individual commands.
**Request in Claude Cowork:**
> Create an event "Review yacli v0.5" on Monday at 11:00 for 30 minutes, send a reminder by email, and create a folder on Disk for materials
**What happened:**
1. An event was created in the calendar on Monday, **March 16, 2026**, `11:00–11:30`.
2. A reminder was sent by email.
3. A folder on Yandex Disk was confirmed: `/yacli-v0.5-review`.
**Why this is important:** one request combines three surfaces of `yacli`:
- calendar for creating an event;
- email for sending a reminder;
- disk for preparing a working folder.
This is exactly the product goal of `yacli`: not just to "give tools", but to bring real working scenarios to one understandable contract for people and agents.
## Everyday Commands
### Email
```bash
yacli mail folders
yacli mail list
yacli mail search "estimate"
yacli mail read 1353
yacli mail reply 1353 "Accepted, thanks"
yacli mail forward 1353 person@example.com "Please take a look"
yacli mail send person@example.com "Sync" "Hello"
yacli mail send person@example.com "Invoice" "Attached file" --attach ./invoice.pdf
yacli mail send person@example.com "Invoice" "Attached file" --attach ./invoice.pdf --dry-run
yacli mail send-link person@example.com "Materials" "Sending link" --source ./archive.zip --path disk:/docs/archive/archive.zip
yacli mail send-link person@example.com "Materials" "Sending link" --source ./archive.zip --path disk:/docs/archive/archive.zip --dry-run
yacli mail send-published-link person@example.com "Materials" "Sending link" --public-url https://disk.yandex.ru/i/archive-link
yacli mail send-published-link person@example.com "Materials" "Sending link" --public-url https://disk.yandex.ru/i/archive-link --dry-run
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip --dry-run
```
Attachments and invitations:
```bash
yacli mail attachment export 1353 --index 1 --output ./invoice.pdf
yacli mail invite inspect 1353 --index 1
yacli mail invite create-event 1353 --index 1
```
- The number `1353` is the identifier of the letter from `mail list` or `mail search`.
- `--folder "Folder name"` for working not with INBOX.
- `--html`, `--cc`, `--bcc` for HTML and copies.
- `--attach` can be specified multiple times.
- `--dry-run` shows a review of sending without a real SMTP call.
- If the assembled letter is already too heavy for safe SMTP sending, `mail send --dry-run` honestly recommends the workflow `send-link-by-mail`, and real `mail send` is blocked until the network step with the same hint.
- `mail send-link` is the correct flow for large files: upload to Disk, publish a link, and send an email with a link in one step.
- If `mail send-link` has already had `upload + publish`, but SMTP has dropped, the command returns `status=partial` with ready recovery actions: repeat only the mail-step through `mail send-published-link`, manually share a link, or revoke it.
- `mail send-published-link` is an honest retry mail-step for an already published link without re-upload/publish.
- `disk upload-link` is the correct flow when you just need to get a public link without sending an email.
<details>
<summary>More examples</summary>
```bash
yacli mail list --folder "Sent" --limit 20
yacli mail search "contract" --folder "Archive 2026"
yacli mail attachment export 1353 --name invoice.pdf --output ./invoice.pdf
yacli mail invite inspect 1353 --name invite.ics
yacli mail invite create-event 1353 --name invite.ics --calendar team --event-index 2
yacli mail send person@example.com "Invoice" "Sending invoice" --cc boss@example.com
yacli mail send person@example.com "Invoice" "Sending invoice" --attach ./invoice.pdf --attach ./spec.docx
yacli mail send-link person@example.com "Materials" "Sending link" --source ./archive.zip --path disk:/docs/archive/archive.zip
```
</details>
### Calendar
```bash
yacli calendar calendars
yacli calendar events
yacli calendar events 2026-03-14 2026-03-20 --limit 20
yacli calendar create "Team sync" 2026-03-14T09:00:00Z 2026-03-14T10:00:00Z
yacli calendar create "Team sync" 2026-03-14T09:00:00Z 2026-03-14T10:00:00Z --dry-run
yacli calendar delete <id>
```
- Without dates, `events` shows the next 30 days.
- `--calendar <id>` for working not with the default calendar.
- `calendar create --dry-run` shows a review of the event without a real CalDAV PUT.
### Disk
```bash
yacli disk info
yacli disk list
yacli disk list disk:/docs --limit 50
yacli disk mkdir disk:/docs/archive
yacli disk upload ./report.pdf disk:/docs/archive/report.pdf
yacli disk upload ./report.pdf disk:/docs/archive/report.pdf --dry-run
yacli disk upload-link --source ./report.pdf --path disk:/docs/archive/report.pdf
yacli disk upload-link --source ./report.pdf --path disk:/docs/archive/report.pdf --dry-run
yacli disk download disk:/docs/archive/report.pdf --output ./report.pdf
yacli disk publish disk:/docs/archive/report.pdf
yacli disk publish disk:/docs/archive/report.pdf --dry-run
yacli disk unpublish disk:/docs/archive/report.pdf
yacli disk unpublish disk:/docs/archive/report.pdf --dry-run
```
- `disk upload --dry-run` shows a review of the file and remote path without requesting an upload ticket and without real uploading.
- `disk upload-link` closes the human flow `local file -> Disk -> public link` in one step; `--dry-run` shows a review without upload/publish.
- `disk download` downloads a private file from the same robust transfer contract: progress, retry, stats, and activity replay.
- `disk publish --dry-run` shows what will be published and if there is already a `public_url` / `public_key` for the resource, without real publishing.
- `disk publish` publishes a private resource and returns `public_url` / `public_key` so a large file can be shared via a link instead of being sent as an attachment.
- `disk unpublish --dry-run` shows what public link will be revoked, without real revocation.
- `disk unpublish` revokes a public link and returns what `public_url` / `public_key` were revoked.
- Real upload/download transfers to Disk by default wait for completion without a general short timeout on the request body; if necessary, a hard limit can be set via `YACLI_DISK_UPLOAD_TIMEOUT_SECS` and `YACLI_DISK_DOWNLOAD_TIMEOUT_SECS`.
- In CLI table-mode, large uploads/downloads show live progress and throughput in stderr, without breaking the JSON/MCP contract.
- In case of transient network failures, the transfer automatically makes several safe retry attempts: download starts again, upload gets a new upload ticket and repeats sending the whole file.
- `disk public download` now supports resumable download via `.part` + HTTP `Range`, if the download endpoint supports partial content; the final payload shows `resumed_from_bytes`, `attempts`, and `elapsed_ms`.
### Activity Log
```bash
yacli activity list
yacli activity list --limit 20
yacli activity show <id>
yacli activity undo <id>
```
- Only successful real write operations are logged.
- `--dry-run` is not recorded in the log.
- Each entry has a `replay_command` that can be repeated or passed to an agent.
- For honestly reversible actions, the entry additionally carries `undo_command`, and `yacli activity undo <id>` performs a standard rollback.
### Public Disk
```bash
yacli disk public show --public-key https://disk.yandex.ru/i/WhGpLnQWR9efCA
yacli disk public download --public-key https://disk.yandex.ru/i/WhGpLnQWR9efCA --output ./sample.pdf
```
## Cross-Service Scenarios
| Skill / workflow | What connects | Example request |
| --- | --- | --- |
| `daily-briefing` | Email + calendar | "Collect morning briefing on emails and meetings" |
| `reply-with-context` | Email + calendar | "Reply to email considering my schedule" |
| `attachment-to-disk` | Email → file | "Find email and save attachment to file" |
| `send-file-by-mail` | File → email | "Send file from disk by email" |
| `send-link-by-mail` | File → Disk → email | "Upload large file to Disk and send link by email" |
| `publish-file-link` | File → Disk | "Upload file to Disk and give public link" |
| `revoke-public-link` | Disk | "Revoke public link for file on Disk" |
| `invite-to-calendar` | Email → calendar | "Find invitation and add meeting to calendar" |
```bash
# morning briefing
yacli mail list --limit 10
yacli calendar events
# reply with schedule consideration
yacli mail read 1353
yacli calendar events 2026-03-14 2026-03-16
yacli mail reply 1353 "Confirmed, this window fits"
# large file -> link -> email
yacli mail send-link person@example.com "Materials" "Sending link" --source ./archive.zip --path disk:/docs/archive/archive.zip
# local file -> public link
yacli disk upload-link --source ./archive.zip --path disk:/docs/archive/archive.zip
# revoke public link
yacli disk unpublish disk:/docs/archive/archive.zip
```
# Save attachment
yacli mail attachment export 1353 --name invoice.pdf --output ./invoice.pdf
# Send file by mail
yacli mail send person@example.com "Invoice" "Attached file" --attach ./invoice.pdf
# Invitation → event
yacli mail invite inspect 1353 --index 1
yacli mail invite create-event 1353 --index 1 --calendar team
For MCP clients, the same scenarios are available through `prompts/get` and `resource://yacli/skill/*`.
## Multiple addresses
```bash
yacli add personal@yandex.ru
yacli login
yacli add work@company.ru work
yacli use work
yacli login
yacli mail list --account personal
yacli mail search "invoice" --account work
```
Each address has its own tokens and settings. `use` switches the current account, `--account` accesses a specific one.
## Why yacli
| Surface | What it provides |
| --- | --- |
| `One runtime` | Mail, calendar, and disk live in one binary, one config, and one agent contract. |
| `Apps-first MCP` | Not just tools, but also MCP Apps: dashboard, prompts, embedded skills, resources, live subscriptions. |
| `Cross-service workflows` | Path `email → attachment → .ics → event`, `file → email`, `agent → MCP prompt → action`. |
| `Ship-ready` | Ready releases for macOS, Linux `x86_64`/`arm64`, Windows `x86_64`, plus `yacli update`. |
```mermaid
flowchart LR
U["User / agent"] --> CLI["yacli CLI"]
U --> MCP["yacli MCP server"]
MCP --> APPS["MCP Apps dashboard"]
MCP --> PROMPTS["prompts / skills / resources"]
CLI --> MAIL["Yandex Mail"]
CLI --> CAL["Yandex Calendar"]
CLI --> DISK["Yandex Disk"]
MCP --> MAIL
MCP --> CAL
MCP --> DISK
APPS --> MAIL
APPS --> CAL
APPS --> DISK
```
Important: `yacli` is not a Yandex product. Yandex does not support this project. This is an independent project with open-source code.
## MCP
### Launch
```bash
yacli mcp # stdio
yacli mcp --transport http --listen 127.0.0.1:8787 # HTTP
```
`stdio` is automatically compatible with `Content-Length` framing and line-delimited JSON — one binary works with both old and new clients.
### Installation in clients
```bash
yacli mcp install # all detected clients
yacli mcp install --client claude # Claude Code + Claude Desktop
yacli mcp install --client codex # Codex
yacli mcp install --client gemini # Gemini CLI
yacli mcp install --client cursor # Cursor
```
Registers the MCP server and lays out 13 embedded skills in client directories.
Supported clients: Claude Code, Claude Desktop / Cowork, Codex, Gemini CLI, Cursor, Zed, Windsurf, Antigravity, Warp.
### What MCP Client Receives
| Layer | Content |
| --- | --- |
| `tools` | mail, calendar, disk, account, auth, update, roots |
| `resources` | account/auth, skills catalog, templated resources |
| `prompts` | shared, mail, calendar, disk, daily-briefing, find-and-read, reply-with-context, attachment-to-disk, send-file-by-mail, send-link-by-mail, publish-file-link, revoke-public-link, invite-to-calendar |
| `apps` | `ui://yacli/dashboard` — browser, tool runner, resource inspector, update check |
| `completions` | accounts, folders, calendars, skills, dashboard args |
| Client | MCP | Apps / UI | Skills | Prompts |
| --- | --- | --- | --- | --- |
| Claude Code | `stdio` + `http` | Yes | Yes | Yes |
| Claude Desktop / Cowork | Yes | Yes | — | Yes |
| Codex / Gemini CLI | `stdio` + `http` | Yes | Yes | Yes |
| Cursor / Windsurf / Warp | Yes | depends on host | partially | Yes |
| Zed | Yes | depends on host | — | Yes |
<details>
<summary><strong>Transports and Auth</strong></summary>
| Transport | When to Use | What's Important |
| --- | --- | --- |
| `stdio` | Claude Code, local CLI MCP clients | Auto-negotiation of `Content-Length` and JSONL |
| `http` | Apps-capable clients and local networked MCP | Streamable HTTP + SSE notifications |
HTTP transport streamable:
- `POST /mcp` — JSON-RPC requests and batch payloads;
- `GET /mcp` with `Accept: text/event-stream` and `Mcp-Session-Id` — SSE stream for server-push notifications;
- `DELETE /mcp` — termination of HTTP MCP session.
Bearer token auth:
```bash
export YACLI_MCP_HTTP_BEARER_TOKEN='secret-token'
yacli mcp --transport http --listen 127.0.0.1:8787
```
Protected Resource Metadata and auth discovery:
```bash
export YACLI_MCP_HTTP_AUTH_ISSUER='https://auth.example.test'
```
Public URL for proxy:
```bash
yacli mcp --transport http --listen 127.0.0.1:8787 --public-url https://mcp.example.test/mcp
```
Native HTTP registration:
```bash
yacli mcp install --client claude --transport http --url http://127.0.0.1:8787/mcp
yacli mcp install --client codex --transport http --url http://127.0.0.1:8787/mcp
yacli mcp install --client gemini --transport http --url http://127.0.0.1:8787/mcp
```
</details>
<details>
<summary><strong>Prompts, Skills, and Resources</strong></summary>
Embedded MCP prompts — for precise matching of queries like "email summary" or "reply with schedule".
These are MCP-native equivalents of embedded `SKILL.md`. In clients like Claude Desktop / Cowork, where a separate `SKILL.md` surface is not available, `prompts/list` and `prompts/get` provide a portable workflow layer.
Resource templates:
```
resource://yacli/account/{alias}
resource://yacli/auth/{alias}
resource://yacli/skills
resource://yacli/skill/{skill}
ui://yacli/dashboard{?account,section,resource,tool,skill,prompt}
```
`resources/subscribe` / `resources/unsubscribe` provide live notifications via `notifications/resources/updated`.
`completion/complete` suggests arguments: account aliases, skill names, mail folders, calendar windows, disk paths, dashboard args.
For clients with `roots` capability, the tool `yacli.roots.list` is available.
</details>
<details>
<summary><strong>Write-capable Tools</strong></summary>
Mail:
- `yacli.mail.send` (including `attachments` — list of local paths)
- `yacli.mail.reply`
- `yacli.mail.forward`
- `yacli.mail.attachment.export`
- `yacli.mail.invite.inspect`
- `yacli.mail.invite.create_event` (selector `index`/`name` + `event_index` for `.ics` with multiple VEVENT)
Calendar:
- `yacli.calendar.create`
- `yacli.calendar.delete`
Disk:
- `yacli.disk.mkdir`
- `yacli.disk.upload`
</details>
<details>
<summary><strong>Apps and Dashboard</strong></summary>
MCP Apps are available via `ui://yacli/dashboard`:
- Unified Home — start screen with snapshot, workflows, activity, and quick transitions
- Canonical home resources — `resource://yacli/home`, `resource://yacli/home/{account}`, and goal-aware variants with `?goal=...` provide the same summary surface in CLI, MCP, and Apps
- Ranked next actions — `yacli next` and `resource://yacli/next-actions` now support goal-aware prioritization via `--goal` / `?goal=...`
- Proactive suggestions — `yacli suggest` and `resource://yacli/suggestions` collect recovery / cleanup / undo suggestions from real activity history, optional goal context, and live signals like fresh email with calendar invite, regular or already too heavy attachment in `INBOX`, already published files on Yandex Disk, canceled events in calendar, upcoming meetings to prepare a folder with materials, recently completed meetings to publish a folder with materials, and live post-event signals where you can immediately reply to an email with a link to published materials
- Goal Router — `yacli goal "..."` and `yacli.goal.route` route a natural goal to the best workflow, prompt, and MCP tool-path
- Goal-driven remediation — route immediately shows what's missing in setup/readiness and which command can fix it
- Goal Router in Apps — routed goal can be immediately brought to `Preview action`, `Apply routed action`, and `Share goal replay`
- Live onboarding checklist — shows what's still not connected and which commands can fix it
- Live doctor health-check — shows config/secret backend/service readiness, MCP client status, and suggested commands
- Apply safe fixes — runs `yacli.doctor.apply_safe`, applies only safe local remediation steps, and immediately refreshes Home / Doctor / Next Actions
- Suggestions in Unified Home — Home can separately refresh/share `suggestions`, open top suggestion, and run it via `undo` or workflow/review path next to `doctor` and `next actions`
- Round-trip deep links — dashboard rebuilds canonical URI when changing view
- Unified searchable browser by tools, prompts, resources, templates, and skills
- Workflow Hub and Activity Log with replay commands
- Universal tool runner — tool selection, `inputSchema`, JSON args editor, invocation from hosted app
- Action Review in Apps runtime — `Preview action` and `Apply reviewed action` for `mail send`, `calendar create`, `disk upload`
- Workflow autofill — runner opens on canonical tool for workflow and immediately substitutes account, server-driven workflow defaults, correct MCP arg names, and goal/remediation hints/tool arguments like email, local path, disk path, and calendar
- Workflow capabilities — workflow payload now canonically carries `primary_tool`, `primary_operation`, `supports_review`, and `primary_tool_arguments`, so Workflow Hub, Goal Router, and Activity handoff do not rely on UI heuristics
- Review-driven remediation handoff — if `mail send` review recommends `send-link-by-mail`, dashboard can immediately open suggested flow and prefill runner
- Workflow-level handoff — from Workflow Hub, you can immediately transition to preview/apply and replay last actions
- Resource inspector for account/auth and skills catalog
- Capability-aware host profile — shows what host can do and recommends workflow
- Persistent view state in browser storage
- Auth escalation surface for protected tools
- Safe update check from Apps runtime
</details>
<details>
<summary><strong>Behavior by Client</strong></summary>
- `Claude Code`, `Codex`, and `Gemini CLI` support native HTTP registration — `yacli` supports both `stdio` and `http` install flow;
- `Claude Desktop / Cowork` uses `claude_desktop_config.json` — `yacli mcp install --client claude` registers in both Claude Code and Claude Desktop;
- for `Cursor`, `Zed`, `Windsurf`, `Warp`, and `Antigravity`, the install path remains `stdio`-oriented;
- skills are installed for Claude Code, Codex, Gemini CLI, Cursor, Windsurf, Warp, and Antigravity; for Zed, MCP registration is without skills surface;
- Claude Desktop / Cowork receives workflows through MCP prompts (without `SKILL.md`);
- `stdio` automatically negotiates framing between `Content-Length` and JSONL;
- `roots` capability: `tools/list` advertises `yacli.roots.list`, `notifications/roots/list_changed` invalidates cache;
- HTTP SSE: `POST /mcp` with `Accept: text/event-stream` — nested `roots/list` + final result;
- `yacli mcp install` does not copy secrets to client configs;
- regular text MCP clients work without UI.
</details>
## For Automation
By default, `yacli` prints JSON. For tabular output:
```bash
yacli --format table mail list
```
Hidden `guide` command for agent bindings:
```bash
yacli guide
yacli guide --topic mail
```
## Where Settings Are Stored
| Platform | Path |
| --- | --- |
| macOS | `~/Library/Application Support/yacli` |
| Linux | `~/.config/yacli` |
| Windows | `%APPDATA%\yacli` |
```bash
export YACLI_CONFIG_DIR=/path/to/config-dir # override directory
```
## Additional Useful Information
- `status` shows which services are connected for the current account;
- if the OAuth token for Mail or Disk has expired, simply run `yacli login` again;
- `mail forward` forwards an email along with regular attachments and inline files;
- `disk public download` does not overwrite an existing file without the `--force` option.
## Quality Check
```bash
cargo build --workspace
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
```
MCP Config
Below is the configuration for this MCP Server. You can copy it directly to Cursor or other MCP clients.
mcp.json
Connection Info
You Might Also Like
No recommendations available