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

Why ycli

  • 🧩 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-only tracker_*, wiki_*, forms_* tools so agents explore safely; writes stay in the CLI/SDK.
  • 🛡️ Trustworthy — typed pydantic models, the real Yandex API quirks handled for you, and a test suite kept at 100% coverage.
  • Zero-friction startuv add yandex-cli, two env vars, 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.

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-only)

Run it over stdio (needs the mcp extra):

ycli mcp start

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, pagination

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).

Coverage

ycli wraps the near-complete public REST API of Tracker, Wiki, and Forms — 230 operations across 50 resources, every one reachable from the Python SDK and the CLI. Reads are additionally exposed as 80 read-only MCP tools for agents.

Legend — reads ship on SDK + CLI + MCP; writes and binary downloads on SDK + CLI (the MCP server is read-only by design). In each table SDK and CLI mean the operation is wrapped on that surface; MCP is ✅ when the resource exposes at least one read-only tool. These tables are generated from the code by scripts/gen_coverage.py — do not edit by hand.

Tracker

32 resources · 153 operations · 57 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

Entities, users & search

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 · 13 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 · 34 operations · 10 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 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

See docs/api-coverage.md for the intentional exclusions (UI-only endpoints with no public REST API) and per-method notes.

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

Header casing differs per service (Tracker X-Org-ID, Wiki/Forms X-Org-Id) — ycli handles it for you.

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 for the full CLI; the read scopes alone are enough for the read-only MCP server). Copy the ClientID — and the Client secret if you want the headless flow:

export YANDEX_OAUTH_CLIENT_ID=...        # from your app
export 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.

Project layout

src/ycli/
├── cli.py              # root Typer CLI  → `ycli` / `yandex-cli`
├── mcp.py              # root FastMCP server → `ycli mcp start` (read-only, `[mcp]` extra)
├── log.py              # central loguru config
└── 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)
docs/references/        # vendored Yandex API reference docs

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. Contributions welcome — the coverage roadmap is a good place to find a first issue.

License

MIT © 2026 Sava Znatnov

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yandex_cli-0.10.0.tar.gz (190.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yandex_cli-0.10.0-py3-none-any.whl (328.4 kB view details)

Uploaded Python 3

File details

Details for the file yandex_cli-0.10.0.tar.gz.

File metadata

  • Download URL: yandex_cli-0.10.0.tar.gz
  • Upload date:
  • Size: 190.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for yandex_cli-0.10.0.tar.gz
Algorithm Hash digest
SHA256 cd703f7b29f22515678e91079f4a0aa14f16545f0519b32058b399d03624beba
MD5 577d3b83098bc21abafb1fb0d4336b44
BLAKE2b-256 5f45c88e8fd037b36dd6c9be374a86621abc7d7eee8859403158e0d70827f3df

See more details on using hashes here.

File details

Details for the file yandex_cli-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: yandex_cli-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 328.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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}

File hashes

Hashes for yandex_cli-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45ff2cb1752e4baea956f8fc5d471d2e7f15b0aa17c39a17edfad3a9929f37ae
MD5 b8da32cb51292d3aa51af66d9cd9725e
BLAKE2b-256 78039d0c36a018f04fb0168772e0318fcc153e26615ad9ff105a3e23dbd26f5a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page