v1.3.1 · 68 MCP Tools · 70+ CLI Commands

Azure DevOps senza browser

CLI potente e MCP server in C#/.NET 8 per interagire con Azure DevOps direttamente dal terminale — o tramite il tuo agente AI preferito.

68MCP Tools
.NET 8C# 12
MITOpen Source
3Piattaforme
$ azdo context
Org        : contoso
Project    : MyApp
Repository : backend
Registered : yes

$ azdo pr create --title "Add OAuth" --draft
✓ PR #1234 created — https://dev.azure.com/contoso/...

$ azdo build list --top 10 --table
ID   BUILD         PIPELINE     STATUS      RESULT     BRANCH
123  20260715.3     CI           completed   succeeded  main
122  20260715.2     CI           completed   failed     feature/oauth

$ azdo mcp serve
🚀 MCP server ready — 68 tools available

Perché azdo?

🤖

AI-Native

68 tool MCP pronti per Claude Desktop, Copilot, Cursor e qualunque client compatibile. Output compatto ottimizzato per LLM.

Zero Config

Rilevamento automatico dell'organizzazione dal git remote o file .azdo. Un solo file di configurazione centrale per tutte le org.

📊

Output Tabellare

Tutti i comandi di lettura supportano --table per vedere i risultati come tabella ASCII nel terminale. Sovrascrive --compact.

🔐

PAT & Entra ID

Autenticazione via Personal Access Token o Azure Identity. Permessi 600 su Unix, secure storage nativo.

📦

Single Binary

Un solo eseguibile standalone. Zero dipendenze runtime. Pubblicazione cross-platform: Linux, macOS, Windows.

🔌

HTTP + stdio

Trasporto stdio per client desktop, HTTP Streamable per browser e VS Code web. Middleware pipeline estensibile.

🛡️

Sicurezza Concorrenza

Auth applicata per-richiesta, mai su client condiviso. Config salvata atomicamente con permessi 600. PAT passato a git via variabili env, non liste processo.

Cache Intelligente

TTL configurabile da file config. Le operazioni di scrittura invalidano automaticamente i dati correlati in cache. Perfetto per flussi interattivi e MCP.

Installazione

dotnet tool

dotnet tool install -g AzDo

Single Binary

# macOS ARM64
curl -L "..." -o azdo.tar.gz
tar xzf azdo.tar.gz && sudo cp azdo /usr/local/bin/

# Linux x64
curl -L "..." -o azdo.tar.gz
tar xzf azdo.tar.gz && sudo cp azdo /usr/local/bin/

Build from source

git clone https://github.com/Lupala-coder/azdo
cd azdo/src/DevOpsCli
dotnet build -c Release
# binary: bin/Release/net8.0/azdo

Quick Setup

# 1. Configura la tua org
azdo config add --org contoso --pat "your-pat-token" --project MyApp

# 2. Verifica
azdo context

# 3. Usa la CLI
azdo pr list --status active --table
azdo wi query --wiql "SELECT [System.Id] FROM WorkItems WHERE [System.State]='Active'" --table
azdo build list --top 10 --table

# 4. Oppure avvia il server MCP
azdo mcp serve

CLI Commands

Tutti i comandi accettano --org e --project. Quelli di lettura supportano --compact e --table.

🔍 Context & Config

ComandoCosa fa
azdo contextRileva org/project/repo dal git remote corrente (o file .azdo). Mostra se l'org è registrata nella config locale.
azdo config listElenca tutte le organizzazioni configurate con i PAT mascherati.
azdo config add --org X --pat <token>Registra un'organizzazione con un PAT. Il token viene salvato in ~/.config/devops-cli/config.json con permessi 600 (Unix) e scritto atomicamente. Non lascia mai la tua macchina.
azdo config remove --org XRimuove un'organizzazione e il suo PAT dalla config locale.
azdo config pathMostra il percorso del file di configurazione su disco.

📋 Work Items

