@achieveai/azuredevops-mcp 1.3.14 → 1.3.16

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/index.js CHANGED
@@ -194,7 +194,7 @@ async function main() {
194
194
  });
195
195
  allowedTools.has("addWorkItemComment") && server.tool("addWorkItemComment", "Add a comment to a work item. Supports markdown formatting by default. Use #ID to reference work items, @user to mention people.", {
196
196
  id: zId().describe("ID of the work item"),
197
- text: zod_1.z.string().describe("Comment text (markdown). Use #ID to link work items, @user to mention people"),
197
+ text: zod_1.z.string().describe("Comment text. Supports full markdown use #ID to link work items, @user to mention people. IMPORTANT: Use actual newline characters in the JSON string for line breaks — do NOT send literal backslash-n text."),
198
198
  format: zod_1.z.enum(['markdown', 'html']).optional().default('markdown').describe("Comment format: 'markdown' (default) or 'html'")
199
199
  }, async (params, extra) => {
200
200
  const result = await workItemTools.addWorkItemComment(params);
@@ -208,7 +208,7 @@ async function main() {
208
208
  allowedTools.has("manageWorkItemComment") && server.tool("manageWorkItemComment", "Add or update a comment on a work item. Use action 'add' for new comments, 'update' to edit existing ones. Markdown supported. Use #ID to reference work items, @user to mention people.", {
209
209
  action: zod_1.z.enum(['add', 'update']).describe("'add' for new comment, 'update' to edit existing"),
210
210
  id: zId().describe("Work item ID"),
211
- text: zod_1.z.string().describe("Comment text (supports markdown by default)"),
211
+ text: zod_1.z.string().describe("Comment text. Supports full markdown. IMPORTANT: Use actual newline characters in the JSON string for line breaks — do NOT send literal backslash-n text."),
212
212
  format: zod_1.z.enum(['markdown', 'html']).optional().default('markdown').describe("Comment format"),
213
213
  commentId: zIdOptional().describe("Comment ID — required for 'update' action"),
214
214
  }, async (params, extra) => {
@@ -598,7 +598,8 @@ async function main() {
598
598
  allowedTools.has("listBranches") && server.tool("listBranches", "List all branches in a Git repository with optional name pattern filtering and pagination. Returns branch details including name, commit ID, and object ID. Results can be filtered using wildcards (e.g., 'feature/*' for all feature branches). Supports both repository names and IDs.", {
599
599
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) to list branches from. Repository names are case-insensitive."),
600
600
  filter: zod_1.z.string().optional().describe("Optional wildcard pattern to filter branch names (e.g., 'feature/*', 'release/*'). Use this to narrow down results to specific branch types."),
601
- top: zod_1.z.coerce.number().optional().describe("Maximum number of branches to return in the response. Use this to limit large result sets, especially for repositories with many branches.")
601
+ top: zod_1.z.coerce.number().optional().describe("Maximum number of branches to return in the response. Use this to limit large result sets, especially for repositories with many branches."),
602
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
602
603
  }, async (params, extra) => {
603
604
  const result = await gitTools.listBranches(params);
604
605
  return {
@@ -628,7 +629,8 @@ async function main() {
628
629
  version: zod_1.z.string().optional().describe("The name of the branch (e.g., 'main'), tag, or commit ID to browse. Defaults to the default branch if not specified."),
629
630
  versionOptions: zod_1.z.string().optional().describe("Additional version options: 'None', 'PreviousChange', 'FirstParent'. Usually leave this undefined."),
630
631
  versionType: zod_1.z.string().optional().describe("Type of version: 'Branch', 'Tag', 'Commit'. Usually inferred automatically from the version parameter.")
631
- }).optional().describe("Optional specification for which version of the repository to browse. Use this to view files at a specific branch, tag, or commit.")
632
+ }).optional().describe("Optional specification for which version of the repository to browse. Use this to view files at a specific branch, tag, or commit."),
633
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
632
634
  }, async (params, extra) => {
633
635
  const result = await gitTools.browseRepository(params);
634
636
  return {
@@ -646,7 +648,8 @@ async function main() {
646
648
  version: zod_1.z.string().optional().describe("The name of the branch (e.g., 'main'), tag, or commit ID to retrieve the file from. Defaults to the default branch if not specified."),
647
649
  versionOptions: zod_1.z.string().optional().describe("Additional version options: 'None', 'PreviousChange', 'FirstParent'. Usually leave this undefined."),
648
650
  versionType: zod_1.z.string().optional().describe("Type of version: 'Branch', 'Tag', 'Commit'. Usually inferred automatically from the version parameter.")
649
- }).optional().describe("Optional specification for which version of the file to retrieve. Use this to view file content at a specific branch, tag, or commit.")
651
+ }).optional().describe("Optional specification for which version of the file to retrieve. Use this to view file content at a specific branch, tag, or commit."),
652
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
650
653
  }, async (params, extra) => {
651
654
  const result = await gitTools.getFileContent(params);
652
655
  return {
@@ -669,13 +672,15 @@ async function main() {
669
672
  structuredContent: result.structuredContent
670
673
  };
671
674
  });
672
- allowedTools.has("listPullRequests") && server.tool("listPullRequests", "Retrieve a list of pull requests in a Git repository with comprehensive filtering options. Returns a concise table with PR details including ID, title, author, status, and branches, along with a summary of PRs by status. Filter by status, creator, or reviewer to find specific PRs. Supports both repository names and IDs.", {
675
+ allowedTools.has("listPullRequests") && server.tool("listPullRequests", "Retrieve a list of pull requests in a Git repository with comprehensive filtering options. Returns a concise table with PR details including ID, title, author, status, and branches, along with a summary of PRs by status. Filter by status, creator, or reviewer to find specific PRs. Supports both repository names and IDs. By default only active (open) PRs are returned.", {
673
676
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) to list pull requests from. Repository names are case-insensitive."),
674
- status: zod_1.z.enum(['abandoned', 'active', 'all', 'completed', 'notSet']).optional().describe("Filter pull requests by their current status: 'active' for open PRs, 'completed' for merged PRs, 'abandoned' for closed/rejected PRs, 'all' for all PRs regardless of status."),
675
- creatorId: zod_1.z.string().optional().describe("Filter pull requests to only those created by a specific user ID or email address."),
677
+ status: zod_1.z.enum(['abandoned', 'active', 'all', 'completed', 'notSet']).optional().describe("Filter pull requests by their current status. Defaults to 'active' (open PRs). Use 'completed' for merged PRs, 'abandoned' for closed/rejected PRs, 'all' for all PRs regardless of status."),
678
+ creatorId: zod_1.z.string().optional().describe("Filter pull requests to only those created by a specific user ID or email address. Use 'creatorIds' for multiple developers."),
679
+ creatorIds: zod_1.z.array(zod_1.z.string()).optional().describe("Filter pull requests to those created by any of the specified user IDs or email addresses. Example: ['user1@example.com', 'user2@example.com']"),
676
680
  reviewerId: zod_1.z.string().optional().describe("Filter pull requests to only those where a specific user ID or email address has been assigned as a reviewer."),
677
681
  top: zod_1.z.coerce.number().optional().describe("Maximum number of pull requests to return in the response. Use this for pagination to handle repositories with many PRs."),
678
- skip: zod_1.z.coerce.number().optional().describe("Number of pull requests to skip before starting to return results. Use with 'top' for implementing pagination.")
682
+ skip: zod_1.z.coerce.number().optional().describe("Number of pull requests to skip before starting to return results. Use with 'top' for implementing pagination."),
683
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
679
684
  }, async (params, extra) => {
680
685
  const result = await gitTools.listPullRequests(params);
681
686
  return {
@@ -689,7 +694,8 @@ async function main() {
689
694
  targetRefName: zod_1.z.string().describe("The name of the target branch where changes will be merged into, in full reference format (e.g., 'refs/heads/main')."),
690
695
  title: zod_1.z.string().describe("A concise, descriptive title for the pull request that summarizes the changes being proposed."),
691
696
  description: zod_1.z.string().optional().describe("A detailed description of the changes in the pull request. Can include markdown formatting for rich text, lists, code blocks, etc."),
692
- reviewers: zod_1.z.array(zod_1.z.string()).optional().describe("An array of user IDs or email addresses to assign as reviewers to the pull request. These users will be notified about the PR.")
697
+ reviewers: zod_1.z.array(zod_1.z.string()).optional().describe("An array of user IDs or email addresses to assign as reviewers to the pull request. These users will be notified about the PR."),
698
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
693
699
  }, async (params, extra) => {
694
700
  const result = await gitTools.createPullRequest(params);
695
701
  return {
@@ -709,7 +715,8 @@ async function main() {
709
715
  "Supports both repository names and IDs.", {
710
716
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
711
717
  pullRequestId: zId().describe("The numeric ID of the pull request to retrieve. This is the PR number shown in the Azure DevOps UI (e.g., PR #123)."),
712
- include: zod_1.z.array(zod_1.z.enum(['policies', 'description', 'reviewers', 'workItems', 'completionOptions', 'files'])).optional().describe("Sections to return in full detail. When omitted, returns compact overview with all sections truncated. Specify sections you need full data for.")
718
+ include: zod_1.z.array(zod_1.z.enum(['policies', 'description', 'reviewers', 'workItems', 'completionOptions', 'files'])).optional().describe("Sections to return in full detail. When omitted, returns compact overview with all sections truncated. Specify sections you need full data for."),
719
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
713
720
  }, async (params, extra) => {
714
721
  const result = await gitTools.getPullRequest(params);
715
722
  return {
@@ -725,7 +732,8 @@ async function main() {
725
732
  status: zod_1.z.enum(['active', 'fixed', 'wontFix', 'closed', 'byDesign', 'pending']).optional().describe("Filter threads by status. Use 'active' to see only unresolved threads, 'fixed' for resolved ones, etc."),
726
733
  authorName: zod_1.z.string().optional().describe("Filter threads by author display name or email (case-insensitive partial match). Only threads where the root comment was authored by a matching user are returned."),
727
734
  top: zod_1.z.coerce.number().optional().describe("Maximum number of comment threads to return in the response. Use this for pagination in PRs with many comments."),
728
- skip: zod_1.z.coerce.number().optional().describe("Number of comment threads to skip before starting to return results. Use with 'top' for implementing pagination.")
735
+ skip: zod_1.z.coerce.number().optional().describe("Number of comment threads to skip before starting to return results. Use with 'top' for implementing pagination."),
736
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
729
737
  }, async (params, extra) => {
730
738
  const result = await gitTools.getPullRequestComments(params);
731
739
  return {
@@ -737,7 +745,8 @@ async function main() {
737
745
  });
738
746
  allowedTools.has("approvePullRequest") && server.tool("approvePullRequest", "Cast an 'Approve' vote on a pull request on behalf of the current authenticated user. This marks the PR as approved by the user and contributes toward satisfying approval requirements defined in branch policies. Equivalent to clicking 'Approve' in the Azure DevOps UI. Supports both repository names and IDs.", {
739
747
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
740
- pullRequestId: zId().describe("The numeric ID of the pull request to approve. This is the PR number shown in the Azure DevOps UI (e.g., PR #123).")
748
+ pullRequestId: zId().describe("The numeric ID of the pull request to approve. This is the PR number shown in the Azure DevOps UI (e.g., PR #123)."),
749
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
741
750
  }, async (params, extra) => {
742
751
  const result = await gitTools.approvePullRequest(params);
743
752
  return {
@@ -750,7 +759,8 @@ async function main() {
750
759
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
751
760
  pullRequestId: zId().describe("The numeric ID of the pull request to merge. This is the PR number shown in the Azure DevOps UI (e.g., PR #123)."),
752
761
  mergeStrategy: zod_1.z.enum(['noFastForward', 'rebase', 'rebaseMerge', 'squash']).optional().describe("The strategy to use when merging changes: 'noFastForward' creates a merge commit, 'rebase' updates the source branch commits onto the target branch, 'rebaseMerge' combines rebase with a merge commit, 'squash' combines all changes into a single commit."),
753
- comment: zod_1.z.string().optional().describe("Optional comment to include in the merge commit message. Use this to provide additional context about the merge beyond the default message.")
762
+ comment: zod_1.z.string().optional().describe("Optional comment to include in the merge commit message. Use this to provide additional context about the merge beyond the default message."),
763
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
754
764
  }, async (params, extra) => {
755
765
  const result = await gitTools.mergePullRequest(params);
756
766
  return {
@@ -763,7 +773,7 @@ async function main() {
763
773
  allowedTools.has("addPullRequestInlineComment") && server.tool("addPullRequestInlineComment", "Add an inline code comment anchored to a SPECIFIC LINE of code in a file. The comment appears directly on that line in the Files tab. WHEN TO USE: Point out specific code issues, suggest improvements to a particular line, or ask questions about specific implementation details. EXAMPLES: 'This variable should be null-checked here', 'Consider using async/await on line 45', 'Why is this hardcoded?'. The system automatically retrieves the correct change tracking ID from the PR diff.", {
764
774
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
765
775
  pullRequestId: zId().describe("The numeric ID of the pull request where the comment will be added. This is the PR number shown in the Azure DevOps UI."),
766
- comment: zod_1.z.string().describe("The text content of the comment to add. Can include markdown formatting. Should be specific to the line of code being commented on."),
776
+ comment: zod_1.z.string().describe("The text content of the comment. Supports full markdown (headers, lists, code blocks, bold, etc.). IMPORTANT: Use actual newline characters in the JSON string for line breaks do NOT send literal backslash-n text. Example: \"## Issue\\n\\nMissing null check\" where \\n is a real JSON newline escape."),
767
777
  position: zod_1.z.object({
768
778
  line: zod_1.z.coerce.number().describe("The 1-based line number in the file where the comment starts. Must be a line visible in the PR diff (added, removed, or context line)."),
769
779
  offset: zod_1.z.coerce.number().describe("The character offset within the start line. Typically use 1 for beginning of line."),
@@ -771,7 +781,8 @@ async function main() {
771
781
  endOffset: zod_1.z.coerce.number().optional().describe("Optional character offset within the end line. Required when endLine is provided. Typically use 1 for end of selection.")
772
782
  }).describe("The position within the file where the comment will be anchored. Use line/offset for single-line comments, add endLine/endOffset for multi-line range comments."),
773
783
  path: zod_1.z.string().describe("The full path to the file within the repository that the comment relates to. Must be a file changed in the PR (e.g., '/src/Services/UserService.cs')."),
774
- format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering.")
784
+ format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering."),
785
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
775
786
  }, async (params, extra) => {
776
787
  const result = await gitTools.addPullRequestInlineComment(params);
777
788
  return {
@@ -784,8 +795,9 @@ async function main() {
784
795
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
785
796
  pullRequestId: zId().describe("The numeric ID of the pull request where the comment will be added. This is the PR number shown in the Azure DevOps UI."),
786
797
  path: zod_1.z.string().describe("The full path to the file within the repository that the comment relates to. Must be a file changed in the PR (e.g., '/src/Models/User.cs')."),
787
- comment: zod_1.z.string().describe("The text content of the comment about the entire file. Can include markdown formatting. Should address file-level concerns, not specific lines."),
788
- format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering.")
798
+ comment: zod_1.z.string().describe("The text content of the comment about the entire file. Supports full markdown (headers, lists, code blocks, bold, etc.). IMPORTANT: Use actual newline characters in the JSON string for line breaks — do NOT send literal backslash-n text. Example: \"## Summary\\n\\nThis file needs refactoring\" where \\n is a real JSON newline escape."),
799
+ format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering."),
800
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
789
801
  }, async (params, extra) => {
790
802
  const result = await gitTools.addPullRequestFileComment(params);
791
803
  return {
@@ -797,8 +809,9 @@ async function main() {
797
809
  allowedTools.has("addPullRequestComment") && server.tool("addPullRequestComment", "Add a GENERAL comment about the entire pull request (not tied to any file or code). Appears in the Overview/Conversation tab. WHEN TO USE: Provide overall feedback, discuss architecture, approve/reject the PR, ask general questions, or comment on the PR description. EXAMPLES: 'This feature looks great! LGTM after CI passes', 'Can you add integration tests for this feature?', 'What's the performance impact of these changes?', 'Please update the documentation before merging'.", {
798
810
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
799
811
  pullRequestId: zId().describe("The numeric ID of the pull request where the comment will be added. This is the PR number shown in the Azure DevOps UI."),
800
- comment: zod_1.z.string().describe("The text content of the general comment about the PR. Can include markdown formatting for rich text, code blocks, links, etc. Should address PR-level concerns, not specific files or lines."),
801
- format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering.")
812
+ comment: zod_1.z.string().describe("The text content of the general comment about the PR. Supports full markdown (headers, lists, code blocks, bold, etc.). IMPORTANT: Use actual newline characters in the JSON string for line breaks — do NOT send literal backslash-n text. Example: \"## Review Summary\\n\\n- Looks good\\n- One issue found\" where \\n is a real JSON newline escape."),
813
+ format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering."),
814
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
802
815
  }, async (params, extra) => {
803
816
  const result = await gitTools.addPullRequestComment(params);
804
817
  return {
@@ -811,7 +824,8 @@ async function main() {
811
824
  allowedTools.has("getPullRequestFileChanges") && server.tool("getPullRequestFileChanges", "Retrieve detailed file diff information for a specific file changed within a pull request. Returns change metadata including change type (add, edit, delete), before/after content identifiers, and file path information. Optionally filter to a specific file path.", {
812
825
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
813
826
  pullRequestId: zId().describe("The numeric ID of the pull request to examine. This is the PR number shown in the Azure DevOps UI."),
814
- path: zod_1.z.string().optional().describe("Optional path to a specific file to return changes for. If omitted, changes for all files will be returned but filtered to match this specific path.")
827
+ path: zod_1.z.string().optional().describe("Optional path to a specific file to return changes for. If omitted, changes for all files will be returned but filtered to match this specific path."),
828
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
815
829
  }, async (params, extra) => {
816
830
  const result = await gitTools.getPullRequestFileChanges(params);
817
831
  return {
@@ -822,7 +836,8 @@ async function main() {
822
836
  });
823
837
  allowedTools.has("getPullRequestChangesCount") && server.tool("getPullRequestChangesCount", "Get statistical summary of changes in a pull request, including total count of files changed and breakdowns by change type (added, modified, deleted). Useful for understanding the scope of changes in a PR at a glance.", {
824
838
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
825
- pullRequestId: zId().describe("The numeric ID of the pull request to analyze. This is the PR number shown in the Azure DevOps UI.")
839
+ pullRequestId: zId().describe("The numeric ID of the pull request to analyze. This is the PR number shown in the Azure DevOps UI."),
840
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
826
841
  }, async (params, extra) => {
827
842
  const result = await gitTools.getPullRequestChangesCount(params);
828
843
  return {
@@ -835,7 +850,8 @@ async function main() {
835
850
  repository: zod_1.z.string().describe("The repository name (e.g., 'MyProject') or ID (GUID) containing the pull request. Repository names are case-insensitive."),
836
851
  pullRequestId: zId().describe("The numeric ID of the pull request to retrieve changes for. This is the PR number shown in the Azure DevOps UI."),
837
852
  top: zod_1.z.coerce.number().optional().describe("Maximum number of change entries to return in a single request. Use this for pagination to avoid large response payloads."),
838
- skip: zod_1.z.coerce.number().optional().describe("Number of change entries to skip before starting to return results. Use with 'top' for implementing pagination.")
853
+ skip: zod_1.z.coerce.number().optional().describe("Number of change entries to skip before starting to return results. Use with 'top' for implementing pagination."),
854
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project.")
839
855
  }, async (params, extra) => {
840
856
  const result = await gitTools.getAllPullRequestChanges(params);
841
857
  return {
@@ -856,6 +872,7 @@ async function main() {
856
872
  deleteSourceBranch: zod_1.z.boolean().optional().describe("Delete source branch on completion"),
857
873
  isDraft: zod_1.z.boolean().optional().describe("Set PR as draft or publish it"),
858
874
  targetRefName: zod_1.z.string().optional().describe("Change target branch (e.g., 'refs/heads/main')"),
875
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project."),
859
876
  }, async (params) => {
860
877
  const result = await gitTools.updatePullRequest(params);
861
878
  return { content: result.content, rawData: result.rawData, isError: result.isError, structuredContent: result.structuredContent };
@@ -866,6 +883,7 @@ async function main() {
866
883
  reviewersToAdd: zod_1.z.array(zod_1.z.string()).optional().describe("User IDs or email addresses to add as reviewers"),
867
884
  reviewersToRemove: zod_1.z.array(zod_1.z.string()).optional().describe("User IDs or email addresses to remove from reviewers"),
868
885
  makeRequired: zod_1.z.boolean().optional().describe("Make added reviewers required (default false)"),
886
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project."),
869
887
  }, async (params) => {
870
888
  const result = await gitTools.updatePullRequestReviewers(params);
871
889
  return { content: result.content, rawData: result.rawData, isError: result.isError, structuredContent: result.structuredContent };
@@ -874,8 +892,9 @@ async function main() {
874
892
  repository: zod_1.z.string().describe("Repository name or ID"),
875
893
  pullRequestId: zId().describe("Pull request ID"),
876
894
  threadId: zId().describe("Thread ID to reply to"),
877
- comment: zod_1.z.string().describe("Reply text content (supports markdown)"),
895
+ comment: zod_1.z.string().describe("Reply text content. Supports full markdown. IMPORTANT: Use actual newline characters in the JSON string for line breaks — do NOT send literal backslash-n text."),
878
896
  format: zod_1.z.enum(['markdown', 'html']).optional().describe("Content format: 'markdown' (default) or 'html'. When markdown, HTML entities are unescaped for correct rendering."),
897
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project."),
879
898
  }, async (params) => {
880
899
  const result = await gitTools.replyToComment(params);
881
900
  return { content: result.content, rawData: result.rawData, isError: result.isError, structuredContent: result.structuredContent };
@@ -885,6 +904,7 @@ async function main() {
885
904
  pullRequestId: zId().describe("Pull request ID"),
886
905
  threadId: zId().describe("Thread ID to update"),
887
906
  status: zod_1.z.enum(['active', 'byDesign', 'closed', 'fixed', 'pending', 'unknown', 'wontFix']).describe("New thread status"),
907
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project."),
888
908
  }, async (params) => {
889
909
  const result = await gitTools.updatePullRequestThread(params);
890
910
  return { content: result.content, rawData: result.rawData, isError: result.isError, structuredContent: result.structuredContent };
@@ -893,6 +913,7 @@ async function main() {
893
913
  repository: zod_1.z.string().describe("Repository name or ID"),
894
914
  branchName: zod_1.z.string().describe("New branch name (e.g., 'feature/my-feature')"),
895
915
  sourceRef: zod_1.z.string().describe("Source branch name (e.g., 'main') or commit SHA to branch from"),
916
+ project: zod_1.z.string().optional().describe("Azure DevOps project name or ID. Defaults to the configured project."),
896
917
  }, async (params) => {
897
918
  const result = await gitTools.createBranch(params);
898
919
  return { content: result.content, rawData: result.rawData, isError: result.isError, structuredContent: result.structuredContent };