@mcp-s/connectors 0.0.20261022190708 → 0.0.20261024071613
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/public/connectors/asana.json +1 -1
- package/dist/public/connectors/azure-devops.json +1 -1
- package/dist/public/connectors/bitbucket-datacenter.json +1 -1
- package/dist/public/connectors/bitbucket.json +1 -1
- package/dist/public/connectors/github.json +1 -1
- package/dist/public/connectors/gmail.json +1 -1
- package/dist/public/connectors/google-calendar.json +1 -1
- package/dist/public/connectors/google-workspace-admin.json +1 -1
- package/dist/public/connectors/google-workspace.json +1 -1
- package/dist/public/connectors/jira-server.json +1 -1
- package/dist/public/connectors/jira.json +1 -1
- package/dist/public/connectors/linear.json +1 -1
- package/dist/public/connectors/linkedin.json +1 -1
- package/dist/public/connectors/monday.json +1 -1
- package/dist/public/connectors/okta.json +1 -1
- package/dist/public/connectors/onedrive.json +1 -1
- package/dist/public/connectors/outlook-calendar.json +1 -1
- package/dist/public/connectors/outlook-mail.json +1 -1
- package/dist/public/connectors/salesforce.json +1 -1
- package/dist/public/connectors/sharepoint.json +1 -1
- package/dist/public/connectors/slack.json +1 -1
- package/dist/public/connectors/zendesk.json +1 -1
- package/dist/public/connectors/zoom.json +1 -1
- package/dist/public/index.json +24 -24
- package/dist/schema/auth.d.ts +27 -0
- package/dist/schema/auth.js +15 -0
- package/dist/schema/catalog.d.ts +12 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"azure-devops","status":"active","applications":["azure-devops"],"definition":{"display":{"name":"Azure DevOps","description":"Azure DevOps Services for source control, work tracking, CI/CD pipelines, wikis, and test management. Manage repositories, pull requests, work items, builds, pipeline runs, wiki pages, and test plans through the Azure DevOps REST API.","icon":"azure-devops.svg","website":"https://azure.microsoft.com/en-us/products/devops","category":"ci-cd-devops","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/azure-devops"},"api":{"base_url":"https://dev.azure.com"},"configuration":{"type":"object","properties":{"organization":{"type":"string","title":"Organization","placeholder":"contoso"},"project":{"type":"string","title":"Default Project","placeholder":"MyProject"}},"required":["organization"]},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/.default","499b84ac-1321-427f-aa17-267ca6975798/vso.profile","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.project_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code","499b84ac-1321-427f-aa17-267ca6975798/vso.code_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code_manage","499b84ac-1321-427f-aa17-267ca6975798/vso.code_status","499b84ac-1321-427f-aa17-267ca6975798/vso.threads_full","499b84ac-1321-427f-aa17-267ca6975798/vso.build","499b84ac-1321-427f-aa17-267ca6975798/vso.build_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.release","499b84ac-1321-427f-aa17-267ca6975798/vso.release_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.work","499b84ac-1321-427f-aa17-267ca6975798/vso.work_write","499b84ac-1321-427f-aa17-267ca6975798/vso.work_full","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki_write","499b84ac-1321-427f-aa17-267ca6975798/vso.test","499b84ac-1321-427f-aa17-267ca6975798/vso.test_write","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec","499b84ac-1321-427f-aa17-267ca6975798/vso.identity","499b84ac-1321-427f-aa17-267ca6975798/vso.graph","499b84ac-1321-427f-aa17-267ca6975798/vso.analytics","499b84ac-1321-427f-aa17-267ca6975798/vso.agentpools","499b84ac-1321-427f-aa17-267ca6975798/vso.serviceendpoint","499b84ac-1321-427f-aa17-267ca6975798/vso.packaging","499b84ac-1321-427f-aa17-267ca6975798/vso.taskgroups_read","499b84ac-1321-427f-aa17-267ca6975798/vso.variablegroups_read"],"defaultScopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.code_write","499b84ac-1321-427f-aa17-267ca6975798/vso.build_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.work_write","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki_write","499b84ac-1321-427f-aa17-267ca6975798/vso.test_write","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec"],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}},"apiKey":{"headerName":"Authorization","authorizationMapping":"'Basic ' & $base64encode(':' & token)"},"api-key-per-user":{"headerName":"Authorization","authorizationMapping":"'Basic ' & $base64encode(':' & token)","howtoMarkdown":"\n1. Go to [dev.azure.com](https://dev.azure.com) and open **User settings** (top right) → **Personal access tokens**\n2. Click **New Token**\n3. Pick the organization, set an expiration, and select the scopes you need (Code, Work Items, Build, Wiki, Test Management, ...)\n4. Click **Create** and copy the token immediately — it is only shown once\n5. Paste the token here (no username or colon needed)"}}},"tools":[{"name":"List Projects","description":"List all projects in the Azure DevOps organization that the authenticated user has access to. Use this first to discover project names, which nearly every other tool needs.","slug":"list-projects","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of project metadata the user already has access to.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"state_filter":{"type":"string","description":"Filter by project state. Defaults to 'wellFormed' (active projects).","enum":["all","wellFormed","createPending","deleting","new"]},"top":{"type":"number","description":"Maximum number of projects to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of projects to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/_apis/projects","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"stateFilter\": arguments.state_filter,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"List Project Teams","description":"List the teams defined in a project. Team names are required by the backlog, iteration, and capacity tools.","slug":"list-project-teams","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of team metadata within a project.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"mine":{"type":"boolean","description":"When true, return only the teams the authenticated user is a member of."},"top":{"type":"number","description":"Maximum number of teams to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of teams to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/_apis/projects/{project}/teams","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$mine\": arguments.mine,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Work Item Types","description":"List the work item types available in a project (Bug, User Story, Task, Epic, and any custom types) along with their fields and valid states. Call this before creating work items to learn which types and states the project's process allows.","slug":"list-work-item-types","ai_risk":{"level":"low","score":1,"reasoning":"Read-only process metadata lookup.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitemtypes","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Repositories","description":"List the Git repositories in a project. Returns repository IDs, names, default branches, and clone URLs.","slug":"list-repositories","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of repository metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"include_links":{"type":"boolean","description":"Include reference links in the response."},"include_all_urls":{"type":"boolean","description":"Include all remote URLs for each repository."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"includeLinks\": arguments.include_links,\n \"includeAllUrls\": arguments.include_all_urls\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Repository","description":"Get details of a single Git repository, including its default branch, size, and project.","slug":"get-repository","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a single repository.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Branches","description":"List the branches of a repository. Each entry includes the branch name and the commit it points at (objectId), which is what 'Create Branch' needs as its source commit.","slug":"list-branches","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of Git refs.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"name_contains":{"type":"string","description":"Return only branches whose name contains this substring, e.g. 'release'."},"top":{"type":"number","description":"Maximum number of branches to return. Defaults to 100.","default":100},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/refs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"filter\": \"heads/\",\n \"filterContains\": arguments.name_contains,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Branch","description":"Create a new branch pointing at an existing commit. Get the source commit SHA from 'List Branches' (the objectId of the branch you want to branch off) or from 'Search Commits'.","slug":"create-branch","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a new Git ref. Additive and easily deleted, but it writes to the repository.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"branch_name":{"type":"string","description":"Name of the new branch, without the 'refs/heads/' prefix, e.g. 'feature/checkout-redesign'."},"source_commit_id":{"type":"string","description":"Full 40-character SHA the new branch should point at. This is the objectId returned by 'List Branches' for the source branch."}},"required":["repository_id","branch_name","source_commit_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/refs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"[{\n \"name\": $contains(arguments.branch_name, \"refs/\") ? arguments.branch_name : \"refs/heads/\" & arguments.branch_name,\n \"oldObjectId\": \"0000000000000000000000000000000000000000\",\n \"newObjectId\": arguments.source_commit_id\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Get File","description":"Read the content of a file from a repository at a given branch, tag, or commit. Returns the file metadata together with its text content.","slug":"get-file","ai_risk":{"level":"low","score":2,"reasoning":"Read-only access to source code the authenticated user can already read.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"path":{"type":"string","description":"Path to the file from the repository root, e.g. '/src/index.ts'."},"version":{"type":"string","description":"Branch name, tag name, or commit SHA to read from. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]}},"required":["repository_id","path"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/items","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"includeContent\": true,\n \"$format\": \"json\",\n \"versionDescriptor.version\": arguments.version,\n \"versionDescriptor.versionType\": arguments.version_type\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Repository Items","description":"Browse the file tree of a repository. Returns the files and folders under a path without their content, which makes it the cheap way to explore a repository before reading specific files.","slug":"list-repository-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of repository paths.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"scope_path":{"type":"string","description":"Folder to list, e.g. '/src'. Defaults to the repository root."},"recursion_level":{"type":"string","description":"How deep to walk the tree. Defaults to 'oneLevel'. Use 'full' with care on large repositories.","enum":["none","oneLevel","oneLevelPlusNestedEmptyFolders","full"]},"version":{"type":"string","description":"Branch name, tag name, or commit SHA. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/items","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"scopePath\": arguments.scope_path,\n \"recursionLevel\": $exists(arguments.recursion_level) ? arguments.recursion_level : \"oneLevel\",\n \"includeContentMetadata\": true,\n \"versionDescriptor.version\": arguments.version,\n \"versionDescriptor.versionType\": arguments.version_type\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Commits","description":"Search the commit history of a repository, filtered by author, date range, branch, or file path. Use this to find when and by whom a change was made.","slug":"search-commits","ai_risk":{"level":"low","score":1,"reasoning":"Read-only query over commit metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"version":{"type":"string","description":"Branch, tag, or commit to search from. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]},"author":{"type":"string","description":"Filter by commit author name or email."},"item_path":{"type":"string","description":"Only return commits that touched this path, e.g. '/src/api'."},"from_date":{"type":"string","description":"Only return commits after this date, e.g. '2026-01-01T00:00:00Z'."},"to_date":{"type":"string","description":"Only return commits before this date."},"top":{"type":"number","description":"Maximum number of commits to return. Defaults to 50.","default":50},"skip":{"type":"number","description":"Number of commits to skip, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/commitsbatch","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"itemVersion\": $exists(arguments.version) ? $sift({\n \"version\": arguments.version,\n \"versionType\": arguments.version_type\n }, function($v) { $v != null }) : null,\n \"author\": arguments.author,\n \"itemPath\": arguments.item_path,\n \"fromDate\": arguments.from_date,\n \"toDate\": arguments.to_date,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$skip\": arguments.skip,\n \"includeLinks\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Pull Requests","description":"List pull requests in a repository, filtered by status, author, reviewer, or branch. Returns active pull requests by default.","slug":"list-pull-requests","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pull request metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"status":{"type":"string","description":"Filter by pull request status. Defaults to 'active'.","enum":["active","abandoned","completed","all","notSet"]},"creator_id":{"type":"string","description":"Filter by the author's identity ID (GUID)."},"reviewer_id":{"type":"string","description":"Filter by a reviewer's identity ID (GUID)."},"source_branch":{"type":"string","description":"Filter by source branch, e.g. 'feature/login' or 'refs/heads/feature/login'."},"target_branch":{"type":"string","description":"Filter by target branch, e.g. 'main'."},"top":{"type":"number","description":"Maximum number of pull requests to return. Defaults to 50.","default":50},"skip":{"type":"number","description":"Number of pull requests to skip, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"searchCriteria.status\": $exists(arguments.status) ? arguments.status : \"active\",\n \"searchCriteria.creatorId\": arguments.creator_id,\n \"searchCriteria.reviewerId\": arguments.reviewer_id,\n \"searchCriteria.sourceRefName\": $exists(arguments.source_branch) ? ($contains(arguments.source_branch, \"refs/\") ? arguments.source_branch : \"refs/heads/\" & arguments.source_branch) : null,\n \"searchCriteria.targetRefName\": $exists(arguments.target_branch) ? ($contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch) : null,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pull Request","description":"Get the full details of a pull request: description, source and target branches, reviewers and their votes, merge status, and optionally its commits and linked work items.","slug":"get-pull-request","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a single pull request.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"include_commits":{"type":"boolean","description":"Include the commits contained in the pull request."},"include_work_item_refs":{"type":"boolean","description":"Include references to linked work items."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"includeCommits\": arguments.include_commits,\n \"includeWorkItemRefs\": arguments.include_work_item_refs\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Pull Request","description":"Open a new pull request from a source branch into a target branch. Optionally add reviewers, mark it as a draft, and link work items.","slug":"create-pull-request","ai_risk":{"level":"medium","score":5,"reasoning":"Creates a visible pull request that notifies reviewers and can be configured to auto-complete.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"source_branch":{"type":"string","description":"Branch containing the changes, e.g. 'feature/login'. The 'refs/heads/' prefix is added automatically."},"target_branch":{"type":"string","description":"Branch to merge into, e.g. 'main'."},"title":{"type":"string","description":"Pull request title."},"description":{"type":"string","description":"Pull request description. Supports Markdown."},"reviewer_ids":{"type":"array","description":"Identity IDs (GUIDs) of reviewers to add. Groups and teams are accepted too.","items":{"type":"string"}},"is_draft":{"type":"boolean","description":"Open as a draft pull request, which does not trigger required reviewers or policies until published."},"work_item_ids":{"type":"array","description":"Work item IDs to link to the pull request.","items":{"type":"number"}}},"required":["repository_id","source_branch","target_branch","title"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"sourceRefName\": $contains(arguments.source_branch, \"refs/\") ? arguments.source_branch : \"refs/heads/\" & arguments.source_branch,\n \"targetRefName\": $contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch,\n \"title\": arguments.title,\n \"description\": arguments.description,\n \"isDraft\": arguments.is_draft,\n \"reviewers\": $exists(arguments.reviewer_ids) ? $map([arguments.reviewer_ids], function($v) { {\"id\": $v} })[] : null,\n \"workItemRefs\": $exists(arguments.work_item_ids) ? $map([arguments.work_item_ids], function($v) { {\"id\": $string($v)} })[] : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Pull Request","description":"Update a pull request: change its title or description, retarget it, publish a draft, set auto-complete, or complete or abandon it. Set status to 'completed' to merge and 'abandoned' to close without merging.","slug":"update-pull-request","ai_risk":{"level":"high","score":7,"reasoning":"Can merge or abandon a pull request, which changes the target branch's contents or discards proposed work.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"title":{"type":"string","description":"New title."},"description":{"type":"string","description":"New description."},"status":{"type":"string","description":"Set to 'completed' to merge the pull request, or 'abandoned' to close it without merging.","enum":["active","abandoned","completed"]},"target_branch":{"type":"string","description":"Retarget the pull request to this branch."},"is_draft":{"type":"boolean","description":"Set to false to publish a draft pull request, or true to convert it back to a draft."},"auto_complete_set_by_id":{"type":"string","description":"Identity ID (GUID) to set as the auto-complete requester. The pull request merges automatically once all policies pass."},"merge_strategy":{"type":"string","description":"Merge strategy used when completing the pull request.","enum":["noFastForward","squash","rebase","rebaseMerge"]},"delete_source_branch":{"type":"boolean","description":"Delete the source branch after completing the merge."},"merge_commit_message":{"type":"string","description":"Commit message to use for the merge commit."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"title\": arguments.title,\n \"description\": arguments.description,\n \"status\": arguments.status,\n \"isDraft\": arguments.is_draft,\n \"targetRefName\": $exists(arguments.target_branch) ? ($contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch) : null,\n \"autoCompleteSetBy\": $exists(arguments.auto_complete_set_by_id) ? {\"id\": arguments.auto_complete_set_by_id} : null,\n \"completionOptions\": ($exists(arguments.merge_strategy) or $exists(arguments.delete_source_branch) or $exists(arguments.merge_commit_message)) ? $sift({\n \"mergeStrategy\": arguments.merge_strategy,\n \"deleteSourceBranch\": arguments.delete_source_branch,\n \"mergeCommitMessage\": arguments.merge_commit_message\n }, function($v) { $v != null }) : null\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":false}},{"name":"List Pull Request Threads","description":"List the comment threads on a pull request, including inline code comments and their file positions. Use this to read review feedback.","slug":"list-pull-request-threads","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pull request review comments.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Pull Request Thread","description":"Start a new comment thread on a pull request. Omit the file path for a general comment, or provide a file path and line range to leave an inline code comment.","slug":"create-pull-request-thread","ai_risk":{"level":"medium","score":4,"reasoning":"Posts a visible comment that notifies pull request participants.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"content":{"type":"string","description":"Comment text. Supports Markdown."},"file_path":{"type":"string","description":"Path of the file to comment on, e.g. '/src/index.ts'. Omit for a general pull request comment."},"line_start":{"type":"number","description":"First line of the commented range in the updated file. Required when file_path is set."},"line_end":{"type":"number","description":"Last line of the commented range. Defaults to line_start."},"status":{"type":"string","description":"Initial thread status. Defaults to 'active'.","enum":["active","fixed","wontFix","closed","byDesign","pending"]}},"required":["repository_id","pull_request_id","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"comments\": [{\n \"parentCommentId\": 0,\n \"content\": arguments.content,\n \"commentType\": \"text\"\n }],\n \"status\": $exists(arguments.status) ? arguments.status : \"active\",\n \"threadContext\": $exists(arguments.file_path) ? {\n \"filePath\": arguments.file_path,\n \"rightFileStart\": {\"line\": arguments.line_start, \"offset\": 1},\n \"rightFileEnd\": {\"line\": $exists(arguments.line_end) ? arguments.line_end : arguments.line_start, \"offset\": 1}\n } : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Reply To Pull Request Thread","description":"Add a reply to an existing pull request comment thread. Get the thread ID from 'List Pull Request Threads'.","slug":"reply-to-pull-request-thread","ai_risk":{"level":"medium","score":3,"reasoning":"Posts a visible reply that notifies thread participants.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"thread_id":{"type":"number","description":"The comment thread ID to reply to."},"content":{"type":"string","description":"Reply text. Supports Markdown."},"parent_comment_id":{"type":"number","description":"Comment ID within the thread to reply to. Defaults to the first comment."}},"required":["repository_id","pull_request_id","thread_id","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads/{threadId}/comments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"threadId\": arguments.thread_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"content\": arguments.content,\n \"parentCommentId\": $exists(arguments.parent_comment_id) ? arguments.parent_comment_id : 1,\n \"commentType\": \"text\"\n }"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Pull Request Thread Status","description":"Resolve or reopen a pull request comment thread by changing its status, e.g. mark a review comment as fixed or won't fix.","slug":"update-pull-request-thread-status","ai_risk":{"level":"medium","score":3,"reasoning":"Changes review state that other reviewers rely on, but does not modify code.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"thread_id":{"type":"number","description":"The comment thread ID."},"status":{"type":"string","description":"New thread status.","enum":["active","fixed","wontFix","closed","byDesign","pending"]}},"required":["repository_id","pull_request_id","thread_id","status"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads/{threadId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"threadId\": arguments.thread_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"status\": arguments.status\n }"}},"annotations":{"idempotentHint":true}},{"name":"Set Pull Request Vote","description":"Cast or change a reviewer's vote on a pull request. Votes are 10 (approved), 5 (approved with suggestions), 0 (no vote), -5 (waiting for author), and -10 (rejected).","slug":"set-pull-request-vote","ai_risk":{"level":"high","score":7,"reasoning":"Approving a pull request can satisfy branch policies and allow code to merge into a protected branch.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"reviewer_id":{"type":"string","description":"Identity ID (GUID) of the reviewer whose vote is being set. Use 'me' for the authenticated user."},"vote":{"type":"number","description":"10 = approved, 5 = approved with suggestions, 0 = no vote, -5 = waiting for author, -10 = rejected.","enum":[10,5,0,-5,-10]}},"required":["repository_id","pull_request_id","reviewer_id","vote"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}/reviewers/{reviewerId}","method":"PUT","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"reviewerId\": arguments.reviewer_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"vote\": arguments.vote\n }"}},"annotations":{"idempotentHint":true}},{"name":"List Pull Request Work Items","description":"List the work items linked to a pull request. Use this to trace a code change back to the bug or story it implements.","slug":"list-pull-request-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of work item references.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}/workitems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Pipelines","description":"List the pipelines defined in a project. Returns pipeline IDs and names, which the run and history tools need.","slug":"list-pipelines","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pipeline definitions.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"top":{"type":"number","description":"Maximum number of pipelines to return. Defaults to 100.","default":100},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pipeline","description":"Get a pipeline's definition, including its YAML configuration path, repository, and folder.","slug":"get-pipeline","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a pipeline definition.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."},"pipeline_version":{"type":"number","description":"Specific pipeline revision to fetch. Defaults to the latest."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"pipelineVersion\": arguments.pipeline_version\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Run Pipeline","description":"Queue a new run of a pipeline, optionally against a specific branch and with template parameters or variables. Set preview_run to true to validate the final YAML without actually running anything.","slug":"run-pipeline","ai_risk":{"level":"high","score":8,"reasoning":"Executes arbitrary pipeline code, which can deploy to production environments and consume build resources.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID to run."},"branch":{"type":"string","description":"Branch to run against, e.g. 'main'. Defaults to the pipeline's default branch."},"template_parameters":{"type":"object","description":"Runtime parameters declared in the pipeline YAML, e.g. { \"environment\": \"staging\" }.","additionalProperties":true},"variables":{"type":"object","description":"Pipeline variables keyed by name, e.g. { \"deployTarget\": { \"value\": \"canary\" } }.","additionalProperties":true},"stages_to_skip":{"type":"array","description":"Names of stages to skip in this run.","items":{"type":"string"}},"preview_run":{"type":"boolean","description":"When true, return the final expanded YAML without queueing a run. Useful for validating changes safely."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"resources\": $exists(arguments.branch) ? {\n \"repositories\": {\n \"self\": {\n \"refName\": $contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch\n }\n }\n } : null,\n \"templateParameters\": arguments.template_parameters,\n \"variables\": arguments.variables,\n \"stagesToSkip\": arguments.stages_to_skip,\n \"previewRun\": arguments.preview_run\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"List Pipeline Runs","description":"List the most recent runs of a pipeline, newest first, with their state and result.","slug":"list-pipeline-runs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pipeline run history.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pipeline Run","description":"Get a single pipeline run with its state, result, resources, and the template parameters it was queued with.","slug":"get-pipeline-run","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one pipeline run.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."},"run_id":{"type":"number","description":"The run ID."}},"required":["pipeline_id","run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Build Definitions","description":"List build definitions in a project, optionally filtered by name or by the repository they build. Build definition IDs are what the 'List Builds' filter expects.","slug":"list-build-definitions","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build definitions.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Filter by definition name. Supports a trailing wildcard, e.g. 'api-*'."},"repository_id":{"type":"string","description":"Only return definitions that build this repository. Requires repository_type."},"repository_type":{"type":"string","description":"Type of the repository referenced by repository_id, e.g. 'TfsGit' or 'GitHub'."},"top":{"type":"number","description":"Maximum number of definitions to return. Defaults to 100.","default":100}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/definitions","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"name\": arguments.name,\n \"repositoryId\": arguments.repository_id,\n \"repositoryType\": arguments.repository_type,\n \"$top\": $exists(arguments.top) ? arguments.top : 100\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Builds","description":"List builds in a project, filtered by definition, branch, status, result, or time range. This is the tool to reach for when asked whether a branch's build is passing.","slug":"list-builds","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build history.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"definition_ids":{"type":"array","description":"Only return builds of these build definition IDs. Get them from 'List Build Definitions'.","items":{"type":"number"}},"branch":{"type":"string","description":"Only return builds of this branch, e.g. 'main'."},"status_filter":{"type":"string","description":"Filter by build status.","enum":["none","inProgress","completed","cancelling","postponed","notStarted","all"]},"result_filter":{"type":"string","description":"Filter by build result.","enum":["none","succeeded","partiallySucceeded","failed","canceled"]},"reason_filter":{"type":"string","description":"Filter by what triggered the build, e.g. 'pullRequest' or 'individualCI'."},"requested_for":{"type":"string","description":"Only return builds requested by this user (identity ID or unique name)."},"min_time":{"type":"string","description":"Only return builds finished after this time, e.g. '2026-08-01T00:00:00Z'."},"max_time":{"type":"string","description":"Only return builds finished before this time."},"tag_filters":{"type":"array","description":"Only return builds carrying all of these tags.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of builds to return. Defaults to 25.","default":25},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"definitions\": $exists(arguments.definition_ids) ? $join($map([arguments.definition_ids], function($v) { $string($v) }), \",\") : null,\n \"branchName\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null,\n \"statusFilter\": arguments.status_filter,\n \"resultFilter\": arguments.result_filter,\n \"reasonFilter\": arguments.reason_filter,\n \"requestedFor\": arguments.requested_for,\n \"minTime\": arguments.min_time,\n \"maxTime\": arguments.max_time,\n \"tagFilters\": $exists(arguments.tag_filters) ? $join([arguments.tag_filters], \",\") : null,\n \"queryOrder\": \"finishTimeDescending\",\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Build","description":"Get a single build with its status, result, triggering commit, requested-by identity, and timing.","slug":"get-build","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one build.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Cancel Build","description":"Cancel a build that is queued or in progress.","slug":"cancel-build","ai_risk":{"level":"medium","score":5,"reasoning":"Stops a running build, which can interrupt a deployment in progress.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID to cancel."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"status\": \"cancelling\"\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"List Build Logs","description":"List the log files produced by a build, with their IDs, line counts, and sizes. Use this to find the log you want before fetching its content.","slug":"list-build-logs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build log metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/logs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Build Log Content","description":"Read the plain-text content of a build log. Logs can be very large, so pass start_line and end_line to fetch only the section you need — the tail is usually where the failure is.","slug":"get-build-log-content","ai_risk":{"level":"low","score":2,"reasoning":"Read-only access to build output, which may echo configuration values but not stored secrets.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."},"log_id":{"type":"number","description":"The log ID, from 'List Build Logs'."},"start_line":{"type":"number","description":"First line to return."},"end_line":{"type":"number","description":"Last line to return."}},"required":["build_id","log_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/logs/{logId}","method":"GET","responseType":"text","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id,\n \"logId\": arguments.log_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"startLine\": arguments.start_line,\n \"endLine\": arguments.end_line\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Build Artifacts","description":"List the artifacts published by a build, with their names, types, and download URLs.","slug":"list-build-artifacts","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build artifact metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/artifacts","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Work Item","description":"Get a single work item by ID with its fields, and optionally its relations and history. Work items cover bugs, user stories, tasks, epics, and any custom types the project defines.","slug":"get-work-item","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one work item.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"fields":{"type":"string","description":"Comma-separated field reference names to return, e.g. 'System.Title,System.State,System.AssignedTo'. Omit to return all fields."},"expand":{"type":"string","description":"Additional data to include. Use 'relations' to see parent, child, and linked items.","enum":["none","relations","fields","links","all"]},"as_of":{"type":"string","description":"Return the work item as it looked at this UTC timestamp, e.g. '2026-07-01T00:00:00Z'."}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"fields\": arguments.fields,\n \"$expand\": arguments.expand,\n \"asOf\": arguments.as_of\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Work Items Batch","description":"Fetch up to 200 work items in one request by ID. Much cheaper than calling 'Get Work Item' repeatedly, so prefer this after a WIQL query returns a list of IDs.","slug":"get-work-items-batch","ai_risk":{"level":"low","score":1,"reasoning":"Read-only bulk lookup of work items.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"ids":{"type":"array","description":"Work item IDs to fetch. Maximum 200 per request.","items":{"type":"number"}},"fields":{"type":"array","description":"Field reference names to return, e.g. ['System.Title', 'System.State']. Cannot be combined with expand.","items":{"type":"string"}},"expand":{"type":"string","description":"Additional data to include. Cannot be combined with fields.","enum":["none","relations","fields","links","all"]}},"required":["ids"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitemsbatch","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"ids\": [arguments.ids],\n \"fields\": $exists(arguments.fields) ? [arguments.fields] : null,\n \"$expand\": arguments.expand\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Work Item","description":"Create a work item of any type the project's process defines (Bug, User Story, Task, Epic, ...). Call 'List Work Item Types' first if you are unsure which types and states are valid.","slug":"create-work-item","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a tracked work item that notifies the area's subscribers, but is additive and reversible.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"work_item_type":{"type":"string","description":"Work item type name, e.g. 'Bug', 'User Story', 'Task', 'Epic'."},"parent_id":{"type":"number","description":"ID of a work item to attach this one to as a child, e.g. the epic a story belongs to."},"title":{"type":"string","description":"Work item title (System.Title)."},"description":{"type":"string","description":"Work item description (System.Description). Accepts HTML for most work item types."},"assigned_to":{"type":"string","description":"Email or display name of the assignee (System.AssignedTo), e.g. 'jane@contoso.com'."},"state":{"type":"string","description":"Workflow state (System.State), e.g. 'New', 'Active', 'Resolved', 'Closed'. Valid values depend on the work item type and process."},"area_path":{"type":"string","description":"Area path (System.AreaPath), e.g. 'MyProject\\\\Platform'."},"iteration_path":{"type":"string","description":"Iteration path (System.IterationPath), e.g. 'MyProject\\\\Sprint 12'."},"tags":{"type":"string","description":"Semicolon-separated tags (System.Tags), e.g. 'backend; tech-debt'."},"priority":{"type":"number","description":"Priority (Microsoft.VSTS.Common.Priority), typically 1-4."},"story_points":{"type":"number","description":"Story points (Microsoft.VSTS.Scheduling.StoryPoints)."},"acceptance_criteria":{"type":"string","description":"Acceptance criteria (Microsoft.VSTS.Common.AcceptanceCriteria)."},"repro_steps":{"type":"string","description":"Reproduction steps for bugs (Microsoft.VSTS.TCM.ReproSteps)."},"fields":{"type":"object","description":"Any additional fields keyed by their reference name, e.g. { \"Custom.Team\": \"Platform\", \"Microsoft.VSTS.Scheduling.RemainingWork\": 4 }.","additionalProperties":true}},"required":["work_item_type","title"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{workItemType}","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"workItemType\": \"$\" & $encodeUrlComponent(arguments.work_item_type)\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"$append(\n ($fields := $sift($merge([\n {\n \"System.Title\": arguments.title,\n \"System.Description\": arguments.description,\n \"System.AssignedTo\": arguments.assigned_to,\n \"System.State\": arguments.state,\n \"System.AreaPath\": arguments.area_path,\n \"System.IterationPath\": arguments.iteration_path,\n \"System.Tags\": arguments.tags,\n \"Microsoft.VSTS.Common.Priority\": arguments.priority,\n \"Microsoft.VSTS.Scheduling.StoryPoints\": arguments.story_points,\n \"Microsoft.VSTS.Common.AcceptanceCriteria\": arguments.acceptance_criteria,\n \"Microsoft.VSTS.TCM.ReproSteps\": arguments.repro_steps\n },\n $exists(arguments.fields) ? arguments.fields : {}\n ]), function($v) { $v != null });\n $exists($fields) ? $each($fields, function($v, $k) {\n {\"op\": \"add\", \"path\": \"/fields/\" & $k, \"value\": $v}\n }) : []),\n $exists(arguments.parent_id) ? [{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": {\n \"rel\": \"System.LinkTypes.Hierarchy-Reverse\",\n \"url\": \"https://dev.azure.com/\" & settings.organization & \"/_apis/wit/workItems/\" & $string(arguments.parent_id)\n }\n }] : []\n )"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Work Item","description":"Update fields on an existing work item, for example to change its state, reassign it, or move it to another iteration. Only the fields you pass are modified; everything else is left alone.","slug":"update-work-item","ai_risk":{"level":"medium","score":5,"reasoning":"Overwrites tracked work item fields and can change state or ownership, which teams rely on for planning.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID to update."},"suppress_notifications":{"type":"boolean","description":"Do not send change notifications to subscribers for this update."},"title":{"type":"string","description":"Work item title (System.Title)."},"description":{"type":"string","description":"Work item description (System.Description). Accepts HTML for most work item types."},"assigned_to":{"type":"string","description":"Email or display name of the assignee (System.AssignedTo), e.g. 'jane@contoso.com'."},"state":{"type":"string","description":"Workflow state (System.State), e.g. 'New', 'Active', 'Resolved', 'Closed'. Valid values depend on the work item type and process."},"area_path":{"type":"string","description":"Area path (System.AreaPath), e.g. 'MyProject\\\\Platform'."},"iteration_path":{"type":"string","description":"Iteration path (System.IterationPath), e.g. 'MyProject\\\\Sprint 12'."},"tags":{"type":"string","description":"Semicolon-separated tags (System.Tags), e.g. 'backend; tech-debt'."},"priority":{"type":"number","description":"Priority (Microsoft.VSTS.Common.Priority), typically 1-4."},"story_points":{"type":"number","description":"Story points (Microsoft.VSTS.Scheduling.StoryPoints)."},"acceptance_criteria":{"type":"string","description":"Acceptance criteria (Microsoft.VSTS.Common.AcceptanceCriteria)."},"repro_steps":{"type":"string","description":"Reproduction steps for bugs (Microsoft.VSTS.TCM.ReproSteps)."},"fields":{"type":"object","description":"Any additional fields keyed by their reference name, e.g. { \"Custom.Team\": \"Platform\", \"Microsoft.VSTS.Scheduling.RemainingWork\": 4 }.","additionalProperties":true}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"suppressNotifications\": arguments.suppress_notifications\n }, function($v) { $v != null })","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"($fields := $sift($merge([\n {\n \"System.Title\": arguments.title,\n \"System.Description\": arguments.description,\n \"System.AssignedTo\": arguments.assigned_to,\n \"System.State\": arguments.state,\n \"System.AreaPath\": arguments.area_path,\n \"System.IterationPath\": arguments.iteration_path,\n \"System.Tags\": arguments.tags,\n \"Microsoft.VSTS.Common.Priority\": arguments.priority,\n \"Microsoft.VSTS.Scheduling.StoryPoints\": arguments.story_points,\n \"Microsoft.VSTS.Common.AcceptanceCriteria\": arguments.acceptance_criteria,\n \"Microsoft.VSTS.TCM.ReproSteps\": arguments.repro_steps\n },\n $exists(arguments.fields) ? arguments.fields : {}\n ]), function($v) { $v != null });\n $exists($fields) ? $each($fields, function($v, $k) {\n {\"op\": \"add\", \"path\": \"/fields/\" & $k, \"value\": $v}\n }) : [])"}},"annotations":{"idempotentHint":true}},{"name":"List Work Item Comments","description":"List the discussion comments on a work item, newest first by default.","slug":"list-work-item-comments","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of work item discussion.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"top":{"type":"number","description":"Maximum number of comments to return. Defaults to 50.","default":50},"order":{"type":"string","description":"Sort order by creation date. Defaults to 'desc'.","enum":["asc","desc"]}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workItems/{id}/comments","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1-preview.4\",\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"order\": $exists(arguments.order) ? arguments.order : \"desc\"\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Add Work Item Comment","description":"Post a comment to a work item's discussion. Use this to record findings or decisions on a bug or story.","slug":"add-work-item-comment","ai_risk":{"level":"medium","score":3,"reasoning":"Posts a permanent, visible comment that notifies the work item's followers.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"text":{"type":"string","description":"Comment body. Accepts HTML."}},"required":["id","text"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workItems/{id}/comments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1-preview.4\"\n }","body":"{\n \"text\": arguments.text\n }"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Link Work Items","description":"Create a link between two work items, for example to set a parent, add a child, or mark two items as related or duplicates.","slug":"link-work-items","ai_risk":{"level":"medium","score":3,"reasoning":"Changes work item relationships, which affects backlog hierarchy and rollup, but no field data is lost.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item the link is added to."},"target_id":{"type":"number","description":"The work item on the other end of the link."},"relation_type":{"type":"string","description":"Link type. 'System.LinkTypes.Hierarchy-Reverse' makes target_id the parent of id; 'Hierarchy-Forward' makes it a child.","enum":["System.LinkTypes.Related","System.LinkTypes.Hierarchy-Forward","System.LinkTypes.Hierarchy-Reverse","System.LinkTypes.Dependency-Forward","System.LinkTypes.Dependency-Reverse","System.LinkTypes.Duplicate-Forward","System.LinkTypes.Duplicate-Reverse","Microsoft.VSTS.Common.TestedBy-Forward","Microsoft.VSTS.Common.TestedBy-Reverse"]},"comment":{"type":"string","description":"Optional note explaining the link."}},"required":["id","target_id","relation_type"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"[{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": $sift({\n \"rel\": arguments.relation_type,\n \"url\": \"https://dev.azure.com/\" & settings.organization & \"/_apis/wit/workItems/\" & $string(arguments.target_id),\n \"attributes\": $exists(arguments.comment) ? {\"comment\": arguments.comment} : null\n }, function($v) { $v != null })\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Upload Work Item Attachment","description":"Upload a text file to the work item attachment store and get back an attachment URL. Pass that URL to 'Add Work Item Attachment Link' to attach it to a work item.","slug":"upload-work-item-attachment","ai_risk":{"level":"medium","score":4,"reasoning":"Writes file content into the organization's attachment store.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"file_name":{"type":"string","description":"File name to store, e.g. 'repro-log.txt'."},"content":{"type":"string","description":"The file's text content."}},"required":["file_name","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/attachments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"fileName\": arguments.file_name\n }","headers":"{\n \"Content-Type\": \"application/octet-stream\"\n }","body":"arguments.content"}},"annotations":{"idempotentHint":false}},{"name":"Add Work Item Attachment Link","description":"Attach an already-uploaded file to a work item using the URL returned by 'Upload Work Item Attachment'.","slug":"add-work-item-attachment-link","ai_risk":{"level":"medium","score":3,"reasoning":"Adds an attachment relation to a work item; additive and removable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID to attach the file to."},"attachment_url":{"type":"string","description":"Attachment URL returned by 'Upload Work Item Attachment'."},"comment":{"type":"string","description":"Optional note describing the attachment."}},"required":["id","attachment_url"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"[{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": $sift({\n \"rel\": \"AttachedFile\",\n \"url\": arguments.attachment_url,\n \"attributes\": $exists(arguments.comment) ? {\"comment\": arguments.comment} : null\n }, function($v) { $v != null })\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Run Work Item Query","description":"Run a WIQL (Work Item Query Language) query and get back the matching work item IDs. WIQL looks like SQL, e.g. \"SELECT [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.AssignedTo] = @Me ORDER BY [System.ChangedDate] DESC\". Follow up with 'Get Work Items Batch' to read the fields.","slug":"run-work-item-query","ai_risk":{"level":"low","score":2,"reasoning":"Read-only query. Scoped to work items the authenticated user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"query":{"type":"string","description":"The WIQL query. Supports macros like @Me, @Today, and @CurrentIteration."},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 100.","default":100}},"required":["query"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/wiql","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"$top\": $exists(arguments.top) ? arguments.top : 100\n }","body":"{\n \"query\": arguments.query\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Saved Queries","description":"List the saved work item queries in a project, both shared and personal, so you can reuse a team's existing query instead of writing new WIQL.","slug":"list-saved-queries","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of saved query metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"depth":{"type":"number","description":"How many levels of query folders to walk. Defaults to 2.","default":2},"expand":{"type":"string","description":"Use 'wiql' to include each query's WIQL text in the response.","enum":["none","all","clauses","minimal","wiql"]}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/queries","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$depth\": $exists(arguments.depth) ? arguments.depth : 2,\n \"$expand\": arguments.expand\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Backlogs","description":"List a team's backlog levels (for example Epics, Features, Stories) with their IDs, which 'List Backlog Work Items' needs.","slug":"list-backlogs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of backlog configuration.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."}},"required":["team"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/backlogs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Backlog Work Items","description":"List the work items on one of a team's backlog levels, in backlog order. Combine with 'Get Work Items Batch' to read their fields.","slug":"list-backlog-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of backlog contents.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"backlog_id":{"type":"string","description":"Backlog level ID from 'List Backlogs', e.g. 'Microsoft.RequirementCategory'."}},"required":["team","backlog_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/backlogs/{backlogId}/workItems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"backlogId\": arguments.backlog_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Team Iterations","description":"List a team's iterations (sprints) with their date ranges. Pass timeframe 'current' to find the sprint in progress.","slug":"list-team-iterations","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint configuration.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"timeframe":{"type":"string","description":"Set to 'current' to return only the iteration currently in progress.","enum":["current"]}},"required":["team"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$timeframe\": arguments.timeframe\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Assign Team Iteration","description":"Add an existing project iteration to a team's sprint list, so the team's boards and capacity planning include it. The iteration must already exist in the project's classification nodes.","slug":"assign-team-iteration","ai_risk":{"level":"medium","score":4,"reasoning":"Changes a team's sprint configuration, which affects everyone's boards.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Identifier (GUID) of the project iteration to add to the team."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"id\": arguments.iteration_id\n }"}},"annotations":{"idempotentHint":true}},{"name":"List Iteration Work Items","description":"List the work items assigned to a team's iteration, with their parent-child relations. Use this to see a sprint's contents.","slug":"list-iteration-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint contents.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/workitems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Team Capacity","description":"Get each team member's capacity and days off for an iteration. Use this to reason about how much work a sprint can absorb.","slug":"get-team-capacity","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint capacity settings.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/capacities","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Team Member Capacity","description":"Set a team member's per-day capacity and days off for an iteration. Capacity is expressed per activity, e.g. 6 hours per day of Development.","slug":"update-team-member-capacity","ai_risk":{"level":"medium","score":4,"reasoning":"Overwrites another person's sprint capacity, which changes the team's planning numbers.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."},"team_member_id":{"type":"string","description":"Identity ID (GUID) of the team member, from 'Get Team Capacity'."},"activities":{"type":"array","description":"Per-activity capacity, e.g. [{ \"name\": \"Development\", \"capacityPerDay\": 6 }].","items":{"type":"object","properties":{"name":{"type":"string","description":"Activity name, e.g. 'Development', 'Testing', 'Design'."},"capacityPerDay":{"type":"number","description":"Hours per day for this activity."}},"additionalProperties":false}},"days_off":{"type":"array","description":"Date ranges the member is away, e.g. [{ \"start\": \"2026-09-01T00:00:00Z\", \"end\": \"2026-09-05T00:00:00Z\" }].","items":{"type":"object","properties":{"start":{"type":"string","description":"First day off (UTC)."},"end":{"type":"string","description":"Last day off (UTC)."}},"additionalProperties":false}}},"required":["team","iteration_id","team_member_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/capacities/{teamMemberId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id,\n \"teamMemberId\": arguments.team_member_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"activities\": $exists(arguments.activities) ? [arguments.activities] : null,\n \"daysOff\": $exists(arguments.days_off) ? [arguments.days_off] : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":true}},{"name":"List Wikis","description":"List the wikis in a project. Returns wiki IDs and names, which the page tools need as the wiki identifier.","slug":"list-wikis","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of wiki metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Wiki","description":"Get a wiki's details, including its type (project wiki or code wiki), repository, and mapped path.","slug":"get-wiki","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one wiki.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."}},"required":["wiki_identifier"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Wiki Page","description":"Read a wiki page by its path, optionally including its Markdown content and its sub-pages. Pass path '/' with a recursion level to list the wiki's page tree.","slug":"get-wiki-page","ai_risk":{"level":"low","score":1,"reasoning":"Read-only access to wiki content.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."},"path":{"type":"string","description":"Page path, e.g. '/Runbooks/On-Call'. Use '/' for the wiki root."},"include_content":{"type":"boolean","description":"Include the page's Markdown content. Defaults to true.","default":true},"recursion_level":{"type":"string","description":"Include sub-pages. Defaults to 'none'. Use 'oneLevel' or 'full' to walk the page tree.","enum":["none","oneLevel","full"]},"version":{"type":"string","description":"Branch or commit to read from, for code wikis. Defaults to the wiki's mapped branch."}},"required":["wiki_identifier","path"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"includeContent\": $exists(arguments.include_content) ? arguments.include_content : true,\n \"recursionLevel\": arguments.recursion_level,\n \"versionDescriptor.version\": arguments.version\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Or Update Wiki Page","description":"Create a wiki page, or replace an existing one. Creating is straightforward; to update an existing page you must first call 'Get Wiki Page' and pass its ETag as the version, which is how Azure DevOps prevents you from overwriting someone else's concurrent edit.","slug":"create-or-update-wiki-page","ai_risk":{"level":"medium","score":5,"reasoning":"Replaces the full content of a shared documentation page. Existing content is overwritten rather than merged.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."},"path":{"type":"string","description":"Page path, e.g. '/Runbooks/On-Call'. Parent pages are created automatically."},"content":{"type":"string","description":"Full Markdown content of the page."},"version":{"type":"string","description":"ETag of the page being replaced, from the 'ETag' header of 'Get Wiki Page'. Required when updating an existing page; omit when creating a new one."},"comment":{"type":"string","description":"Commit message for the change."}},"required":["wiki_identifier","path","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages","method":"PUT","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"comment\": arguments.comment\n }, function($v) { $v != null })","headers":"$sift({\n \"If-Match\": arguments.version\n }, function($v) { $v != null })","body":"{\n \"content\": arguments.content\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Search Code","description":"Full-text search across the source code in a project's repositories. Supports code element filters like 'class:', 'func:', and 'comment:' in the search text. This is the fastest way to find where something is defined without knowing the repository or path.","slug":"search-code","ai_risk":{"level":"low","score":2,"reasoning":"Read-only search scoped to code the authenticated user can already read.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'createCheckoutSession' or 'class:PaymentService'."},"repositories":{"type":"array","description":"Limit the search to these repository names.","items":{"type":"string"}},"paths":{"type":"array","description":"Limit the search to these path prefixes, e.g. ['/src'].","items":{"type":"string"}},"branches":{"type":"array","description":"Limit the search to these branches. Only branches indexed for search can be used.","items":{"type":"string"}},"code_elements":{"type":"array","description":"Limit matches to these code element kinds, e.g. ['class', 'function', 'comment'].","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/codesearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"Repository\": $exists(arguments.repositories) ? [arguments.repositories] : null,\n \"Path\": $exists(arguments.paths) ? [arguments.paths] : null,\n \"Branch\": $exists(arguments.branches) ? [arguments.branches] : null,\n \"CodeElement\": $exists(arguments.code_elements) ? [arguments.code_elements] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Work Items","description":"Full-text search across work items in a project. Use this when you know roughly what the item says but not its ID; use 'Run Work Item Query' instead when you need precise field-based filtering.","slug":"search-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only search over work items the user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'checkout timeout on mobile'."},"work_item_types":{"type":"array","description":"Limit to these work item types, e.g. ['Bug', 'Task'].","items":{"type":"string"}},"states":{"type":"array","description":"Limit to these states, e.g. ['Active', 'New'].","items":{"type":"string"}},"assigned_to":{"type":"array","description":"Limit to work items assigned to these users.","items":{"type":"string"}},"area_paths":{"type":"array","description":"Limit to these area paths.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/workitemsearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"System.WorkItemType\": $exists(arguments.work_item_types) ? [arguments.work_item_types] : null,\n \"System.State\": $exists(arguments.states) ? [arguments.states] : null,\n \"System.AssignedTo\": $exists(arguments.assigned_to) ? [arguments.assigned_to] : null,\n \"System.AreaPath\": $exists(arguments.area_paths) ? [arguments.area_paths] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Wiki","description":"Full-text search across a project's wiki pages. Use this to find runbooks, design docs, and onboarding notes.","slug":"search-wiki","ai_risk":{"level":"low","score":1,"reasoning":"Read-only search over wiki content the user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'database failover runbook'."},"wikis":{"type":"array","description":"Limit the search to these wiki names.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/wikisearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"Wiki\": $exists(arguments.wikis) ? [arguments.wikis] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Test Plans","description":"List the test plans in a project, with their area path, iteration, and owner.","slug":"list-test-plans","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test plan metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"owner":{"type":"string","description":"Filter by the plan owner's identity ID or unique name."},"active_only":{"type":"boolean","description":"Return only plans whose iteration has not ended. Defaults to true.","default":true},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/plans","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"owner\": arguments.owner,\n \"filterActivePlans\": $exists(arguments.active_only) ? arguments.active_only : true,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Plan","description":"Create a new test plan in a project, scoped to an area path and iteration.","slug":"create-test-plan","ai_risk":{"level":"medium","score":3,"reasoning":"Creates a new test plan; additive and deletable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Test plan name."},"area_path":{"type":"string","description":"Area path for the plan, e.g. 'MyProject\\\\Platform'."},"iteration":{"type":"string","description":"Iteration path for the plan, e.g. 'MyProject\\\\Sprint 12'."},"description":{"type":"string","description":"Plan description."},"start_date":{"type":"string","description":"Plan start date, e.g. '2026-09-01T00:00:00Z'."},"end_date":{"type":"string","description":"Plan end date."}},"required":["name","iteration"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/plans","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"areaPath\": arguments.area_path,\n \"iteration\": arguments.iteration,\n \"description\": arguments.description,\n \"startDate\": arguments.start_date,\n \"endDate\": arguments.end_date\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"List Test Suites","description":"List the test suites in a test plan, including their hierarchy and suite type.","slug":"list-test-suites","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test suite metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["plan_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/suites","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Suite","description":"Create a test suite inside a test plan. Static suites hold test cases you add explicitly; query-based suites populate themselves from a WIQL query.","slug":"create-test-suite","ai_risk":{"level":"medium","score":3,"reasoning":"Creates a new test suite; additive and deletable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"name":{"type":"string","description":"Suite name."},"parent_suite_id":{"type":"number","description":"ID of the parent suite. Use the plan's root suite ID from 'List Test Suites'."},"suite_type":{"type":"string","description":"Suite type. Defaults to 'staticTestSuite'.","enum":["staticTestSuite","dynamicTestSuite","requirementTestSuite"]},"query_string":{"type":"string","description":"WIQL query that populates the suite. Required for 'dynamicTestSuite'."},"requirement_id":{"type":"number","description":"Work item ID the suite is based on. Required for 'requirementTestSuite'."}},"required":["plan_id","name","parent_suite_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/suites","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"suiteType\": $exists(arguments.suite_type) ? arguments.suite_type : \"staticTestSuite\",\n \"parentSuite\": {\"id\": arguments.parent_suite_id},\n \"queryString\": arguments.query_string,\n \"requirementId\": arguments.requirement_id\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"List Test Cases","description":"List the test cases in a test suite, with their point assignments and configurations.","slug":"list-test-cases","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test cases in a suite.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"suite_id":{"type":"number","description":"The test suite ID."},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["plan_id","suite_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/Suites/{suiteId}/TestCase","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id,\n \"suiteId\": arguments.suite_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Add Test Cases To Suite","description":"Add existing test case work items to a static test suite. Create the test case itself with 'Create Work Item' using the 'Test Case' type first.","slug":"add-test-cases-to-suite","ai_risk":{"level":"medium","score":3,"reasoning":"Changes which test cases a suite covers, but does not modify the test cases themselves.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"suite_id":{"type":"number","description":"The test suite ID."},"work_item_ids":{"type":"array","description":"IDs of the Test Case work items to add.","items":{"type":"number"}}},"required":["plan_id","suite_id","work_item_ids"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/Suites/{suiteId}/TestCase","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id,\n \"suiteId\": arguments.suite_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$map([arguments.work_item_ids], function($v) { {\"workItem\": {\"id\": $v}} })[]"}},"annotations":{"idempotentHint":true}},{"name":"List Test Runs","description":"List test runs in a project, optionally filtered by test plan, state, or the build that produced them.","slug":"list-test-runs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test run metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"Only return runs belonging to this test plan."},"state":{"type":"string","description":"Filter by run state.","enum":["unspecified","notStarted","inProgress","completed","aborted","waiting","needsInvestigation"]},"include_run_details":{"type":"boolean","description":"Include the run statistics in the response."},"top":{"type":"number","description":"Maximum number of runs to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of runs to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"planId\": arguments.plan_id,\n \"state\": arguments.state,\n \"includeRunDetails\": arguments.include_run_details,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Test Run","description":"Get a single test run with its state, totals, and pass/fail counts.","slug":"get-test-run","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one test run.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs/{runId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Test Results","description":"List the individual test results in a test run. Filter by outcome to pull just the failures when investigating a red build.","slug":"list-test-results","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test result details.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."},"outcomes":{"type":"array","description":"Only return results with these outcomes, e.g. ['Failed', 'Aborted'].","items":{"type":"string"}},"details_to_include":{"type":"string","description":"Extra detail to include. Use 'Iterations' for per-iteration data or 'WorkItems' for linked bugs.","enum":["None","Iterations","WorkItems","SubResults","Point"]},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/Runs/{runId}/results","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"outcomes\": $exists(arguments.outcomes) ? $join([arguments.outcomes], \",\") : null,\n \"detailsToInclude\": arguments.details_to_include,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Test Results From Build","description":"Get the aggregated test result summary for a build: totals, pass rate, and duration. Use this to answer whether a build's tests passed without paging through individual results.","slug":"get-test-results-from-build","ai_risk":{"level":"low","score":1,"reasoning":"Read-only aggregate of a build's test results.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/ResultSummaryByBuild","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"buildId\": arguments.build_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Run","description":"Create a test run against a test plan, optionally for a specific set of test points and tied to a build.","slug":"create-test-run","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a test run record that appears in the project's quality reporting.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Name of the test run."},"plan_id":{"type":"number","description":"Test plan the run belongs to."},"point_ids":{"type":"array","description":"Test point IDs to include in the run, from 'List Test Cases'.","items":{"type":"number"}},"build_id":{"type":"number","description":"Build the run is associated with."},"automated":{"type":"boolean","description":"Whether this is an automated run. Defaults to false (manual)."},"state":{"type":"string","description":"Initial run state. Defaults to 'NotStarted'.","enum":["NotStarted","InProgress","Completed","Aborted","Waiting"]}},"required":["name","plan_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"plan\": {\"id\": $string(arguments.plan_id)},\n \"pointIds\": $exists(arguments.point_ids) ? [arguments.point_ids] : null,\n \"build\": $exists(arguments.build_id) ? {\"id\": $string(arguments.build_id)} : null,\n \"automated\": $exists(arguments.automated) ? arguments.automated : false,\n \"state\": $exists(arguments.state) ? arguments.state : \"NotStarted\"\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"Update Test Run","description":"Update a test run's state or comment, for example to mark a manual run as completed or aborted.","slug":"update-test-run","ai_risk":{"level":"medium","score":3,"reasoning":"Changes the recorded state of a test run, which feeds quality reporting.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."},"state":{"type":"string","description":"New run state.","enum":["NotStarted","InProgress","Completed","Aborted","Waiting","NeedsInvestigation"]},"comment":{"type":"string","description":"Comment describing the run's outcome."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs/{runId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"state\": arguments.state,\n \"comment\": arguments.comment\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":true}},{"name":"List Advanced Security Alerts","description":"List GitHub Advanced Security for Azure DevOps alerts on a repository: secret leaks, dependency vulnerabilities, and code scanning findings. Requires Advanced Security to be enabled on the repository.","slug":"list-advanced-security-alerts","ai_risk":{"level":"low","score":2,"reasoning":"Read-only listing of security findings. Reveals vulnerability details, so exposure should be limited to trusted users.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository":{"type":"string","description":"Repository name or ID."},"alert_type":{"type":"string","description":"Filter by the kind of alert.","enum":["code","secret","dependency","license","unknown"]},"states":{"type":"array","description":"Filter by alert state, e.g. ['active'] to see only open findings.","items":{"type":"string","enum":["unknown","active","dismissed","fixed","autoDismissed"]}},"severities":{"type":"array","description":"Filter by severity, e.g. ['critical', 'high'].","items":{"type":"string","enum":["low","medium","high","critical","note","warning","error"]}},"branch":{"type":"string","description":"Only return alerts found on this branch, e.g. 'main'."},"top":{"type":"number","description":"Maximum number of alerts to return. Defaults to 50.","default":50}},"required":["repository"],"additionalProperties":false},"action":{"path":"https://advsec.dev.azure.com/{organization}/{project}/_apis/alert/repositories/{repository}/alerts","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repository\": arguments.repository\n }","query":"$sift({\n \"api-version\": \"7.2-preview.1\",\n \"criteria.alertType\": arguments.alert_type,\n \"criteria.states\": $exists(arguments.states) ? $join([arguments.states], \",\") : null,\n \"criteria.severities\": $exists(arguments.severities) ? $join([arguments.severities], \",\") : null,\n \"criteria.ref\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null,\n \"top\": $exists(arguments.top) ? arguments.top : 50\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Advanced Security Alert","description":"Get the full details of a single Advanced Security alert, including where it was found and its remediation guidance.","slug":"get-advanced-security-alert","ai_risk":{"level":"low","score":2,"reasoning":"Read-only lookup of one security finding, including the affected code location.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository":{"type":"string","description":"Repository name or ID."},"alert_id":{"type":"number","description":"The alert ID, from 'List Advanced Security Alerts'."},"branch":{"type":"string","description":"Branch to evaluate the alert's state against, e.g. 'main'."}},"required":["repository","alert_id"],"additionalProperties":false},"action":{"path":"https://advsec.dev.azure.com/{organization}/{project}/_apis/alert/repositories/{repository}/alerts/{alertId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repository\": arguments.repository,\n \"alertId\": arguments.alert_id\n }","query":"$sift({\n \"api-version\": \"7.2-preview.1\",\n \"ref\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}}
|
|
1
|
+
{"id":"azure-devops","status":"active","applications":["azure-devops"],"definition":{"display":{"name":"Azure DevOps","description":"Azure DevOps Services for source control, work tracking, CI/CD pipelines, wikis, and test management. Manage repositories, pull requests, work items, builds, pipeline runs, wiki pages, and test plans through the Azure DevOps REST API.","icon":"azure-devops.svg","website":"https://azure.microsoft.com/en-us/products/devops","category":"ci-cd-devops","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/azure-devops"},"api":{"base_url":"https://dev.azure.com"},"configuration":{"type":"object","properties":{"organization":{"type":"string","title":"Organization","placeholder":"contoso"},"project":{"type":"string","title":"Default Project","placeholder":"MyProject"}},"required":["organization"]},"auth":{"methods":{"oauth":{"authUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","authInitUrlParams":{"response_mode":"query"},"scopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/.default","499b84ac-1321-427f-aa17-267ca6975798/vso.profile","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.project_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code","499b84ac-1321-427f-aa17-267ca6975798/vso.code_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code_manage","499b84ac-1321-427f-aa17-267ca6975798/vso.code_status","499b84ac-1321-427f-aa17-267ca6975798/vso.threads_full","499b84ac-1321-427f-aa17-267ca6975798/vso.build","499b84ac-1321-427f-aa17-267ca6975798/vso.build_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.release","499b84ac-1321-427f-aa17-267ca6975798/vso.release_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.work","499b84ac-1321-427f-aa17-267ca6975798/vso.work_write","499b84ac-1321-427f-aa17-267ca6975798/vso.work_full","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki_write","499b84ac-1321-427f-aa17-267ca6975798/vso.test","499b84ac-1321-427f-aa17-267ca6975798/vso.test_write","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec","499b84ac-1321-427f-aa17-267ca6975798/vso.identity","499b84ac-1321-427f-aa17-267ca6975798/vso.graph","499b84ac-1321-427f-aa17-267ca6975798/vso.analytics","499b84ac-1321-427f-aa17-267ca6975798/vso.agentpools","499b84ac-1321-427f-aa17-267ca6975798/vso.serviceendpoint","499b84ac-1321-427f-aa17-267ca6975798/vso.packaging","499b84ac-1321-427f-aa17-267ca6975798/vso.taskgroups_read","499b84ac-1321-427f-aa17-267ca6975798/vso.variablegroups_read"],"defaultScopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.code_write","499b84ac-1321-427f-aa17-267ca6975798/vso.build_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.work_write","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki_write","499b84ac-1321-427f-aa17-267ca6975798/vso.test_write","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec"],"scopeTemplates":[{"id":"read-only","name":"Read-only","description":"Read projects, repositories, pull requests, pipelines and builds, work items, wikis, test plans and Advanced Security alerts. Can't change anything.","scopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/vso.profile","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.code","499b84ac-1321-427f-aa17-267ca6975798/vso.build","499b84ac-1321-427f-aa17-267ca6975798/vso.work","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki","499b84ac-1321-427f-aa17-267ca6975798/vso.test","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec"]},{"id":"app-registration","name":"App registration permissions","description":"Whatever delegated Azure DevOps permissions are configured on the Entra ID app registration (the `.default` scope). Manage access there instead of here.","scopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/.default"]},{"id":"full-access","name":"Full access","description":"Every granular Azure DevOps scope: code, pull requests, pipelines, releases, work items, wikis, tests, packaging, service connections, agent pools and identities.","scopes":["offline_access","499b84ac-1321-427f-aa17-267ca6975798/vso.profile","499b84ac-1321-427f-aa17-267ca6975798/vso.project","499b84ac-1321-427f-aa17-267ca6975798/vso.project_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code","499b84ac-1321-427f-aa17-267ca6975798/vso.code_write","499b84ac-1321-427f-aa17-267ca6975798/vso.code_manage","499b84ac-1321-427f-aa17-267ca6975798/vso.code_status","499b84ac-1321-427f-aa17-267ca6975798/vso.threads_full","499b84ac-1321-427f-aa17-267ca6975798/vso.build","499b84ac-1321-427f-aa17-267ca6975798/vso.build_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.release","499b84ac-1321-427f-aa17-267ca6975798/vso.release_execute","499b84ac-1321-427f-aa17-267ca6975798/vso.work","499b84ac-1321-427f-aa17-267ca6975798/vso.work_write","499b84ac-1321-427f-aa17-267ca6975798/vso.work_full","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki","499b84ac-1321-427f-aa17-267ca6975798/vso.wiki_write","499b84ac-1321-427f-aa17-267ca6975798/vso.test","499b84ac-1321-427f-aa17-267ca6975798/vso.test_write","499b84ac-1321-427f-aa17-267ca6975798/vso.advsec","499b84ac-1321-427f-aa17-267ca6975798/vso.identity","499b84ac-1321-427f-aa17-267ca6975798/vso.graph","499b84ac-1321-427f-aa17-267ca6975798/vso.analytics","499b84ac-1321-427f-aa17-267ca6975798/vso.agentpools","499b84ac-1321-427f-aa17-267ca6975798/vso.serviceendpoint","499b84ac-1321-427f-aa17-267ca6975798/vso.packaging","499b84ac-1321-427f-aa17-267ca6975798/vso.taskgroups_read","499b84ac-1321-427f-aa17-267ca6975798/vso.variablegroups_read"]}],"pkce":true,"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"scope\": scope,\n \"token_type\": token_type\n}","isForm":true}},"apiKey":{"headerName":"Authorization","authorizationMapping":"'Basic ' & $base64encode(':' & token)"},"api-key-per-user":{"headerName":"Authorization","authorizationMapping":"'Basic ' & $base64encode(':' & token)","howtoMarkdown":"\n1. Go to [dev.azure.com](https://dev.azure.com) and open **User settings** (top right) → **Personal access tokens**\n2. Click **New Token**\n3. Pick the organization, set an expiration, and select the scopes you need (Code, Work Items, Build, Wiki, Test Management, ...)\n4. Click **Create** and copy the token immediately — it is only shown once\n5. Paste the token here (no username or colon needed)"}}},"tools":[{"name":"List Projects","description":"List all projects in the Azure DevOps organization that the authenticated user has access to. Use this first to discover project names, which nearly every other tool needs.","slug":"list-projects","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of project metadata the user already has access to.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"state_filter":{"type":"string","description":"Filter by project state. Defaults to 'wellFormed' (active projects).","enum":["all","wellFormed","createPending","deleting","new"]},"top":{"type":"number","description":"Maximum number of projects to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of projects to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/_apis/projects","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"stateFilter\": arguments.state_filter,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"List Project Teams","description":"List the teams defined in a project. Team names are required by the backlog, iteration, and capacity tools.","slug":"list-project-teams","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of team metadata within a project.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"mine":{"type":"boolean","description":"When true, return only the teams the authenticated user is a member of."},"top":{"type":"number","description":"Maximum number of teams to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of teams to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/_apis/projects/{project}/teams","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$mine\": arguments.mine,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Work Item Types","description":"List the work item types available in a project (Bug, User Story, Task, Epic, and any custom types) along with their fields and valid states. Call this before creating work items to learn which types and states the project's process allows.","slug":"list-work-item-types","ai_risk":{"level":"low","score":1,"reasoning":"Read-only process metadata lookup.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitemtypes","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Repositories","description":"List the Git repositories in a project. Returns repository IDs, names, default branches, and clone URLs.","slug":"list-repositories","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of repository metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"include_links":{"type":"boolean","description":"Include reference links in the response."},"include_all_urls":{"type":"boolean","description":"Include all remote URLs for each repository."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"includeLinks\": arguments.include_links,\n \"includeAllUrls\": arguments.include_all_urls\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Repository","description":"Get details of a single Git repository, including its default branch, size, and project.","slug":"get-repository","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a single repository.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Branches","description":"List the branches of a repository. Each entry includes the branch name and the commit it points at (objectId), which is what 'Create Branch' needs as its source commit.","slug":"list-branches","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of Git refs.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"name_contains":{"type":"string","description":"Return only branches whose name contains this substring, e.g. 'release'."},"top":{"type":"number","description":"Maximum number of branches to return. Defaults to 100.","default":100},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/refs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"filter\": \"heads/\",\n \"filterContains\": arguments.name_contains,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Branch","description":"Create a new branch pointing at an existing commit. Get the source commit SHA from 'List Branches' (the objectId of the branch you want to branch off) or from 'Search Commits'.","slug":"create-branch","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a new Git ref. Additive and easily deleted, but it writes to the repository.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"branch_name":{"type":"string","description":"Name of the new branch, without the 'refs/heads/' prefix, e.g. 'feature/checkout-redesign'."},"source_commit_id":{"type":"string","description":"Full 40-character SHA the new branch should point at. This is the objectId returned by 'List Branches' for the source branch."}},"required":["repository_id","branch_name","source_commit_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/refs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"[{\n \"name\": $contains(arguments.branch_name, \"refs/\") ? arguments.branch_name : \"refs/heads/\" & arguments.branch_name,\n \"oldObjectId\": \"0000000000000000000000000000000000000000\",\n \"newObjectId\": arguments.source_commit_id\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Get File","description":"Read the content of a file from a repository at a given branch, tag, or commit. Returns the file metadata together with its text content.","slug":"get-file","ai_risk":{"level":"low","score":2,"reasoning":"Read-only access to source code the authenticated user can already read.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"path":{"type":"string","description":"Path to the file from the repository root, e.g. '/src/index.ts'."},"version":{"type":"string","description":"Branch name, tag name, or commit SHA to read from. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]}},"required":["repository_id","path"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/items","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"includeContent\": true,\n \"$format\": \"json\",\n \"versionDescriptor.version\": arguments.version,\n \"versionDescriptor.versionType\": arguments.version_type\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Repository Items","description":"Browse the file tree of a repository. Returns the files and folders under a path without their content, which makes it the cheap way to explore a repository before reading specific files.","slug":"list-repository-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of repository paths.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"scope_path":{"type":"string","description":"Folder to list, e.g. '/src'. Defaults to the repository root."},"recursion_level":{"type":"string","description":"How deep to walk the tree. Defaults to 'oneLevel'. Use 'full' with care on large repositories.","enum":["none","oneLevel","oneLevelPlusNestedEmptyFolders","full"]},"version":{"type":"string","description":"Branch name, tag name, or commit SHA. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/items","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"scopePath\": arguments.scope_path,\n \"recursionLevel\": $exists(arguments.recursion_level) ? arguments.recursion_level : \"oneLevel\",\n \"includeContentMetadata\": true,\n \"versionDescriptor.version\": arguments.version,\n \"versionDescriptor.versionType\": arguments.version_type\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Commits","description":"Search the commit history of a repository, filtered by author, date range, branch, or file path. Use this to find when and by whom a change was made.","slug":"search-commits","ai_risk":{"level":"low","score":1,"reasoning":"Read-only query over commit metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"version":{"type":"string","description":"Branch, tag, or commit to search from. Defaults to the repository's default branch."},"version_type":{"type":"string","description":"How to interpret 'version'. Defaults to 'branch'.","enum":["branch","tag","commit"]},"author":{"type":"string","description":"Filter by commit author name or email."},"item_path":{"type":"string","description":"Only return commits that touched this path, e.g. '/src/api'."},"from_date":{"type":"string","description":"Only return commits after this date, e.g. '2026-01-01T00:00:00Z'."},"to_date":{"type":"string","description":"Only return commits before this date."},"top":{"type":"number","description":"Maximum number of commits to return. Defaults to 50.","default":50},"skip":{"type":"number","description":"Number of commits to skip, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/commitsbatch","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"itemVersion\": $exists(arguments.version) ? $sift({\n \"version\": arguments.version,\n \"versionType\": arguments.version_type\n }, function($v) { $v != null }) : null,\n \"author\": arguments.author,\n \"itemPath\": arguments.item_path,\n \"fromDate\": arguments.from_date,\n \"toDate\": arguments.to_date,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$skip\": arguments.skip,\n \"includeLinks\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Pull Requests","description":"List pull requests in a repository, filtered by status, author, reviewer, or branch. Returns active pull requests by default.","slug":"list-pull-requests","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pull request metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"status":{"type":"string","description":"Filter by pull request status. Defaults to 'active'.","enum":["active","abandoned","completed","all","notSet"]},"creator_id":{"type":"string","description":"Filter by the author's identity ID (GUID)."},"reviewer_id":{"type":"string","description":"Filter by a reviewer's identity ID (GUID)."},"source_branch":{"type":"string","description":"Filter by source branch, e.g. 'feature/login' or 'refs/heads/feature/login'."},"target_branch":{"type":"string","description":"Filter by target branch, e.g. 'main'."},"top":{"type":"number","description":"Maximum number of pull requests to return. Defaults to 50.","default":50},"skip":{"type":"number","description":"Number of pull requests to skip, for pagination."}},"required":["repository_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"searchCriteria.status\": $exists(arguments.status) ? arguments.status : \"active\",\n \"searchCriteria.creatorId\": arguments.creator_id,\n \"searchCriteria.reviewerId\": arguments.reviewer_id,\n \"searchCriteria.sourceRefName\": $exists(arguments.source_branch) ? ($contains(arguments.source_branch, \"refs/\") ? arguments.source_branch : \"refs/heads/\" & arguments.source_branch) : null,\n \"searchCriteria.targetRefName\": $exists(arguments.target_branch) ? ($contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch) : null,\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pull Request","description":"Get the full details of a pull request: description, source and target branches, reviewers and their votes, merge status, and optionally its commits and linked work items.","slug":"get-pull-request","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a single pull request.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"include_commits":{"type":"boolean","description":"Include the commits contained in the pull request."},"include_work_item_refs":{"type":"boolean","description":"Include references to linked work items."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"includeCommits\": arguments.include_commits,\n \"includeWorkItemRefs\": arguments.include_work_item_refs\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Pull Request","description":"Open a new pull request from a source branch into a target branch. Optionally add reviewers, mark it as a draft, and link work items.","slug":"create-pull-request","ai_risk":{"level":"medium","score":5,"reasoning":"Creates a visible pull request that notifies reviewers and can be configured to auto-complete.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"source_branch":{"type":"string","description":"Branch containing the changes, e.g. 'feature/login'. The 'refs/heads/' prefix is added automatically."},"target_branch":{"type":"string","description":"Branch to merge into, e.g. 'main'."},"title":{"type":"string","description":"Pull request title."},"description":{"type":"string","description":"Pull request description. Supports Markdown."},"reviewer_ids":{"type":"array","description":"Identity IDs (GUIDs) of reviewers to add. Groups and teams are accepted too.","items":{"type":"string"}},"is_draft":{"type":"boolean","description":"Open as a draft pull request, which does not trigger required reviewers or policies until published."},"work_item_ids":{"type":"array","description":"Work item IDs to link to the pull request.","items":{"type":"number"}}},"required":["repository_id","source_branch","target_branch","title"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"sourceRefName\": $contains(arguments.source_branch, \"refs/\") ? arguments.source_branch : \"refs/heads/\" & arguments.source_branch,\n \"targetRefName\": $contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch,\n \"title\": arguments.title,\n \"description\": arguments.description,\n \"isDraft\": arguments.is_draft,\n \"reviewers\": $exists(arguments.reviewer_ids) ? $map([arguments.reviewer_ids], function($v) { {\"id\": $v} })[] : null,\n \"workItemRefs\": $exists(arguments.work_item_ids) ? $map([arguments.work_item_ids], function($v) { {\"id\": $string($v)} })[] : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Pull Request","description":"Update a pull request: change its title or description, retarget it, publish a draft, set auto-complete, or complete or abandon it. Set status to 'completed' to merge and 'abandoned' to close without merging.","slug":"update-pull-request","ai_risk":{"level":"high","score":7,"reasoning":"Can merge or abandon a pull request, which changes the target branch's contents or discards proposed work.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"title":{"type":"string","description":"New title."},"description":{"type":"string","description":"New description."},"status":{"type":"string","description":"Set to 'completed' to merge the pull request, or 'abandoned' to close it without merging.","enum":["active","abandoned","completed"]},"target_branch":{"type":"string","description":"Retarget the pull request to this branch."},"is_draft":{"type":"boolean","description":"Set to false to publish a draft pull request, or true to convert it back to a draft."},"auto_complete_set_by_id":{"type":"string","description":"Identity ID (GUID) to set as the auto-complete requester. The pull request merges automatically once all policies pass."},"merge_strategy":{"type":"string","description":"Merge strategy used when completing the pull request.","enum":["noFastForward","squash","rebase","rebaseMerge"]},"delete_source_branch":{"type":"boolean","description":"Delete the source branch after completing the merge."},"merge_commit_message":{"type":"string","description":"Commit message to use for the merge commit."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"title\": arguments.title,\n \"description\": arguments.description,\n \"status\": arguments.status,\n \"isDraft\": arguments.is_draft,\n \"targetRefName\": $exists(arguments.target_branch) ? ($contains(arguments.target_branch, \"refs/\") ? arguments.target_branch : \"refs/heads/\" & arguments.target_branch) : null,\n \"autoCompleteSetBy\": $exists(arguments.auto_complete_set_by_id) ? {\"id\": arguments.auto_complete_set_by_id} : null,\n \"completionOptions\": ($exists(arguments.merge_strategy) or $exists(arguments.delete_source_branch) or $exists(arguments.merge_commit_message)) ? $sift({\n \"mergeStrategy\": arguments.merge_strategy,\n \"deleteSourceBranch\": arguments.delete_source_branch,\n \"mergeCommitMessage\": arguments.merge_commit_message\n }, function($v) { $v != null }) : null\n }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":false}},{"name":"List Pull Request Threads","description":"List the comment threads on a pull request, including inline code comments and their file positions. Use this to read review feedback.","slug":"list-pull-request-threads","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pull request review comments.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Pull Request Thread","description":"Start a new comment thread on a pull request. Omit the file path for a general comment, or provide a file path and line range to leave an inline code comment.","slug":"create-pull-request-thread","ai_risk":{"level":"medium","score":4,"reasoning":"Posts a visible comment that notifies pull request participants.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"content":{"type":"string","description":"Comment text. Supports Markdown."},"file_path":{"type":"string","description":"Path of the file to comment on, e.g. '/src/index.ts'. Omit for a general pull request comment."},"line_start":{"type":"number","description":"First line of the commented range in the updated file. Required when file_path is set."},"line_end":{"type":"number","description":"Last line of the commented range. Defaults to line_start."},"status":{"type":"string","description":"Initial thread status. Defaults to 'active'.","enum":["active","fixed","wontFix","closed","byDesign","pending"]}},"required":["repository_id","pull_request_id","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"comments\": [{\n \"parentCommentId\": 0,\n \"content\": arguments.content,\n \"commentType\": \"text\"\n }],\n \"status\": $exists(arguments.status) ? arguments.status : \"active\",\n \"threadContext\": $exists(arguments.file_path) ? {\n \"filePath\": arguments.file_path,\n \"rightFileStart\": {\"line\": arguments.line_start, \"offset\": 1},\n \"rightFileEnd\": {\"line\": $exists(arguments.line_end) ? arguments.line_end : arguments.line_start, \"offset\": 1}\n } : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Reply To Pull Request Thread","description":"Add a reply to an existing pull request comment thread. Get the thread ID from 'List Pull Request Threads'.","slug":"reply-to-pull-request-thread","ai_risk":{"level":"medium","score":3,"reasoning":"Posts a visible reply that notifies thread participants.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"thread_id":{"type":"number","description":"The comment thread ID to reply to."},"content":{"type":"string","description":"Reply text. Supports Markdown."},"parent_comment_id":{"type":"number","description":"Comment ID within the thread to reply to. Defaults to the first comment."}},"required":["repository_id","pull_request_id","thread_id","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads/{threadId}/comments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"threadId\": arguments.thread_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"content\": arguments.content,\n \"parentCommentId\": $exists(arguments.parent_comment_id) ? arguments.parent_comment_id : 1,\n \"commentType\": \"text\"\n }"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Pull Request Thread Status","description":"Resolve or reopen a pull request comment thread by changing its status, e.g. mark a review comment as fixed or won't fix.","slug":"update-pull-request-thread-status","ai_risk":{"level":"medium","score":3,"reasoning":"Changes review state that other reviewers rely on, but does not modify code.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"thread_id":{"type":"number","description":"The comment thread ID."},"status":{"type":"string","description":"New thread status.","enum":["active","fixed","wontFix","closed","byDesign","pending"]}},"required":["repository_id","pull_request_id","thread_id","status"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/threads/{threadId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"threadId\": arguments.thread_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"status\": arguments.status\n }"}},"annotations":{"idempotentHint":true}},{"name":"Set Pull Request Vote","description":"Cast or change a reviewer's vote on a pull request. Votes are 10 (approved), 5 (approved with suggestions), 0 (no vote), -5 (waiting for author), and -10 (rejected).","slug":"set-pull-request-vote","ai_risk":{"level":"high","score":7,"reasoning":"Approving a pull request can satisfy branch policies and allow code to merge into a protected branch.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."},"reviewer_id":{"type":"string","description":"Identity ID (GUID) of the reviewer whose vote is being set. Use 'me' for the authenticated user."},"vote":{"type":"number","description":"10 = approved, 5 = approved with suggestions, 0 = no vote, -5 = waiting for author, -10 = rejected.","enum":[10,5,0,-5,-10]}},"required":["repository_id","pull_request_id","reviewer_id","vote"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}/reviewers/{reviewerId}","method":"PUT","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id,\n \"reviewerId\": arguments.reviewer_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"vote\": arguments.vote\n }"}},"annotations":{"idempotentHint":true}},{"name":"List Pull Request Work Items","description":"List the work items linked to a pull request. Use this to trace a code change back to the bug or story it implements.","slug":"list-pull-request-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of work item references.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository_id":{"type":"string","description":"Repository name or ID."},"pull_request_id":{"type":"number","description":"The pull request ID."}},"required":["repository_id","pull_request_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}/workitems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repositoryId\": arguments.repository_id,\n \"pullRequestId\": arguments.pull_request_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Pipelines","description":"List the pipelines defined in a project. Returns pipeline IDs and names, which the run and history tools need.","slug":"list-pipelines","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pipeline definitions.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"top":{"type":"number","description":"Maximum number of pipelines to return. Defaults to 100.","default":100},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pipeline","description":"Get a pipeline's definition, including its YAML configuration path, repository, and folder.","slug":"get-pipeline","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of a pipeline definition.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."},"pipeline_version":{"type":"number","description":"Specific pipeline revision to fetch. Defaults to the latest."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"pipelineVersion\": arguments.pipeline_version\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Run Pipeline","description":"Queue a new run of a pipeline, optionally against a specific branch and with template parameters or variables. Set preview_run to true to validate the final YAML without actually running anything.","slug":"run-pipeline","ai_risk":{"level":"high","score":8,"reasoning":"Executes arbitrary pipeline code, which can deploy to production environments and consume build resources.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID to run."},"branch":{"type":"string","description":"Branch to run against, e.g. 'main'. Defaults to the pipeline's default branch."},"template_parameters":{"type":"object","description":"Runtime parameters declared in the pipeline YAML, e.g. { \"environment\": \"staging\" }.","additionalProperties":true},"variables":{"type":"object","description":"Pipeline variables keyed by name, e.g. { \"deployTarget\": { \"value\": \"canary\" } }.","additionalProperties":true},"stages_to_skip":{"type":"array","description":"Names of stages to skip in this run.","items":{"type":"string"}},"preview_run":{"type":"boolean","description":"When true, return the final expanded YAML without queueing a run. Useful for validating changes safely."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"resources\": $exists(arguments.branch) ? {\n \"repositories\": {\n \"self\": {\n \"refName\": $contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch\n }\n }\n } : null,\n \"templateParameters\": arguments.template_parameters,\n \"variables\": arguments.variables,\n \"stagesToSkip\": arguments.stages_to_skip,\n \"previewRun\": arguments.preview_run\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"List Pipeline Runs","description":"List the most recent runs of a pipeline, newest first, with their state and result.","slug":"list-pipeline-runs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of pipeline run history.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."}},"required":["pipeline_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pipeline Run","description":"Get a single pipeline run with its state, result, resources, and the template parameters it was queued with.","slug":"get-pipeline-run","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one pipeline run.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"pipeline_id":{"type":"number","description":"The pipeline ID."},"run_id":{"type":"number","description":"The run ID."}},"required":["pipeline_id","run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/pipelines/{pipelineId}/runs/{runId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"pipelineId\": arguments.pipeline_id,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Build Definitions","description":"List build definitions in a project, optionally filtered by name or by the repository they build. Build definition IDs are what the 'List Builds' filter expects.","slug":"list-build-definitions","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build definitions.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Filter by definition name. Supports a trailing wildcard, e.g. 'api-*'."},"repository_id":{"type":"string","description":"Only return definitions that build this repository. Requires repository_type."},"repository_type":{"type":"string","description":"Type of the repository referenced by repository_id, e.g. 'TfsGit' or 'GitHub'."},"top":{"type":"number","description":"Maximum number of definitions to return. Defaults to 100.","default":100}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/definitions","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"name\": arguments.name,\n \"repositoryId\": arguments.repository_id,\n \"repositoryType\": arguments.repository_type,\n \"$top\": $exists(arguments.top) ? arguments.top : 100\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Builds","description":"List builds in a project, filtered by definition, branch, status, result, or time range. This is the tool to reach for when asked whether a branch's build is passing.","slug":"list-builds","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build history.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"definition_ids":{"type":"array","description":"Only return builds of these build definition IDs. Get them from 'List Build Definitions'.","items":{"type":"number"}},"branch":{"type":"string","description":"Only return builds of this branch, e.g. 'main'."},"status_filter":{"type":"string","description":"Filter by build status.","enum":["none","inProgress","completed","cancelling","postponed","notStarted","all"]},"result_filter":{"type":"string","description":"Filter by build result.","enum":["none","succeeded","partiallySucceeded","failed","canceled"]},"reason_filter":{"type":"string","description":"Filter by what triggered the build, e.g. 'pullRequest' or 'individualCI'."},"requested_for":{"type":"string","description":"Only return builds requested by this user (identity ID or unique name)."},"min_time":{"type":"string","description":"Only return builds finished after this time, e.g. '2026-08-01T00:00:00Z'."},"max_time":{"type":"string","description":"Only return builds finished before this time."},"tag_filters":{"type":"array","description":"Only return builds carrying all of these tags.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of builds to return. Defaults to 25.","default":25},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"definitions\": $exists(arguments.definition_ids) ? $join($map([arguments.definition_ids], function($v) { $string($v) }), \",\") : null,\n \"branchName\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null,\n \"statusFilter\": arguments.status_filter,\n \"resultFilter\": arguments.result_filter,\n \"reasonFilter\": arguments.reason_filter,\n \"requestedFor\": arguments.requested_for,\n \"minTime\": arguments.min_time,\n \"maxTime\": arguments.max_time,\n \"tagFilters\": $exists(arguments.tag_filters) ? $join([arguments.tag_filters], \",\") : null,\n \"queryOrder\": \"finishTimeDescending\",\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Build","description":"Get a single build with its status, result, triggering commit, requested-by identity, and timing.","slug":"get-build","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one build.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Cancel Build","description":"Cancel a build that is queued or in progress.","slug":"cancel-build","ai_risk":{"level":"medium","score":5,"reasoning":"Stops a running build, which can interrupt a deployment in progress.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID to cancel."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"status\": \"cancelling\"\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"List Build Logs","description":"List the log files produced by a build, with their IDs, line counts, and sizes. Use this to find the log you want before fetching its content.","slug":"list-build-logs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build log metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/logs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Build Log Content","description":"Read the plain-text content of a build log. Logs can be very large, so pass start_line and end_line to fetch only the section you need — the tail is usually where the failure is.","slug":"get-build-log-content","ai_risk":{"level":"low","score":2,"reasoning":"Read-only access to build output, which may echo configuration values but not stored secrets.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."},"log_id":{"type":"number","description":"The log ID, from 'List Build Logs'."},"start_line":{"type":"number","description":"First line to return."},"end_line":{"type":"number","description":"Last line to return."}},"required":["build_id","log_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/logs/{logId}","method":"GET","responseType":"text","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id,\n \"logId\": arguments.log_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"startLine\": arguments.start_line,\n \"endLine\": arguments.end_line\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Build Artifacts","description":"List the artifacts published by a build, with their names, types, and download URLs.","slug":"list-build-artifacts","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of build artifact metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/build/builds/{buildId}/artifacts","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"buildId\": arguments.build_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Work Item","description":"Get a single work item by ID with its fields, and optionally its relations and history. Work items cover bugs, user stories, tasks, epics, and any custom types the project defines.","slug":"get-work-item","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one work item.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"fields":{"type":"string","description":"Comma-separated field reference names to return, e.g. 'System.Title,System.State,System.AssignedTo'. Omit to return all fields."},"expand":{"type":"string","description":"Additional data to include. Use 'relations' to see parent, child, and linked items.","enum":["none","relations","fields","links","all"]},"as_of":{"type":"string","description":"Return the work item as it looked at this UTC timestamp, e.g. '2026-07-01T00:00:00Z'."}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"fields\": arguments.fields,\n \"$expand\": arguments.expand,\n \"asOf\": arguments.as_of\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Work Items Batch","description":"Fetch up to 200 work items in one request by ID. Much cheaper than calling 'Get Work Item' repeatedly, so prefer this after a WIQL query returns a list of IDs.","slug":"get-work-items-batch","ai_risk":{"level":"low","score":1,"reasoning":"Read-only bulk lookup of work items.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"ids":{"type":"array","description":"Work item IDs to fetch. Maximum 200 per request.","items":{"type":"number"}},"fields":{"type":"array","description":"Field reference names to return, e.g. ['System.Title', 'System.State']. Cannot be combined with expand.","items":{"type":"string"}},"expand":{"type":"string","description":"Additional data to include. Cannot be combined with fields.","enum":["none","relations","fields","links","all"]}},"required":["ids"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitemsbatch","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"ids\": [arguments.ids],\n \"fields\": $exists(arguments.fields) ? [arguments.fields] : null,\n \"$expand\": arguments.expand\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Work Item","description":"Create a work item of any type the project's process defines (Bug, User Story, Task, Epic, ...). Call 'List Work Item Types' first if you are unsure which types and states are valid.","slug":"create-work-item","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a tracked work item that notifies the area's subscribers, but is additive and reversible.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"work_item_type":{"type":"string","description":"Work item type name, e.g. 'Bug', 'User Story', 'Task', 'Epic'."},"parent_id":{"type":"number","description":"ID of a work item to attach this one to as a child, e.g. the epic a story belongs to."},"title":{"type":"string","description":"Work item title (System.Title)."},"description":{"type":"string","description":"Work item description (System.Description). Accepts HTML for most work item types."},"assigned_to":{"type":"string","description":"Email or display name of the assignee (System.AssignedTo), e.g. 'jane@contoso.com'."},"state":{"type":"string","description":"Workflow state (System.State), e.g. 'New', 'Active', 'Resolved', 'Closed'. Valid values depend on the work item type and process."},"area_path":{"type":"string","description":"Area path (System.AreaPath), e.g. 'MyProject\\\\Platform'."},"iteration_path":{"type":"string","description":"Iteration path (System.IterationPath), e.g. 'MyProject\\\\Sprint 12'."},"tags":{"type":"string","description":"Semicolon-separated tags (System.Tags), e.g. 'backend; tech-debt'."},"priority":{"type":"number","description":"Priority (Microsoft.VSTS.Common.Priority), typically 1-4."},"story_points":{"type":"number","description":"Story points (Microsoft.VSTS.Scheduling.StoryPoints)."},"acceptance_criteria":{"type":"string","description":"Acceptance criteria (Microsoft.VSTS.Common.AcceptanceCriteria)."},"repro_steps":{"type":"string","description":"Reproduction steps for bugs (Microsoft.VSTS.TCM.ReproSteps)."},"fields":{"type":"object","description":"Any additional fields keyed by their reference name, e.g. { \"Custom.Team\": \"Platform\", \"Microsoft.VSTS.Scheduling.RemainingWork\": 4 }.","additionalProperties":true}},"required":["work_item_type","title"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{workItemType}","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"workItemType\": \"$\" & $encodeUrlComponent(arguments.work_item_type)\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"$append(\n ($fields := $sift($merge([\n {\n \"System.Title\": arguments.title,\n \"System.Description\": arguments.description,\n \"System.AssignedTo\": arguments.assigned_to,\n \"System.State\": arguments.state,\n \"System.AreaPath\": arguments.area_path,\n \"System.IterationPath\": arguments.iteration_path,\n \"System.Tags\": arguments.tags,\n \"Microsoft.VSTS.Common.Priority\": arguments.priority,\n \"Microsoft.VSTS.Scheduling.StoryPoints\": arguments.story_points,\n \"Microsoft.VSTS.Common.AcceptanceCriteria\": arguments.acceptance_criteria,\n \"Microsoft.VSTS.TCM.ReproSteps\": arguments.repro_steps\n },\n $exists(arguments.fields) ? arguments.fields : {}\n ]), function($v) { $v != null });\n $exists($fields) ? $each($fields, function($v, $k) {\n {\"op\": \"add\", \"path\": \"/fields/\" & $k, \"value\": $v}\n }) : []),\n $exists(arguments.parent_id) ? [{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": {\n \"rel\": \"System.LinkTypes.Hierarchy-Reverse\",\n \"url\": \"https://dev.azure.com/\" & settings.organization & \"/_apis/wit/workItems/\" & $string(arguments.parent_id)\n }\n }] : []\n )"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Update Work Item","description":"Update fields on an existing work item, for example to change its state, reassign it, or move it to another iteration. Only the fields you pass are modified; everything else is left alone.","slug":"update-work-item","ai_risk":{"level":"medium","score":5,"reasoning":"Overwrites tracked work item fields and can change state or ownership, which teams rely on for planning.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID to update."},"suppress_notifications":{"type":"boolean","description":"Do not send change notifications to subscribers for this update."},"title":{"type":"string","description":"Work item title (System.Title)."},"description":{"type":"string","description":"Work item description (System.Description). Accepts HTML for most work item types."},"assigned_to":{"type":"string","description":"Email or display name of the assignee (System.AssignedTo), e.g. 'jane@contoso.com'."},"state":{"type":"string","description":"Workflow state (System.State), e.g. 'New', 'Active', 'Resolved', 'Closed'. Valid values depend on the work item type and process."},"area_path":{"type":"string","description":"Area path (System.AreaPath), e.g. 'MyProject\\\\Platform'."},"iteration_path":{"type":"string","description":"Iteration path (System.IterationPath), e.g. 'MyProject\\\\Sprint 12'."},"tags":{"type":"string","description":"Semicolon-separated tags (System.Tags), e.g. 'backend; tech-debt'."},"priority":{"type":"number","description":"Priority (Microsoft.VSTS.Common.Priority), typically 1-4."},"story_points":{"type":"number","description":"Story points (Microsoft.VSTS.Scheduling.StoryPoints)."},"acceptance_criteria":{"type":"string","description":"Acceptance criteria (Microsoft.VSTS.Common.AcceptanceCriteria)."},"repro_steps":{"type":"string","description":"Reproduction steps for bugs (Microsoft.VSTS.TCM.ReproSteps)."},"fields":{"type":"object","description":"Any additional fields keyed by their reference name, e.g. { \"Custom.Team\": \"Platform\", \"Microsoft.VSTS.Scheduling.RemainingWork\": 4 }.","additionalProperties":true}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"suppressNotifications\": arguments.suppress_notifications\n }, function($v) { $v != null })","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"($fields := $sift($merge([\n {\n \"System.Title\": arguments.title,\n \"System.Description\": arguments.description,\n \"System.AssignedTo\": arguments.assigned_to,\n \"System.State\": arguments.state,\n \"System.AreaPath\": arguments.area_path,\n \"System.IterationPath\": arguments.iteration_path,\n \"System.Tags\": arguments.tags,\n \"Microsoft.VSTS.Common.Priority\": arguments.priority,\n \"Microsoft.VSTS.Scheduling.StoryPoints\": arguments.story_points,\n \"Microsoft.VSTS.Common.AcceptanceCriteria\": arguments.acceptance_criteria,\n \"Microsoft.VSTS.TCM.ReproSteps\": arguments.repro_steps\n },\n $exists(arguments.fields) ? arguments.fields : {}\n ]), function($v) { $v != null });\n $exists($fields) ? $each($fields, function($v, $k) {\n {\"op\": \"add\", \"path\": \"/fields/\" & $k, \"value\": $v}\n }) : [])"}},"annotations":{"idempotentHint":true}},{"name":"List Work Item Comments","description":"List the discussion comments on a work item, newest first by default.","slug":"list-work-item-comments","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of work item discussion.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"top":{"type":"number","description":"Maximum number of comments to return. Defaults to 50.","default":50},"order":{"type":"string","description":"Sort order by creation date. Defaults to 'desc'.","enum":["asc","desc"]}},"required":["id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workItems/{id}/comments","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"$sift({\n \"api-version\": \"7.1-preview.4\",\n \"$top\": $exists(arguments.top) ? arguments.top : 50,\n \"order\": $exists(arguments.order) ? arguments.order : \"desc\"\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Add Work Item Comment","description":"Post a comment to a work item's discussion. Use this to record findings or decisions on a bug or story.","slug":"add-work-item-comment","ai_risk":{"level":"medium","score":3,"reasoning":"Posts a permanent, visible comment that notifies the work item's followers.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID."},"text":{"type":"string","description":"Comment body. Accepts HTML."}},"required":["id","text"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workItems/{id}/comments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1-preview.4\"\n }","body":"{\n \"text\": arguments.text\n }"}},"annotations":{"idempotentHint":false,"openWorldHint":true}},{"name":"Link Work Items","description":"Create a link between two work items, for example to set a parent, add a child, or mark two items as related or duplicates.","slug":"link-work-items","ai_risk":{"level":"medium","score":3,"reasoning":"Changes work item relationships, which affects backlog hierarchy and rollup, but no field data is lost.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item the link is added to."},"target_id":{"type":"number","description":"The work item on the other end of the link."},"relation_type":{"type":"string","description":"Link type. 'System.LinkTypes.Hierarchy-Reverse' makes target_id the parent of id; 'Hierarchy-Forward' makes it a child.","enum":["System.LinkTypes.Related","System.LinkTypes.Hierarchy-Forward","System.LinkTypes.Hierarchy-Reverse","System.LinkTypes.Dependency-Forward","System.LinkTypes.Dependency-Reverse","System.LinkTypes.Duplicate-Forward","System.LinkTypes.Duplicate-Reverse","Microsoft.VSTS.Common.TestedBy-Forward","Microsoft.VSTS.Common.TestedBy-Reverse"]},"comment":{"type":"string","description":"Optional note explaining the link."}},"required":["id","target_id","relation_type"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"[{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": $sift({\n \"rel\": arguments.relation_type,\n \"url\": \"https://dev.azure.com/\" & settings.organization & \"/_apis/wit/workItems/\" & $string(arguments.target_id),\n \"attributes\": $exists(arguments.comment) ? {\"comment\": arguments.comment} : null\n }, function($v) { $v != null })\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Upload Work Item Attachment","description":"Upload a text file to the work item attachment store and get back an attachment URL. Pass that URL to 'Add Work Item Attachment Link' to attach it to a work item.","slug":"upload-work-item-attachment","ai_risk":{"level":"medium","score":4,"reasoning":"Writes file content into the organization's attachment store.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"file_name":{"type":"string","description":"File name to store, e.g. 'repro-log.txt'."},"content":{"type":"string","description":"The file's text content."}},"required":["file_name","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/attachments","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"fileName\": arguments.file_name\n }","headers":"{\n \"Content-Type\": \"application/octet-stream\"\n }","body":"arguments.content"}},"annotations":{"idempotentHint":false}},{"name":"Add Work Item Attachment Link","description":"Attach an already-uploaded file to a work item using the URL returned by 'Upload Work Item Attachment'.","slug":"add-work-item-attachment-link","ai_risk":{"level":"medium","score":3,"reasoning":"Adds an attachment relation to a work item; additive and removable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"id":{"type":"number","description":"The work item ID to attach the file to."},"attachment_url":{"type":"string","description":"Attachment URL returned by 'Upload Work Item Attachment'."},"comment":{"type":"string","description":"Optional note describing the attachment."}},"required":["id","attachment_url"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/workitems/{id}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"id\": arguments.id\n }","query":"{\n \"api-version\": \"7.1\"\n }","headers":"{\n \"Content-Type\": \"application/json-patch+json\"\n }","body":"[{\n \"op\": \"add\",\n \"path\": \"/relations/-\",\n \"value\": $sift({\n \"rel\": \"AttachedFile\",\n \"url\": arguments.attachment_url,\n \"attributes\": $exists(arguments.comment) ? {\"comment\": arguments.comment} : null\n }, function($v) { $v != null })\n }]"}},"annotations":{"idempotentHint":false}},{"name":"Run Work Item Query","description":"Run a WIQL (Work Item Query Language) query and get back the matching work item IDs. WIQL looks like SQL, e.g. \"SELECT [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.AssignedTo] = @Me ORDER BY [System.ChangedDate] DESC\". Follow up with 'Get Work Items Batch' to read the fields.","slug":"run-work-item-query","ai_risk":{"level":"low","score":2,"reasoning":"Read-only query. Scoped to work items the authenticated user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"query":{"type":"string","description":"The WIQL query. Supports macros like @Me, @Today, and @CurrentIteration."},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 100.","default":100}},"required":["query"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/wiql","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"$top\": $exists(arguments.top) ? arguments.top : 100\n }","body":"{\n \"query\": arguments.query\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Saved Queries","description":"List the saved work item queries in a project, both shared and personal, so you can reuse a team's existing query instead of writing new WIQL.","slug":"list-saved-queries","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of saved query metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"depth":{"type":"number","description":"How many levels of query folders to walk. Defaults to 2.","default":2},"expand":{"type":"string","description":"Use 'wiql' to include each query's WIQL text in the response.","enum":["none","all","clauses","minimal","wiql"]}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wit/queries","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$depth\": $exists(arguments.depth) ? arguments.depth : 2,\n \"$expand\": arguments.expand\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Backlogs","description":"List a team's backlog levels (for example Epics, Features, Stories) with their IDs, which 'List Backlog Work Items' needs.","slug":"list-backlogs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of backlog configuration.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."}},"required":["team"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/backlogs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Backlog Work Items","description":"List the work items on one of a team's backlog levels, in backlog order. Combine with 'Get Work Items Batch' to read their fields.","slug":"list-backlog-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of backlog contents.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"backlog_id":{"type":"string","description":"Backlog level ID from 'List Backlogs', e.g. 'Microsoft.RequirementCategory'."}},"required":["team","backlog_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/backlogs/{backlogId}/workItems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"backlogId\": arguments.backlog_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Team Iterations","description":"List a team's iterations (sprints) with their date ranges. Pass timeframe 'current' to find the sprint in progress.","slug":"list-team-iterations","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint configuration.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"timeframe":{"type":"string","description":"Set to 'current' to return only the iteration currently in progress.","enum":["current"]}},"required":["team"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"$timeframe\": arguments.timeframe\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Assign Team Iteration","description":"Add an existing project iteration to a team's sprint list, so the team's boards and capacity planning include it. The iteration must already exist in the project's classification nodes.","slug":"assign-team-iteration","ai_risk":{"level":"medium","score":4,"reasoning":"Changes a team's sprint configuration, which affects everyone's boards.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Identifier (GUID) of the project iteration to add to the team."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"{\n \"id\": arguments.iteration_id\n }"}},"annotations":{"idempotentHint":true}},{"name":"List Iteration Work Items","description":"List the work items assigned to a team's iteration, with their parent-child relations. Use this to see a sprint's contents.","slug":"list-iteration-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint contents.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/workitems","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Team Capacity","description":"Get each team member's capacity and days off for an iteration. Use this to reason about how much work a sprint can absorb.","slug":"get-team-capacity","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of sprint capacity settings.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."}},"required":["team","iteration_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/capacities","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Team Member Capacity","description":"Set a team member's per-day capacity and days off for an iteration. Capacity is expressed per activity, e.g. 6 hours per day of Development.","slug":"update-team-member-capacity","ai_risk":{"level":"medium","score":4,"reasoning":"Overwrites another person's sprint capacity, which changes the team's planning numbers.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"team":{"type":"string","description":"Team name or ID. Use 'List Project Teams' to discover the available teams."},"iteration_id":{"type":"string","description":"Iteration identifier (GUID) from 'List Team Iterations'."},"team_member_id":{"type":"string","description":"Identity ID (GUID) of the team member, from 'Get Team Capacity'."},"activities":{"type":"array","description":"Per-activity capacity, e.g. [{ \"name\": \"Development\", \"capacityPerDay\": 6 }].","items":{"type":"object","properties":{"name":{"type":"string","description":"Activity name, e.g. 'Development', 'Testing', 'Design'."},"capacityPerDay":{"type":"number","description":"Hours per day for this activity."}},"additionalProperties":false}},"days_off":{"type":"array","description":"Date ranges the member is away, e.g. [{ \"start\": \"2026-09-01T00:00:00Z\", \"end\": \"2026-09-05T00:00:00Z\" }].","items":{"type":"object","properties":{"start":{"type":"string","description":"First day off (UTC)."},"end":{"type":"string","description":"Last day off (UTC)."}},"additionalProperties":false}}},"required":["team","iteration_id","team_member_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}/capacities/{teamMemberId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"team\": arguments.team,\n \"iterationId\": arguments.iteration_id,\n \"teamMemberId\": arguments.team_member_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"activities\": $exists(arguments.activities) ? [arguments.activities] : null,\n \"daysOff\": $exists(arguments.days_off) ? [arguments.days_off] : null\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":true}},{"name":"List Wikis","description":"List the wikis in a project. Returns wiki IDs and names, which the page tools need as the wiki identifier.","slug":"list-wikis","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of wiki metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Wiki","description":"Get a wiki's details, including its type (project wiki or code wiki), repository, and mapped path.","slug":"get-wiki","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one wiki.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."}},"required":["wiki_identifier"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Wiki Page","description":"Read a wiki page by its path, optionally including its Markdown content and its sub-pages. Pass path '/' with a recursion level to list the wiki's page tree.","slug":"get-wiki-page","ai_risk":{"level":"low","score":1,"reasoning":"Read-only access to wiki content.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."},"path":{"type":"string","description":"Page path, e.g. '/Runbooks/On-Call'. Use '/' for the wiki root."},"include_content":{"type":"boolean","description":"Include the page's Markdown content. Defaults to true.","default":true},"recursion_level":{"type":"string","description":"Include sub-pages. Defaults to 'none'. Use 'oneLevel' or 'full' to walk the page tree.","enum":["none","oneLevel","full"]},"version":{"type":"string","description":"Branch or commit to read from, for code wikis. Defaults to the wiki's mapped branch."}},"required":["wiki_identifier","path"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"includeContent\": $exists(arguments.include_content) ? arguments.include_content : true,\n \"recursionLevel\": arguments.recursion_level,\n \"versionDescriptor.version\": arguments.version\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Or Update Wiki Page","description":"Create a wiki page, or replace an existing one. Creating is straightforward; to update an existing page you must first call 'Get Wiki Page' and pass its ETag as the version, which is how Azure DevOps prevents you from overwriting someone else's concurrent edit.","slug":"create-or-update-wiki-page","ai_risk":{"level":"medium","score":5,"reasoning":"Replaces the full content of a shared documentation page. Existing content is overwritten rather than merged.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"wiki_identifier":{"type":"string","description":"Wiki name or ID, from 'List Wikis'."},"path":{"type":"string","description":"Page path, e.g. '/Runbooks/On-Call'. Parent pages are created automatically."},"content":{"type":"string","description":"Full Markdown content of the page."},"version":{"type":"string","description":"ETag of the page being replaced, from the 'ETag' header of 'Get Wiki Page'. Required when updating an existing page; omit when creating a new one."},"comment":{"type":"string","description":"Commit message for the change."}},"required":["wiki_identifier","path","content"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages","method":"PUT","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"wikiIdentifier\": arguments.wiki_identifier\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"path\": arguments.path,\n \"comment\": arguments.comment\n }, function($v) { $v != null })","headers":"$sift({\n \"If-Match\": arguments.version\n }, function($v) { $v != null })","body":"{\n \"content\": arguments.content\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Search Code","description":"Full-text search across the source code in a project's repositories. Supports code element filters like 'class:', 'func:', and 'comment:' in the search text. This is the fastest way to find where something is defined without knowing the repository or path.","slug":"search-code","ai_risk":{"level":"low","score":2,"reasoning":"Read-only search scoped to code the authenticated user can already read.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'createCheckoutSession' or 'class:PaymentService'."},"repositories":{"type":"array","description":"Limit the search to these repository names.","items":{"type":"string"}},"paths":{"type":"array","description":"Limit the search to these path prefixes, e.g. ['/src'].","items":{"type":"string"}},"branches":{"type":"array","description":"Limit the search to these branches. Only branches indexed for search can be used.","items":{"type":"string"}},"code_elements":{"type":"array","description":"Limit matches to these code element kinds, e.g. ['class', 'function', 'comment'].","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/codesearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"Repository\": $exists(arguments.repositories) ? [arguments.repositories] : null,\n \"Path\": $exists(arguments.paths) ? [arguments.paths] : null,\n \"Branch\": $exists(arguments.branches) ? [arguments.branches] : null,\n \"CodeElement\": $exists(arguments.code_elements) ? [arguments.code_elements] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Work Items","description":"Full-text search across work items in a project. Use this when you know roughly what the item says but not its ID; use 'Run Work Item Query' instead when you need precise field-based filtering.","slug":"search-work-items","ai_risk":{"level":"low","score":1,"reasoning":"Read-only search over work items the user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'checkout timeout on mobile'."},"work_item_types":{"type":"array","description":"Limit to these work item types, e.g. ['Bug', 'Task'].","items":{"type":"string"}},"states":{"type":"array","description":"Limit to these states, e.g. ['Active', 'New'].","items":{"type":"string"}},"assigned_to":{"type":"array","description":"Limit to work items assigned to these users.","items":{"type":"string"}},"area_paths":{"type":"array","description":"Limit to these area paths.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/workitemsearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"System.WorkItemType\": $exists(arguments.work_item_types) ? [arguments.work_item_types] : null,\n \"System.State\": $exists(arguments.states) ? [arguments.states] : null,\n \"System.AssignedTo\": $exists(arguments.assigned_to) ? [arguments.assigned_to] : null,\n \"System.AreaPath\": $exists(arguments.area_paths) ? [arguments.area_paths] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Search Wiki","description":"Full-text search across a project's wiki pages. Use this to find runbooks, design docs, and onboarding notes.","slug":"search-wiki","ai_risk":{"level":"low","score":1,"reasoning":"Read-only search over wiki content the user can already see.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"search_text":{"type":"string","description":"Search query, e.g. 'database failover runbook'."},"wikis":{"type":"array","description":"Limit the search to these wiki names.","items":{"type":"string"}},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["search_text"],"additionalProperties":false},"action":{"path":"https://almsearch.dev.azure.com/{organization}/{project}/_apis/search/wikisearchresults","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"searchText\": arguments.search_text,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip,\n \"filters\": $sift({\n \"Wiki\": $exists(arguments.wikis) ? [arguments.wikis] : null\n }, function($v) { $v != null }),\n \"includeFacets\": false\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Test Plans","description":"List the test plans in a project, with their area path, iteration, and owner.","slug":"list-test-plans","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test plan metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"owner":{"type":"string","description":"Filter by the plan owner's identity ID or unique name."},"active_only":{"type":"boolean","description":"Return only plans whose iteration has not ended. Defaults to true.","default":true},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/plans","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"owner\": arguments.owner,\n \"filterActivePlans\": $exists(arguments.active_only) ? arguments.active_only : true,\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Plan","description":"Create a new test plan in a project, scoped to an area path and iteration.","slug":"create-test-plan","ai_risk":{"level":"medium","score":3,"reasoning":"Creates a new test plan; additive and deletable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Test plan name."},"area_path":{"type":"string","description":"Area path for the plan, e.g. 'MyProject\\\\Platform'."},"iteration":{"type":"string","description":"Iteration path for the plan, e.g. 'MyProject\\\\Sprint 12'."},"description":{"type":"string","description":"Plan description."},"start_date":{"type":"string","description":"Plan start date, e.g. '2026-09-01T00:00:00Z'."},"end_date":{"type":"string","description":"Plan end date."}},"required":["name","iteration"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/plans","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"areaPath\": arguments.area_path,\n \"iteration\": arguments.iteration,\n \"description\": arguments.description,\n \"startDate\": arguments.start_date,\n \"endDate\": arguments.end_date\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"List Test Suites","description":"List the test suites in a test plan, including their hierarchy and suite type.","slug":"list-test-suites","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test suite metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["plan_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/suites","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Suite","description":"Create a test suite inside a test plan. Static suites hold test cases you add explicitly; query-based suites populate themselves from a WIQL query.","slug":"create-test-suite","ai_risk":{"level":"medium","score":3,"reasoning":"Creates a new test suite; additive and deletable.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"name":{"type":"string","description":"Suite name."},"parent_suite_id":{"type":"number","description":"ID of the parent suite. Use the plan's root suite ID from 'List Test Suites'."},"suite_type":{"type":"string","description":"Suite type. Defaults to 'staticTestSuite'.","enum":["staticTestSuite","dynamicTestSuite","requirementTestSuite"]},"query_string":{"type":"string","description":"WIQL query that populates the suite. Required for 'dynamicTestSuite'."},"requirement_id":{"type":"number","description":"Work item ID the suite is based on. Required for 'requirementTestSuite'."}},"required":["plan_id","name","parent_suite_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/suites","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"suiteType\": $exists(arguments.suite_type) ? arguments.suite_type : \"staticTestSuite\",\n \"parentSuite\": {\"id\": arguments.parent_suite_id},\n \"queryString\": arguments.query_string,\n \"requirementId\": arguments.requirement_id\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"List Test Cases","description":"List the test cases in a test suite, with their point assignments and configurations.","slug":"list-test-cases","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test cases in a suite.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"suite_id":{"type":"number","description":"The test suite ID."},"continuation_token":{"type":"string","description":"Continuation token from a previous response, for pagination."}},"required":["plan_id","suite_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/Suites/{suiteId}/TestCase","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id,\n \"suiteId\": arguments.suite_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"continuationToken\": arguments.continuation_token\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Add Test Cases To Suite","description":"Add existing test case work items to a static test suite. Create the test case itself with 'Create Work Item' using the 'Test Case' type first.","slug":"add-test-cases-to-suite","ai_risk":{"level":"medium","score":3,"reasoning":"Changes which test cases a suite covers, but does not modify the test cases themselves.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"The test plan ID."},"suite_id":{"type":"number","description":"The test suite ID."},"work_item_ids":{"type":"array","description":"IDs of the Test Case work items to add.","items":{"type":"number"}}},"required":["plan_id","suite_id","work_item_ids"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/testplan/Plans/{planId}/Suites/{suiteId}/TestCase","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"planId\": arguments.plan_id,\n \"suiteId\": arguments.suite_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$map([arguments.work_item_ids], function($v) { {\"workItem\": {\"id\": $v}} })[]"}},"annotations":{"idempotentHint":true}},{"name":"List Test Runs","description":"List test runs in a project, optionally filtered by test plan, state, or the build that produced them.","slug":"list-test-runs","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test run metadata.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"plan_id":{"type":"number","description":"Only return runs belonging to this test plan."},"state":{"type":"string","description":"Filter by run state.","enum":["unspecified","notStarted","inProgress","completed","aborted","waiting","needsInvestigation"]},"include_run_details":{"type":"boolean","description":"Include the run statistics in the response."},"top":{"type":"number","description":"Maximum number of runs to return. Defaults to 25.","default":25},"skip":{"type":"number","description":"Number of runs to skip, for pagination."}},"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"planId\": arguments.plan_id,\n \"state\": arguments.state,\n \"includeRunDetails\": arguments.include_run_details,\n \"$top\": $exists(arguments.top) ? arguments.top : 25,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Test Run","description":"Get a single test run with its state, totals, and pass/fail counts.","slug":"get-test-run","ai_risk":{"level":"low","score":1,"reasoning":"Read-only lookup of one test run.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs/{runId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Test Results","description":"List the individual test results in a test run. Filter by outcome to pull just the failures when investigating a red build.","slug":"list-test-results","ai_risk":{"level":"low","score":1,"reasoning":"Read-only listing of test result details.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."},"outcomes":{"type":"array","description":"Only return results with these outcomes, e.g. ['Failed', 'Aborted'].","items":{"type":"string"}},"details_to_include":{"type":"string","description":"Extra detail to include. Use 'Iterations' for per-iteration data or 'WorkItems' for linked bugs.","enum":["None","Iterations","WorkItems","SubResults","Point"]},"top":{"type":"number","description":"Maximum number of results to return. Defaults to 100.","default":100},"skip":{"type":"number","description":"Number of results to skip, for pagination."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/Runs/{runId}/results","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"$sift({\n \"api-version\": \"7.1\",\n \"outcomes\": $exists(arguments.outcomes) ? $join([arguments.outcomes], \",\") : null,\n \"detailsToInclude\": arguments.details_to_include,\n \"$top\": $exists(arguments.top) ? arguments.top : 100,\n \"$skip\": arguments.skip\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Test Results From Build","description":"Get the aggregated test result summary for a build: totals, pass rate, and duration. Use this to answer whether a build's tests passed without paging through individual results.","slug":"get-test-results-from-build","ai_risk":{"level":"low","score":1,"reasoning":"Read-only aggregate of a build's test results.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"build_id":{"type":"number","description":"The build ID."}},"required":["build_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/ResultSummaryByBuild","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\",\n \"buildId\": arguments.build_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Test Run","description":"Create a test run against a test plan, optionally for a specific set of test points and tied to a build.","slug":"create-test-run","ai_risk":{"level":"medium","score":4,"reasoning":"Creates a test run record that appears in the project's quality reporting.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"name":{"type":"string","description":"Name of the test run."},"plan_id":{"type":"number","description":"Test plan the run belongs to."},"point_ids":{"type":"array","description":"Test point IDs to include in the run, from 'List Test Cases'.","items":{"type":"number"}},"build_id":{"type":"number","description":"Build the run is associated with."},"automated":{"type":"boolean","description":"Whether this is an automated run. Defaults to false (manual)."},"state":{"type":"string","description":"Initial run state. Defaults to 'NotStarted'.","enum":["NotStarted","InProgress","Completed","Aborted","Waiting"]}},"required":["name","plan_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs","method":"POST","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"name\": arguments.name,\n \"plan\": {\"id\": $string(arguments.plan_id)},\n \"pointIds\": $exists(arguments.point_ids) ? [arguments.point_ids] : null,\n \"build\": $exists(arguments.build_id) ? {\"id\": $string(arguments.build_id)} : null,\n \"automated\": $exists(arguments.automated) ? arguments.automated : false,\n \"state\": $exists(arguments.state) ? arguments.state : \"NotStarted\"\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":false}},{"name":"Update Test Run","description":"Update a test run's state or comment, for example to mark a manual run as completed or aborted.","slug":"update-test-run","ai_risk":{"level":"medium","score":3,"reasoning":"Changes the recorded state of a test run, which feeds quality reporting.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"run_id":{"type":"number","description":"The test run ID."},"state":{"type":"string","description":"New run state.","enum":["NotStarted","InProgress","Completed","Aborted","Waiting","NeedsInvestigation"]},"comment":{"type":"string","description":"Comment describing the run's outcome."}},"required":["run_id"],"additionalProperties":false},"action":{"path":"/{organization}/{project}/_apis/test/runs/{runId}","method":"PATCH","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"runId\": arguments.run_id\n }","query":"{\n \"api-version\": \"7.1\"\n }","body":"$sift({\n \"state\": arguments.state,\n \"comment\": arguments.comment\n }, function($v) { $v != null })"}},"annotations":{"idempotentHint":true}},{"name":"List Advanced Security Alerts","description":"List GitHub Advanced Security for Azure DevOps alerts on a repository: secret leaks, dependency vulnerabilities, and code scanning findings. Requires Advanced Security to be enabled on the repository.","slug":"list-advanced-security-alerts","ai_risk":{"level":"low","score":2,"reasoning":"Read-only listing of security findings. Reveals vulnerability details, so exposure should be limited to trusted users.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository":{"type":"string","description":"Repository name or ID."},"alert_type":{"type":"string","description":"Filter by the kind of alert.","enum":["code","secret","dependency","license","unknown"]},"states":{"type":"array","description":"Filter by alert state, e.g. ['active'] to see only open findings.","items":{"type":"string","enum":["unknown","active","dismissed","fixed","autoDismissed"]}},"severities":{"type":"array","description":"Filter by severity, e.g. ['critical', 'high'].","items":{"type":"string","enum":["low","medium","high","critical","note","warning","error"]}},"branch":{"type":"string","description":"Only return alerts found on this branch, e.g. 'main'."},"top":{"type":"number","description":"Maximum number of alerts to return. Defaults to 50.","default":50}},"required":["repository"],"additionalProperties":false},"action":{"path":"https://advsec.dev.azure.com/{organization}/{project}/_apis/alert/repositories/{repository}/alerts","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repository\": arguments.repository\n }","query":"$sift({\n \"api-version\": \"7.2-preview.1\",\n \"criteria.alertType\": arguments.alert_type,\n \"criteria.states\": $exists(arguments.states) ? $join([arguments.states], \",\") : null,\n \"criteria.severities\": $exists(arguments.severities) ? $join([arguments.severities], \",\") : null,\n \"criteria.ref\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null,\n \"top\": $exists(arguments.top) ? arguments.top : 50\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Advanced Security Alert","description":"Get the full details of a single Advanced Security alert, including where it was found and its remediation guidance.","slug":"get-advanced-security-alert","ai_risk":{"level":"low","score":2,"reasoning":"Read-only lookup of one security finding, including the affected code location.","calculated_at":"2026-08-20T00:00:00.000Z"},"enabled":true,"inputSchema":{"type":"object","properties":{"project":{"type":"string","description":"Project name or ID. Falls back to the connector's Default Project setting when omitted."},"repository":{"type":"string","description":"Repository name or ID."},"alert_id":{"type":"number","description":"The alert ID, from 'List Advanced Security Alerts'."},"branch":{"type":"string","description":"Branch to evaluate the alert's state against, e.g. 'main'."}},"required":["repository","alert_id"],"additionalProperties":false},"action":{"path":"https://advsec.dev.azure.com/{organization}/{project}/_apis/alert/repositories/{repository}/alerts/{alertId}","method":"GET","mapping":{"params":"{\n \"organization\": settings.organization,\n \"project\": arguments.project ? arguments.project : settings.project,\n \"repository\": arguments.repository,\n \"alertId\": arguments.alert_id\n }","query":"$sift({\n \"api-version\": \"7.2-preview.1\",\n \"ref\": $exists(arguments.branch) ? ($contains(arguments.branch, \"refs/\") ? arguments.branch : \"refs/heads/\" & arguments.branch) : null\n }, function($v) { $v != null })"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}}
|