Skip to main content

ycli

One Yandex 360 toolkit — four ways to use it. Drive Tracker, Wiki, and Forms from a CLI, an MCP server, a Python SDK, or a Claude Code plugin. Built for AI agents first — pleasant for humans too.

CI Coverage PyPI Python License Ask DeepWiki

ycli in action
  • 🧩 One SDK, four surfaces — write logic once, use it as a CLI, an MCP server, a Python library, or a Claude Code plugin.
  • 🤖 Agent-native — the MCP server exposes read and write tracker_*, wiki_*, forms_* tools, one per SDK/CLI operation, plus a cross-cutting status tool (counts in Coverage), with honest annotations (reads are marked read-only; writes declare whether they are destructive/idempotent); ycli mcp start --read-only serves a reads-only view for cautious deployments.
  • 🛡️ Trustworthy — typed pydantic models, the real Yandex API quirks handled for you, and a test suite kept at 100% coverage.
  • ⚡ Zero-friction start — uv add yandex-cli, ycli auth login, go.

Install

uv add yandex-cli            # CLI + Python SDK
uv add 'yandex-cli[mcp]'     # …plus the MCP server (`ycli mcp start`)

Run it without installing, or install it as a standalone tool:

uvx yandex-cli --help                 # one-off, no install
uv tool install yandex-cli            # persistent CLI
uv tool install 'yandex-cli[mcp]'     # …with the MCP server

pip install yandex-cli works too. The CLI ships as both yandex-cli and the short ycli.

The SDK's ServiceAccountAuth (IAM tokens minted from a Yandex Cloud service-account key) needs the service-account extra: uv add 'yandex-cli[service-account]'.

Quick start

Pick the surface that fits how you work.

CLI
uv add yandex-cli
ycli --help
ycli tracker issues get TRACKER-1
ycli wiki pages get onboarding

Output formats — a global --format / -o picks how results print:

ycli tracker issues get TRACKER-1            # auto: a pretty table on a TTY…
ycli tracker issues get TRACKER-1 | jq .     # …and raw JSON when piped (agent/script-safe)
ycli -o yaml wiki pages get onboarding       # or: -o json | -o yaml | -o pretty
MCP server (read/write)

Run it over stdio (needs the mcp extra):

ycli mcp start               # full read/write tool set (honest annotations)
ycli mcp start --read-only   # reads-only view for cautious deployments

List the exposed tool names without running the server:

ycli mcp methods

Point an MCP client at it — no prior install needed via uvx (tools are namespaced tracker_*, wiki_*, forms_*):

{
  "mcpServers": {
    "yandex": {
      "command": "uvx",
      "args": ["--from", "yandex-cli[mcp]", "ycli", "mcp", "start"],
      "env": {
        "YANDEX_ID_OAUTH_TOKEN": "...",
        "YANDEX_ID_ORGANIZATION_ID": "..."
      }
    }
  }
}
Python SDK
from ycli.yandex.tracker.client import TrackerClient

tracker = TrackerClient(oauth_token="…", organization_id="…")
issue = tracker.issues.get("TRACKER-1")
print(issue.summary)
Claude Code plugin
/plugin marketplace add bim-ba/ycli
/plugin install yandex-360@ycli

Teaches an agent to drive Yandex 360 through ycli — including the real API quirks. See plugins/yandex-360/.

Skills (Claude Code plugin)

Skill Use for
yandex-360 Entry point — install + auth, pick a surface (CLI/MCP/SDK), route to a domain
yandex-360-tracker Issues, epics, comments, transitions, links, worklog, changelog
yandex-360-wiki Wiki pages, page tree, comments, attachments, YFM authoring
yandex-360-forms Forms, questions/schema, responses, publishing

The skills encode the read/write commands and the gnarly Yandex API quirks (epic-vs-parent, transition discovery, permanent wiki slugs, fields= rules, Forms host/header traps, answers pagination).

Configure

ycli reads two values from the environment (or a .env file — cp .env.example .env):

YANDEX_ID_OAUTH_TOKEN=...        # a Yandex OAuth token with Tracker/Wiki/Forms access
YANDEX_ID_ORGANIZATION_ID=...    # your Yandex 360 organization id

ycli sends the org id as X-Org-Id for every service (HTTP header names are case-insensitive per RFC 9110, so one casing serves all).

Optional settings follow the YCLI__<GROUP>__<SETTING> pattern; ycli rejects an invalid value at startup and names the variable:

Variable Default Meaning
YCLI__HTTP__TIMEOUT_SECONDS 30 Per-request timeout, seconds (> 0)
YCLI__HTTP__RETRIES 3 Retries for idempotent requests on 429/5xx (≥ 0)
YCLI__HTTP__MAX_ITEMS 500 Item cap for listings without --limit/--all (> 0)
YCLI__LOGGING__LEVEL WARNING DEBUG, INFO, WARNING, ERROR or CRITICAL; -v means INFO (every HTTP request), -vv means DEBUG
YCLI__LOGGING__FORMAT text text or json (one object per line); logs always go to stderr