ComandoCosa fa
azdo wi query --wiql "SELECT ..." [--top 10] [--table]Esegue una query WIQL. Con --table mostra tabella nel terminale.
azdo wi get --ids 1,2,3 [--fields ...] [--table]Recupera uno o più work item per ID. --fields filtra i campi restituiti.
azdo wi create --type Task --title "..." [--assigned-to ...] [--parent 1234]Crea un nuovo work item. Collega a un parent, assegna a un utente, metti in un'iterazione.
azdo wi update --id 1234 [--state Active] [--title "..."]Aggiorna un work item. Solo i campi forniti vengono modificati.
azdo wi comment --id 1234 --text "..."Aggiunge un commento alla sezione Discussion del work item.
azdo wi hierarchy --id 1234 [--table]Mostra il work item con l'albero dei figli ricorsivo. Con --table indentato.
azdo wi link --source 1234 --target 5678 --type childCollega due work item. Tipi: child, parent, related, duplicate.
azdo wi search --query "keyword" [--type Bug] [--table]Ricerca full-text nei work item. Richiede Azure DevOps Search abilitato.

📁 Projects

ComandoCosa fa
azdo project list [--top 20] [--table]Elenca tutti i progetti nell'organizzazione con id, nome, stato, visibilità.
azdo project get --id <nome-o-id> [--table]Dettaglio di un singolo progetto per UUID o nome.
azdo project clone-all [--output dir] [--ssh] [--parallel 4]Clona (o pull) tutti i repo di tutti i progetti. Organizza in org/project/repo. --dry-run per anteprima.

📊 Boards — Iterazioni, Team, Aree

