MCP server: One MCP server.

Yandex 360 (ycli)

@bim-baMCP server · External

Yandex 360 Tracker, Wiki and Forms: read and write tools with honest read-only annotations.

Issue trackingv0.142.0MITPython
Freeno charge per call

Runs on your machine from its package; the steps are below.

ycli in action
From the README

What it does

  1. Reads
  2. Writes
  3. High impact

At most: moves money, runs code or commands, deletes data, or sends messages for you.

What it costs

Free

Odel charges nothing per call. The publisher may charge for its own service.

Runs locally over stdio

This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).

PyPIyandex-cliv0.142.0

Run

uvx yandex-cli

MCP client config

{
  "mcpServers": {
    "yandex-360-ycli": {
      "command": "uvx",
      "args": [
        "yandex-cli"
      ]
    }
  }
}
Dockerghcr.io/bim-ba/ycli:0.142.0

Run

docker run -i --rm ghcr.io/bim-ba/ycli:0.142.0

MCP client config

{
  "mcpServers": {
    "yandex-360-ycli": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/bim-ba/ycli:0.142.0"
      ]
    }
  }
}
README15 min read

ycli

Yandex 360 for people and for agents.

Tracker, Wiki and Forms from a command line, an MCP server and Python: one tool, and one name for each operation everywhere.

English · Русский

CI Coverage PyPI Python License Docs DeepWiki

ycli in action
  • A command line that scripts well. JSON when piped, ready for jq, --dry-run for every write, an exit code for each kind of failure.
  • An MCP server agents can trust. Every tool says whether it reads, writes or destroys; serve only reads, or a small everyday set.
  • A typed Python SDK. Pydantic models for every answer, and examples the test suite runs.
  • Careful with your data. A delete asks first, and your token goes only to Yandex's own hosts.

Documentation: ycli.savaznatnov.dev.

Install

bash
uv tool install 'yandex-cli[mcp]'   # the ycli command, with the MCP server
uvx yandex-cli --help               # or run it once, without installing
pipx install 'yandex-cli[mcp]'      # or with pipx

The command is ycli (also yandex-cli). Then sign in: ycli auth login (how).

Writing Python? Add the SDK to your project: uv add yandex-cli.

ExtraAddsInstall
mcpthe MCP server, ycli mcp startuv tool install 'yandex-cli[mcp]'
service-accountthe SDK's ServiceAccountAuth for a Yandex Cloud service-account keyuv add 'yandex-cli[service-account]'

Connect your AI client

Every client gets the same MCP server, uvx --from 'yandex-cli[mcp]' ycli mcp start, and the same two variables.

ClientFastest way
Claude Code/plugin marketplace add bim-ba/ycli, then /plugin install yandex-360@ycli
Claude Desktopopen the .mcpb bundle from the latest release
Cursorone-click install
VS Codeone-click install
Windsurf (Devin Desktop)config file
Zedconfig file
Codexconfig file
Gemini CLIconfig file
opencodeconfig file
Any other MCP clientthree values to copy

Also: a Docker image, ghcr.io/bim-ba/ycli (as a server or a plain CLI), pipelines, and the official MCP Registry entry io.github.bim-ba/ycli.

Something not working? If it does not work.

Use it

Command line

bash
ycli tracker issues get TRACKER-1                  # a table at a terminal
ycli tracker issues get TRACKER-1 | jq .summary    # JSON when piped
ycli -o yaml wiki pages get onboarding             # or pick: -o json | yaml | pretty | csv | markdown | ndjson | name
ycli tracker boards delete 7 --dry-run             # print the request a write would send
ycli tracker boards delete 7 --yes                 # a delete asks first; --yes answers
ycli api issues/TRACKER-1 --service tracker        # an endpoint ycli does not wrap

More: Script the CLI, Call an unwrapped endpoint, the CLI reference.

MCP server

bash
ycli mcp start                     # every tool, reads and writes
ycli mcp start --read-only         # reads only
ycli mcp start --toolsets core     # about 40 everyday tools, for a client that caps the count
ycli mcp methods --toolsets core   # list the tool names without starting the server

More: Serve the MCP server, Self-host over HTTP for a team, the tool reference.

Python

python
from ycli.yandex.tracker.client import TrackerClient