Get your credentials

Yandex issues OAuth tokens only through a registered application, so it's a one-time app registration plus one command.

1. Register an OAuth app at oauth.yandex.ru and grant it the Tracker, Wiki, and Forms permissions (read and write — the CLI and the MCP server both write; the read scopes alone suffice only if you run the MCP server with ycli mcp start --read-only). Put the ClientID — and the Client secret if you want the headless flow — in your .env (ycli reads it from there):

YANDEX_OAUTH_CLIENT_ID=...        # from your app
YANDEX_OAUTH_CLIENT_SECRET=...    # optional — enables the headless device flow

2. Log in. ycli auth login gets a token, detects your organization, and writes both into .env:

ycli auth login
  • client id + secret → the device flow: ycli prints a code and a https://ya.ru/device link; approve there and it captures the token — no redirect, works over SSH.
  • only the client id (or --implicit) → the browser flow: ycli opens the Yandex authorize page; approve, then copy the token it displays and paste it back.
Prefer to do it by hand?

Headless (device flow):

# 1. start the flow — returns a user_code + verification_url
curl -s -X POST https://oauth.yandex.ru/device/code -d "client_id=$YANDEX_OAUTH_CLIENT_ID"
# 2. open https://ya.ru/device, enter the user_code, approve
# 3. exchange the device_code for the token
curl -s -X POST https://oauth.yandex.ru/token \
  -d grant_type=device_code -d "code=<device_code>" \
  -d "client_id=$YANDEX_OAUTH_CLIENT_ID" -d "client_secret=$YANDEX_OAUTH_CLIENT_SECRET"

Browser (implicit): open https://oauth.yandex.ru/authorize?response_type=token&client_id=<ClientID> in a logged-in browser, approve, and copy the token from the page. (Plain curl can't — implicit needs an interactive browser session.)

Organization id: tracker.yandex.ru/admin/orgs → your organization → copy the identifier.

Coverage

ycli wraps 231 operations across 50 resources of the Tracker, Wiki, and Forms REST API — every one reachable from the Python SDK and the CLI, plus 222 MCP tools (221 domain-scoped + 1 cross-cutting: status) for agents.

Legend — operations ship on SDK + CLI, and the MCP server mirrors them with honest annotations: reads carry readOnlyHint, writes carry explicit destructive/idempotent hints, and ycli mcp start --read-only serves the reads-only view. In each table SDK and CLI mean the operation is wrapped on that surface; MCP is ✅ when the resource exposes at least one MCP tool. Resource and operation names link to the official Yandex API reference (yandex.ru/support/…/api-ref). These tables are generated from the code by scripts/gen_coverage.py — do not edit by hand.

Tracker

32 resources · 153 operations · 151 MCP tools

Issues & work items

Resource Operations SDK CLI MCP
issues get · search · count · create · update · move · suggest · scroll_clear ✅ ✅ ✅
comments list · add · edit · delete · react ✅ ✅ ✅
links list · add · delete ✅ ✅ ✅
transitions list · execute ✅ ✅ ✅
worklog list · search · global_list · create · edit · delete ✅ ✅ ✅
changelog list ✅ ✅ ✅
checklists get · create · edit · delete · clear ✅ ✅ ✅
attachments list · download · download_thumbnail ✅ ✅ ✅
remotelinks list · create · delete ✅ ✅ ✅

Agile boards

Resource Operations SDK CLI MCP
boards list · get · create · edit · delete ✅ ✅ ✅
sprints list · get · create · edit · delete · start · archive ✅ ✅ ✅
columns list · get · create · edit · delete ✅ ✅ ✅

Dictionaries

Resource Operations SDK CLI MCP
priorities list · create · edit ✅ ✅ ✅
statuses list · create · edit ✅ ✅ ✅
resolutions list · create · edit ✅ ✅ ✅
issuetypes list · create · edit ✅ ✅ ✅
linktypes list ✅ ✅ ✅

Fields, queues & structure

Resource Operations SDK CLI MCP
fields list · get · create · edit · category_create · category_edit ✅ ✅ ✅
localfields list · get · create · edit ✅ ✅ ✅
components list · create · edit ✅ ✅ ✅
queues list · get · tags · versions · fields · create · delete · restore · set_permissions · tag_remove · version_create ✅ ✅ ✅

Automation & bulk

Resource Operations SDK CLI MCP
macros list · get · create · edit · delete ✅ ✅ ✅
triggers get · create · edit · webhook_log ✅ ✅ ✅
autoactions get · create · logs · log_detail ✅ ✅ ✅
dashboards create · add_cycle_time_widget ✅ ✅ ✅
bulk update · move · transition · get · issues ✅ ✅ ✅
import task · comment · link · worklog · file ✅ ✅ ✅
Resource Operations SDK CLI MCP
entities create · get · edit · delete · search · history · permissions · set_permissions · bulk_update · bulk_status · create_report · comments_list · comments_relative · comments_get · comments_create · comments_edit · comments_delete · checklists_create · checklists_edit · checklists_edit_item · checklists_delete · checklists_delete_item · checklists_move · links_list · links_create · links_delete · attachments_list · attachments_get · attachment_download · attachments_attach · attachments_delete ✅ ✅ ✅
users get · list ✅ ✅ ✅
applications list ✅ ✅ ✅
filters get · create · edit ✅ ✅ ✅
me get ✅ ✅ ✅