ComandoCosa fa
azdo board iterations [--team X] [--table]Elenca le iterazioni/sprint del progetto con date inizio/fine.
azdo board iteration current [--team X] [--table]Restituisce lo sprint attualmente attivo per un team. Utile negli script CI/CD.
azdo board teams [--table]Elenca tutti i team del progetto.
azdo board members --team-id X [--table]Elenca i membri di un team con display name e unique name.
azdo board areas [--depth 5] [--table]Elenca le area path come albero. Con --table indentate per profondità.
azdo board backlog [--team X] [--table]Mostra la configurazione del product backlog (livelli: Epics, Features, Stories).
azdo board sprint --iteration X [--team X] [--table]Mostra i work item assegnati a uno sprint specifico.
azdo board iteration create --name "Sprint 42" [--start ...] [--finish ...]Crea un nuovo sprint con date ISO 8601.
azdo board area create --name "NewArea" [--parent "ParentArea"]Crea una nuova area path, opzionalmente sotto una parent.
azdo board team create --name "MyTeam" [--description "..."]Crea un nuovo team nel progetto.
azdo board team set-area --team-id X --area-path "Project\\Area"Assegna un'area path a un team.
azdo board team add-member --team-id X --member-id <guid>Aggiunge un utente a un team. Il GUID si trova con identity search.
azdo board team remove-member --team-id X --member-id <guid>Rimuove un utente da un team (non dall'organizzazione).

👥 Identity, Users & Groups

ComandoCosa fa
azdo identity search --query "email..." [--top 20] [--table]Cerca identità per email o display name (Graph API). Restituisce descriptor (aad.…), email, principal name. Richiede vso.graph.
azdo identity list-users [--top 100] [--table]Elenca tutti gli utenti dell'organizzazione con licenze e stato (MEM API). Richiede vso.memberentitlementmanagement.
azdo identity add-user --email user@example.com [--license express]Invita un utente nell'organizzazione. Licenze: express, stakeholder, basic, advanced.
azdo identity remove-user --id <guid>Rimuove un utente dall'organizzazione per entitlement ID. Permanente.
azdo identity list-groups [--table]Elenca tutti i gruppi con descriptor (vssgp.…), origine, scope.
azdo identity group-members --descriptor vssgp.… [--table]Elenca i membri di un gruppo. I nomi vengono risolti automaticamente.
azdo identity group-create --name "MyGroup" [--description "..."]Crea un nuovo gruppo (project-scoped se viene fornito --project).
azdo identity group-member-add --group vssgp.… --member aad.…Aggiunge un utente o gruppo a un gruppo tramite descriptor.
azdo identity group-member-remove --group vssgp.… --member aad.…Rimuove un membro da un gruppo. Non cancella l'utente/gruppo.

📦 Repository & Git

ComandoCosa fa
azdo repo list [--top 20] [--table]Elenca tutti i repository del progetto con id, nome, branch default.
azdo repo create --name "MyNewRepo"Crea un nuovo repository Git vuoto nel progetto.
azdo repo branches --repo X [--search feature] [--table]Elenca i branch di un repository. --search filtra per nome (contiene).
azdo repo branch create --repo X --name feature/foo --from mainCrea un nuovo branch da un ref sorgente (branch o SHA).
azdo repo branch delete --repo X --name feature/fooCancella un branch remoto. Il clone locale non viene toccato.
azdo repo commits --repo X [--branch main] [--author ...] [--since ...] [--top 50] [--table]Elenca i commit con filtri: branch, autore, intervallo date, paginazione.
azdo repo diff --repo X --base main --target feature/foo [--table]Mostra il diff tra due commit/branch. Con --table: tabella CHANGE | PATH.
azdo repo file --repo X --path src/file.cs [--ref main] [--table]Recupera il contenuto di un file da un branch/commit specifico.
azdo repo file push --repo X --path f.cs --content "..." --branch main --message "..."Crea o aggiorna un file via commit diretto. Nessun clone locale necessario.
azdo repo file delete --repo X --path f.cs --branch main --message "..."Cancella un file via commit diretto.
azdo repo tags --repo X [--table]Elenca i tag (annotated e lightweight) del repository.
azdo repo tag create --repo X --name v1.0 --message "..." --object-id <sha>Crea un annotated tag che punta a un commit SHA.
azdo repo clone-all [--output dir] [--ssh] [--parallel 4]Clona (o pull) tutti i repository del progetto corrente.

🔄 Pull Requests

ComandoCosa fa
azdo pr list [--repo X] [--status active] [--creator ...] [--table]Elenca PR con filtri. Stato: active, abandoned, completed, all.
azdo pr create --title "..." [--source ...] [--target main] [--draft] [--work-item 1234]Crea una PR. Default: source = branch corrente, target = main, repo = rilevato dal git remote. I reviewer devono essere GUID.
azdo pr vote --pr 1234 --voter-id <guid> --vote 10Vota una PR: 10=approva, 5=approva+suggerimenti, 0=reset, -5=in attesa, -10=respingi.
azdo pr abandon --pr 1234Abbandona una PR (chiude senza mergiare).
azdo pr complete --pr 1234 [--delete-source]Completa (mergia) una PR. --delete-source rimuove il branch sorgente.
azdo pr detail --pr 1234 [--table]Dettaglio completo PR: titolo, stato, merge status, voti dei reviewer, label. Con --table mostra tabella reviewer.
azdo pr threads --pr 1234 [--table]Elenca i thread di review con commenti, file, numeri di riga, stato.
azdo pr comment --pr 1234 --text "..." [--file src/Foo.cs --line 42]Aggiunge un commento. Con --file/--line: commento inline sul diff.

🏗️ Build, Pipeline & Release

ComandoCosa fa
azdo build list [--top 20] [--definition 5] [--table]Elenca le build recenti. Filtra per definition ID. --table perfetto per dashboard CI.
azdo build status --id 1234 [--table]Stato dettagliato build con timeline (task, fasi, tempi). Con --table: info block + tabella TIMELINE.
azdo build trigger --definition 5 [--branch refs/heads/main]Avvia una nuova esecuzione della pipeline.
azdo build logs --id 1234 [--table]Elenca gli URL dei log di ogni task di una build.
azdo pipeline list [--top 20] [--table]Elenca tutte le pipeline YAML e classic con id, nome, folder, revision.
azdo release definitions [--search X] [--table]Elenca le definizioni di release. --search filtra per nome.
azdo release list [--definition 5] [--status active] [--table]Elenca le release con i rispettivi ambienti e stati di deployment.
azdo release trigger --definition 5 [--description "..."]Avvia una nuova release da una definizione.

📖 Wiki & 🔎 Search

ComandoCosa fa
azdo wiki list [--table]Elenca tutte le wiki del progetto.
azdo wiki page --wiki-id X --path "/Guide" [--table]Recupera una pagina wiki per path. Restituisce il contenuto Markdown.
azdo wiki upsert --wiki-id X --path "/Guide" --content "# Hello"Crea o aggiorna una pagina wiki. Contenuto in Markdown.
azdo search code --query "IDisposable" [--repo X] [--table]Ricerca full-text nel codice. Risultati: file, path, repo, numero di match.
azdo search wi --query "auth" [--type Bug] [--table]Ricerca full-text nei work item. Filtra per tipo.

68 MCP Tools

Tutti i tool accettano org e project come override. I tool di lettura supportano compact e table. Rilevamento automatico dal git remote o file .azdo.

🔍 Context

azdo_context azdo_context_set

📋 Work Items (8)

azdo_wi_query azdo_wi_get azdo_wi_create azdo_wi_update azdo_wi_comment azdo_wi_hierarchy azdo_wi_link azdo_wi_search

📁 Projects (3)

azdo_project_list azdo_project_get azdo_project_clone_all

📊 Boards (7)

azdo_iterations_list azdo_iteration_current azdo_teams_list azdo_members_list azdo_areas_list azdo_backlog_product azdo_backlog_sprint

📦 Repositories (13)

azdo_repo_list azdo_repo_create azdo_git_branches azdo_repo_branch_create azdo_repo_branch_delete azdo_git_commits azdo_git_diff azdo_git_file azdo_repo_file_push azdo_repo_file_delete azdo_repo_tags_list azdo_repo_tag_create azdo_repo_clone_all

🔄 Pull Requests (8)

azdo_pr_list azdo_pr_create azdo_pr_vote azdo_pr_update azdo_pr_detail azdo_pr_threads azdo_pr_comment azdo_pr_resolve

🏗️ Build & Pipeline (5)

azdo_build_list azdo_build_status azdo_build_trigger azdo_pipelines_list azdo_build_logs

🚀 Releases (3)

azdo_release_definitions azdo_release_list azdo_release_trigger

📖 Wiki (3)

azdo_wiki_list azdo_wiki_page_get azdo_wiki_page_upsert

🔎 Search (2)

azdo_code_search azdo_wi_search

👥 Identity & Users (9)

azdo_identity_search azdo_group_list azdo_group_members azdo_group_create azdo_group_member_add azdo_group_member_remove azdo_user_list azdo_user_add azdo_user_remove

⚙️ Admin (6)

azdo_iteration_create azdo_area_create azdo_team_create azdo_team_area_set azdo_team_member_add azdo_team_member_remove

Integrazioni AI

Claude Desktop

Aggiungi al claude_desktop_config.json:

{
  "mcpServers": {
    "azdo": {
      "command": "/usr/local/bin/azdo",
      "args": ["mcp", "serve"]
    }
  }
}

GitHub Copilot

Configura in ~/.config/github-copilot/cli/mcp-config.json:

{
  "mcpServers": {
    "azdo": {
      "command": "/usr/local/bin/azdo",
      "args": ["mcp", "serve"]
    }
  }
}

HTTP Transport

Per client browser-based (VS Code web, Copilot Chat web). Ascolta solo loopback; richieste cross-origin dei browser vengono rifiutate (403) per prevenire DNS-rebinding:

azdo mcp serve --transport http --port 9287

{
  "mcpServers": {
    "azdo": { "url": "http://localhost:9287/mcp" }
  }
}