tracker = TrackerClient(oauth_token="…", organization_id="…")
print(tracker.issues.get("TRACKER-1").summary)

More: the SDK reference.

Claude Code plugin

/plugin marketplace add bim-ba/ycli
/plugin install yandex-360@ycli

It adds the MCP server and five skills (yandex-360, yandex-360-tracker, yandex-360-wiki, yandex-360-forms, yandex-360-datalens) that teach an agent the commands and the API's quirks. Source: plugins/yandex-360/.

Configure

bash
ycli auth login     # gets a token through Yandex ID, finds your organization, saves both to .env
ycli auth status    # whose token it is, and whether each service accepts it
ycli doctor         # something not working? every check in order, with the fix

ycli auth login needs a Yandex OAuth app of your own the first time: Authenticate walks you through it. ycli reads two variables, from the environment or a .env file:

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

Timeouts, retries, limits, logging and the exit codes are in the configuration reference.

Coverage

468 operations across 88 resources: Tracker 190, Wiki 58, Forms 86, DataLens 134

ycli wraps 468 operations across 88 resources of the Tracker, Wiki, Forms, and DataLens API. Every one is reachable from the Python SDK and the CLI, and 458 MCP tools serve them to agents (456 per service plus schema_get, status_get).

Legend. ✅ in CLI or MCP means the resource is reachable on that surface; MCP tools carry honest hints (reads are readOnlyHint, writes say whether they are destructive or idempotent), and ycli mcp start --read-only serves only the reads. Resource and operation names link to the official Yandex API reference. An operation has one of three states against what Yandex publishes. Covered (no mark): ycli sends every published parameter and reads every published field. Partial (◐): ycli wraps it and differs somewhere; the mark links to the row that says where and why. Not covered (○): Yandex publishes it and ycli does not wrap it; these are listed under each service. Wiki, Forms and DataLens are measured against their OpenAPI documents; Tracker publishes none, so its state is measured against the reference pages (operations, and query parameters where a page lists them). DataLens is in progress, wrapped section by section: the operations of a section ycli has not begun are pending, not missing. Generated from the code by scripts/gen_coverage.py; do not edit by hand.

Tracker

34 resources · 190 operations · 187 MCP tools

Issues & work items

Agile boards

ResourceOperationsCLIMCP
boardslist · get · create · update · delete✅✅
sprintslist · get · create · update · delete · start · archive✅✅
columnslist · get · create · update · delete✅✅

Dictionaries

ResourceOperationsCLIMCP
prioritieslist · create · update✅✅
statuseslist · create · update✅✅
resolutionslist · create · update✅✅
issuetypeslist · create · update✅✅
linktypeslist✅✅

Fields, queues & structure

Automation & bulk

Entities, users & search

Not covered (2)

  • ○ GET /boards: boards list reads the paginated GET /boards/_paginate
  • ○ GET /users: users list reads the paginated GET /users/_relative

Wiki

10 resources · 58 operations · 56 MCP tools

Pages

Collaboration

Grids (dynamic tables)

Async & uploads

Identity

ResourceOperationsCLIMCP
meget✅✅

Forms

16 resources · 86 operations · 79 MCP tools

Surveys & questions

Responses & export

Integrations

ResourceOperationsCLIMCP
hookslist · get · create · update · delete✅✅
subscriptionslist · get · create ◐ · update ◐ · delete · attach✅✅
variableslist✅✅
notificationslist · get · status_get · restart · cancel · errors_list✅✅

Distribution

ResourceOperationsCLIMCP
keysetslist · get · create · update · delete · download✅✅
fillingget · submit · suggest✅✅

Media

ResourceOperationsCLIMCP
filesupload · verify · download · delete✅✅
imagesupload · clone✅✅

Identity

ResourceOperationsCLIMCP
meget✅✅

DataLens

28 resources · 134 operations · 134 MCP tools

Organization

ResourceOperationsCLIMCP
tenantdetails_get✅✅
memberslist✅✅
licensinglicenses_list · licenses_assign · limit_get · limit_set✅✅

Collections & workbooks

Entries

Data

ResourceOperationsCLIMCP
connectionsget · create · update · delete✅✅
datasetsget · create · update · delete · validate · data_get✅✅