Wiki

9 resources · 43 operations · 42 MCP tools

Pages

Resource Operations SDK CLI MCP
pages get_by_id · get · descendants · descendants_by_id · grids · create · update · delete · append_content · clone ✅ ✅ ✅
resources list ✅ ✅ ✅
recovery restore ✅ ✅ ✅

Collaboration

Resource Operations SDK CLI MCP
comments list · thread · create · delete ✅ ✅ ✅
attachments list · download · download_by_url · delete · attach · upload ✅ ✅ ✅

Grids (dynamic tables)

Resource Operations SDK CLI MCP
grids get · create · update · delete · add_rows · remove_rows · move_rows · add_columns · remove_columns · move_columns · update_cells · clone ✅ ✅ ✅

Async & uploads

Resource Operations SDK CLI MCP
operations clone_get · gridclone_get ✅ ✅ ✅
uploadsessions create · get · upload_part · finish · abort · abort_all ✅ ✅ ✅

Identity

Resource Operations SDK CLI MCP
me get ✅ ✅ ✅

Forms

9 resources · 35 operations · 28 MCP tools

Surveys & questions

Resource Operations SDK CLI MCP
surveys list · get · create · modify · delete · publish · unpublish ✅ ✅ ✅
questions get · list · create · modify · delete · move ✅ ✅ ✅

Responses & export

Resource Operations SDK CLI MCP
answers get · list · list_all · export · export_results · download_export ✅ ✅ ✅
operations get ✅ ✅ ✅

Distribution

Resource Operations SDK CLI MCP
keysets list · get · create · modify · delete · download ✅ ✅ ✅
filling get · submit · suggest ✅ ✅ ✅

Media

Resource Operations SDK CLI MCP
files upload · verify · download · delete ✅ ✅ ✅
images upload ✅ ✅ —

Identity

Resource Operations SDK CLI MCP
me get ✅ ✅ ✅

Every resource and operation above deep-links to the Yandex API reference: 227 of 231 operations resolve to their own endpoint page and 3 to their resource's page. No public API reference exists yet for tracker.linktypes, tracker.linktypes.list, shown as plain text. See CONTRIBUTING.md for the intentional exclusions (UI-only endpoints with no public REST API) and per-method notes.

Layout

src/ycli/
├── cli/                # root Typer CLI  → `ycli` / `yandex-cli` (app · context · output)
├── mcp/                # root FastMCP server → `ycli mcp start` (read/write, `[mcp]` extra)
├── settings.py         # AppConfig + Credentials (pydantic-settings)
├── log.py              # stderr logging setup (stdlib)
└── yandex/
    ├── tracker/        # per-domain SDK …
    ├── wiki/           #   each resource group has:
    └── forms/          #   client.py · cli.py · mcp.py · models.py
plugins/yandex-360/     # distributable Claude Code plugin (skills + instructions)
references/             # vendored Yandex API reference docs (local-only; see references/README.md)

Development

uv sync --all-extras   # --all-extras pulls in the `mcp` extra the tests exercise
uv run pytest          # 100% coverage gate; HTTP stubbed with `responses` (no live network)

See CONTRIBUTING.md for conventions and how to add an endpoint. Contributions welcome.

License

MIT © 2026 Sava Znatnov

Metadata

Release files for yandex-cli 0.24.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for yandex-cli 0.24.2
File Size Uploaded
yandex_cli-0.24.2.tar.gz 257.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for yandex-cli 0.24.2
File Interpreter ABI Platform
yandex_cli-0.24.2-py3-none-any.whl Python 3 none any Details

Total release size: 651.4 kB

Release files / yandex_cli-0.24.2.tar.gz

Download URL yandex_cli-0.24.2.tar.gz
Size 257.5 kB
Tags Source
SHA-256 checksum
How to use checksums
186c48e22acfb84b3ca2b646abd1c521b47ab146fdf464c84f175f8f6dfbeed7
BLAKE2b-256 checksum
How to use checksums
af0232782718f04998c9a81a951ff3dd7a4feb76249e50f30f473feffd8ee0df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / yandex_cli-0.24.2-py3-none-any.whl

Download URL yandex_cli-0.24.2-py3-none-any.whl
Size 393.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f49c2cc2519d351f60a8e4b77af541cc1e023c76087d88ca0d1454592227e227
BLAKE2b-256 checksum
How to use checksums
6f5262ac8966e95203aa7b5e0e712023571773618534849095a0fa7c1f8c3324
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.24.2 This release

2 release files

0.17.1

2 release files

0.16.1

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page