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.
$ 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
| Comando | Cosa fa |
|---|---|
azdo context | Rileva org/project/repo dal git remote corrente (o file .azdo). Mostra se l'org è registrata nella config locale. |
azdo config list | Elenca 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 X | Rimuove un'organizzazione e il suo PAT dalla config locale. |
azdo config path | Mostra il percorso del file di configurazione su disco. |
📋 Work Items
| Comando | Cosa 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 child | Collega 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
| Comando | Cosa 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
| Comando | Cosa 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
| Comando | Cosa 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
| Comando | Cosa 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 main | Crea un nuovo branch da un ref sorgente (branch o SHA). |
azdo repo branch delete --repo X --name feature/foo | Cancella 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
| Comando | Cosa 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 10 | Vota una PR: 10=approva, 5=approva+suggerimenti, 0=reset, -5=in attesa, -10=respingi. |
azdo pr abandon --pr 1234 | Abbandona 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
| Comando | Cosa 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
| Comando | Cosa 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" }
}
}