Charts, dashboards, reports & pages

SQL

ResourceOperationsCLIMCP
sqlqueriesget · create · update · delete · run✅✅

Cloud environments

ResourceOperationsCLIMCP
cloudenvironmentslist · get · create · update · delete✅✅
cloudenvironmentstoragebucket_objects_list · bucket_object_metadata_get · bucket_download_url_create · bucket_upload_url_create✅✅
restcatalogslist · create✅✅
lakehouseoperationsget✅✅
trinoclusterslist · get · create · delete · start · stop · catalog_create · catalog_delete · resource_presets_list · resource_preset_get✅✅
sparkclusterslist · get · create · delete · start · stop · resource_presets_list · resource_presets_get✅✅
sparkapplicationslist · get · create · cancel · log_list✅✅

Embedding

ResourceOperationsCLIMCP
embedslist · create · update · delete✅✅
embeddingsecretsget · list · create · delete✅✅

Not covered (9)

  • ○ POST /rpc/checkFavorites: new section published 2026-10, wrapping not decided
  • ○ POST /rpc/createFolder: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/deleteFolder: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/dlsSuggest: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/getPermissions: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/listDirectory: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/listFavorites: new section published 2026-10, wrapping not decided
  • ○ POST /rpc/modifyPermissions: the old placement model (folders); the organization has none to check it on (#394)
  • ○ POST /rpc/moveFolderEntry: the old placement model (folders); the organization has none to check it on (#394)

Every resource and operation above deep-links to the Yandex API reference: 406 of 468 operations resolve to their own endpoint page and 20 to their resource's page. No public API reference exists yet for datalens.cloudenvironments, datalens.cloudenvironments.create, datalens.cloudenvironments.delete, datalens.cloudenvironments.get, datalens.cloudenvironments.list, datalens.cloudenvironments.update, datalens.cloudenvironmentstorage, datalens.cloudenvironmentstorage.bucket_download_url_create, datalens.cloudenvironmentstorage.bucket_object_metadata_get, datalens.cloudenvironmentstorage.bucket_objects_list, datalens.cloudenvironmentstorage.bucket_upload_url_create, datalens.lakehouseoperations, datalens.lakehouseoperations.get, datalens.restcatalogs, datalens.restcatalogs.create, datalens.restcatalogs.list, datalens.sparkapplications, datalens.sparkapplications.cancel, datalens.sparkapplications.create, datalens.sparkapplications.get, datalens.sparkapplications.list, datalens.sparkapplications.log_list, datalens.sparkclusters, datalens.sparkclusters.create, datalens.sparkclusters.delete, datalens.sparkclusters.get, datalens.sparkclusters.list, datalens.sparkclusters.resource_presets_get, datalens.sparkclusters.resource_presets_list, datalens.sparkclusters.start, datalens.sparkclusters.stop, datalens.sqlqueries, datalens.sqlqueries.create, datalens.sqlqueries.delete, datalens.sqlqueries.get, datalens.sqlqueries.run, datalens.sqlqueries.update, datalens.tenant, datalens.tenant.details_get, datalens.trinoclusters, datalens.trinoclusters.catalog_create, datalens.trinoclusters.catalog_delete, datalens.trinoclusters.create, datalens.trinoclusters.delete, datalens.trinoclusters.get, datalens.trinoclusters.list, datalens.trinoclusters.resource_preset_get, datalens.trinoclusters.resource_presets_list, datalens.trinoclusters.start, datalens.trinoclusters.stop, 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.

Against the published API

What ycli sends, replayed from its contract tests, compared with what Yandex publishes: the Wiki, Forms and DataLens OpenAPI documents and Tracker's API reference (prose, so only operations and the query parameters a page lists are compared). A request body is compared only where ycli has a typed model for it and the model is closed; the Bodies compared column says how many that is, so an empty list is not read as a match. The published side is the snapshot in scripts/api_snapshot/; a weekly job fetches it again and opens an issue when Yandex has changed it.

ServicePublishedWrappedNot wrappedOperations that differBodies comparedSource
Tracker1901880 (+2 on purpose)0—API reference
Wiki56560024 of 24OpenAPI
Forms84840826 of 30[OpenAPI](http

Similar modules

Browse Issue tracking