MCP server that surfaces Azure DevOps work-item activity for a configured team roster, so VS Code Copilot Chat can answer manager-style questions like 'what did Ashish work on last week?' or 'analyze the team's last 6 months'.
Project description
ado-team-activity-mcp
A local Model Context Protocol (MCP) server that lets you ask GitHub Copilot Chat in VS Code manager-style questions about Azure DevOps work-item activity for your team:
"What did Ashish work on yesterday?" "Summarize Priya's last 7 days." "Give me a team standup for the last 3 days." "Analyze Abhishek's last 6 months."
The server resolves the teammate name against a config roster you provide, runs WIQL queries against Azure DevOps, and returns structured work-item data (including comments). Copilot Chat's model produces the natural-language summary.
Read-only by design — no work-item creation, edits, or comments are ever made.
Architecture
Copilot Chat ──(MCP tool call)──► ado-team-activity-mcp (Python, stdio)
│
▼
Azure DevOps REST (WIQL + Work Items + Comments)
▲
│
DefaultAzureCredential (az login)
Tools exposed
| Tool | Purpose |
|---|---|
list_team_members() |
Return the configured roster (for name disambiguation). |
get_teammate_activity(name, days=?, include_comments=True) |
All work-item activity for one teammate over the window. Comments included by default. |
get_team_activity(days=?, include_comments=True) |
Same, looped over the whole roster, in one round-trip. |
summarize_contributions(name, days=180, ...) |
Aggregated stats for long windows: by-month, gaps, ownership (User Stories / Bugs), active items, cadence. Use this for perf-review / trend / quarter / "last N months" questions. |
get_work_item(id) |
Drill into a specific item (fields + last 10 revisions + comments). |
get_work_item_comments(id) |
Comments-only fetch. |
Each item in activity responses carries an activity_reasons list — any of
assigned_and_changed, changed_by, created_by, closed_by — so the
chat model can group its summary cleanly.
Install (recommended path — for end users)
You need Python 3.11+, Azure CLI, and VS Code with GitHub Copilot Chat.
1. Install the server
pipx is the cleanest option (isolated venv, exposes the command globally):
pipx install ado-team-activity-mcp
If you don't have pipx:
python -m pip install --user pipx
python -m pipx ensurepath
# restart your shell, then:
pipx install ado-team-activity-mcp
2. Sign in to Azure DevOps
az login
If your ADO org lives in a non-default tenant, pass it explicitly:
az login --tenant <tenant-id>
3. Create your config
Save this as config.yaml somewhere stable (e.g. C:\Users\<you>\.ado-team-activity\config.yaml):
organization_url: https://dev.azure.com/your-org
project: YourProject
default_lookback_days: 1
team:
- alias: ashish
display_name: Ashish Kumar
unique_name: ashish@contoso.com
- alias: priya
display_name: Priya Sharma
unique_name: priya@contoso.com
How to find the values:
organization_url— the root of your ADO URL:https://dev.azure.com/<org>(no trailing slash, no project segment).project— the project name (case-sensitive), the segment right after the org in the URL.unique_name— the user's ADO sign-in (UPN). Easiest way: open any work item assigned to that teammate, click the Assignee chip, and copy the email shown under their name.alias— short handle you'll type in Copilot Chat. Must be unique.
Do NOT commit
config.yamlto source control if it contains internal info. The roster is per-manager.
4. Register the server with VS Code
Open VS Code's user MCP configuration:
- Command Palette → "MCP: Open User Configuration"
Add this entry under servers:
{
"servers": {
"ado-team-activity": {
"type": "stdio",
"command": "ado-team-activity-mcp",
"env": {
"ADO_ACTIVITY_CONFIG": "C:/Users/<you>/.ado-team-activity/config.yaml"
}
}
}
}
Replace the ADO_ACTIVITY_CONFIG path with wherever you saved your config.yaml. Use forward slashes on Windows.
5. Reload the VS Code window
Then open Copilot Chat in Agent mode and try the prompts below.
Example prompts
Day-to-day:
What did Ashish work on yesterday?Anything blocked on the team in the last 3 days?Give me a standup for the team for today.Tell me more about work item 12345.What's the discussion on 1738?
Performance / trend:
Analyze Vibhuti's last 6 months.Compare Ashish, Vibhuti, and Abhishek over the last quarter.Is Abhishek still active in this project?
Troubleshooting
| Symptom | Fix |
|---|---|
ado-team-activity-mcp: command not found |
Run pipx ensurepath, restart shell. Or use the absolute path printed by pipx install. |
Config file not found at '...' |
Set ADO_ACTIVITY_CONFIG to an absolute path in your mcp.json. Use forward slashes. |
DefaultAzureCredential failed to retrieve a token |
Run az login (with --tenant if needed) and retry. |
| Zero items returned for someone you know is active | unique_name doesn't match ADO's UPN. Confirm by opening a work item assigned to them and copying the email from the Assignee chip exactly. |
| Roster resolves the wrong person | Add a unique alias for the ambiguous teammate and use it in chat. |
| Tool not visible in Copilot Chat | Reload the VS Code window after editing the user-level MCP config. |
Develop locally (contributors)
git clone <repo-url>
cd ado-team-activity-mcp
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
Copy-Item config.example.yaml config.yaml # then fill in
az login
python scripts\check_auth.py # should print "All checks passed."
pytest # roster unit tests
The workspace's .vscode/mcp.json is already wired for development —
it runs the server out of the local .venv using python -m ado_activity_mcp. Reload
VS Code after the install and you're ready.
Publish a new version (maintainer)
# bump version in pyproject.toml first
pip install --upgrade build twine
python -m build
twine upload dist/*
You'll need a PyPI account and an API token saved
in ~/.pypirc.
Privacy & security
- Read-only — the server calls only
query_by_wiql,get_work_items,get_work_item,get_revisions,get_comments, andget_projects. No create/update/delete endpoints anywhere in the code. - No telemetry — nothing is sent anywhere except Azure DevOps (and Entra ID for the token).
- Credentials never touch the config file — auth is
DefaultAzureCredential. Your token lives only in memory and is refreshed via your existingaz loginsession. - Roster is local to you — every manager maintains their own
config.yaml.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ado_team_activity_mcp-0.1.0.tar.gz.
File metadata
- Download URL: ado_team_activity_mcp-0.1.0.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86a3b35f1ffa379ca55acf3ece9ff1e7b2ac833902dda4c92cfb4de39f109017
|
|
| MD5 |
574250c553d6ea70bc217ebb0166f472
|
|
| BLAKE2b-256 |
116a8a6ef1a5bb87e39d6367b4244bded9d70f9138c99d459da641d72924defc
|
File details
Details for the file ado_team_activity_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ado_team_activity_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ad8a8113f9e1903ffcd24dd40f08f3f4b3e8094e7f4c3111bd088f507099741
|
|
| MD5 |
cb6327e8a26937b66ba0b57ecabb6b4f
|
|
| BLAKE2b-256 |
24ae80bfd797231cad002df3343d6a35ca8832f6bb8fae72afefc4f5a857d18c
|