tfs-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tfs-mcp-serverShow my active work items from the Triage saved query."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tfs-mcp-server
MCP server (stdio) for Microsoft TFS / Azure DevOps Server using REST API 6.0.
Gives an AI agent tools for work items, Git repository files and identity lookup.
Work items and repositories may live in different team projects: every tool accepts an
optional project argument that overrides the configured default.
Requirements
Node.js 20+
A TFS / Azure DevOps Server collection reachable over HTTPS
A Personal Access Token with scopes: Work Items (read & write), Code (read), Identity (read)
Related MCP server: WorkItems DevOps MCP Server
Install & build
npm install
npm run build # -> dist/index.js
npm test # vitest (all TFS calls are mocked)Configuration (environment variables)
Variable | Required | Description |
| yes | Collection URL, e.g. |
| yes | Personal access token (sent as Basic auth) |
| no | Project used when a call omits |
| no | Default |
| no | Parallelism for fan-out batch tools (default |
| no |
|
See .env.example.
Cursor (~/.cursor/mcp.json or .cursor/mcp.json)
{
"mcpServers": {
"tfs": {
"command": "node",
"args": ["/absolute/path/to/tfs-mcp-server/dist/index.js"],
"env": {
"TFS_BASE_URL": "https://tfs.corp.local/tfs/DefaultCollection",
"TFS_PAT": "<your PAT>",
"TFS_DEFAULT_PROJECT": "MyProject"
}
}
}
}Claude Desktop uses the same shape in claude_desktop_config.json.
Interactive testing
TFS_BASE_URL=... TFS_PAT=... npm run inspect # opens the MCP Inspector against dist/index.jsTools
All tools return a short text summary plus a JSON payload (structuredContent).
Errors are returned as tool errors with the TFS message, HTTP status and request URL.
Work items
Tool | Purpose |
| Metadata, rich-text content (Description / Repro Steps / Acceptance Criteria, HTML converted to text by default), relations, optional comments |
| Same for many ids in one call ( |
| Paged comments (ids needed for updates) |
| JSON-Patch update. |
| Same update applied to many ids via |
| Add a comment (plain text is wrapped into HTML) |
| Same comment on many work items (bounded-concurrency fan-out) |
| Replace the text of an existing comment |
| Saved query by GUID or path: WIQL, columns, type; folders list children |
| Execute a saved query; optional |
| Execute an arbitrary WIQL string as-is |
assignedTo accepts a display name, DOMAIN\user, an e-mail, Display Name <DOMAIN\user>, or "" to unassign.
Use get_current_identity / search_identities to obtain valid values.
Files (Git)
Tool | Purpose |
| Repositories of a project (or the whole collection) |
| File content at |
| Several files from one repo/version in one call ( |
| Entries under a directory (one level or recursive) with object ids, content type and latest commit |
Identity
Tool | Purpose |
| Who the PAT belongs to ( |
| Find users/groups by name, account or e-mail |
Example flows
get_current_identity -> assignedToValue = "Jane Doe <CORP\\jdoe>"
run_query { queryId: "Shared Queries/Team/Triage", extraWhere: "[System.Tags] CONTAINS 'hotfix'" }
update_work_items { ids: [...], state: "Active", assignedTo: "Jane Doe <CORP\\jdoe>" }
add_comment_to_work_items { ids: [...], text: "Picked up in sprint 12" }
get_files_content { project: "Infra", repository: "tools", branch: "develop", paths: ["/README.md", "/src/main.ts"] }Notes on TFS API versions
Work item, WIQL, Git and repository endpoints use
api-version=6.0.The work item comments API only exists as a preview in 6.0; the server uses
6.0-preview.3.connectionData(6.0-preview) andidentities(6.0-preview.1) are collection-scoped; the identities call is optional and failures are tolerated.wit/$batchis used for bulk updates; if a server rejects it (404/405/400) the tool transparently falls back to individual PATCH requests.If TFS answers with an HTML sign-in page or HTTP 203 instead of JSON, the PAT is invalid or the base URL does not point at a collection; the error message says so.
Project layout
src/
index.ts stdio entrypoint
server.ts McpServer factory + tool registration
config.ts env parsing, project resolution
client.ts REST client (Basic PAT auth, URL builder, TfsApiError)
services/ TFS API wrappers (workitems, git, identity)
tools/ MCP tool definitions (zod schemas)
util/ html->text, batch helpers, tool result helpers
tests/ vitest suites with a mocked fetchAvailable Tools
17 toolsadd_comment_to_work_itemsAdd the same comment to multiple work itemsA
Add one comment text to many work items. The comments API has no batch endpoint, so requests are fanned out with bounded concurrency; per-item results (comment ids / errors) are reported.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Work item ids | |
| text | Yes | Comment text (plain text or HTML). | |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=false, destructive=false), the description discloses critical behavior: there is no batch endpoint, requests are fanned out with bounded concurrency, and results are reported per-item. This informs the agent of partial-failure semantics and non-atomicity, which is genuinely valuable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first front-loads the core purpose, the second adds the essential behavioral caveat (fan-out, bounded concurrency, per-item results). Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description compensates by disclosing per-item result format (comment ids/errors). Combined with schema-covered parameters and annotations, the definition is nearly complete; the only minor gap is an explicit pointer to the single-item sibling for one-off comments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents all three parameters. The description only loosely maps 'one comment text' to the text parameter and 'many work items' to ids, adding no detail beyond the schema's existing parameter descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource+scope: 'Add one comment text to many work items.' It clearly differentiates from the sibling add_work_item_comment (single item) by emphasizing 'many'/'multiple' work items, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (adding the same comment text across multiple work items) and signals batch intent. However, it never explicitly names the single-item alternative (add_work_item_comment) or states when-not-to-use, leaving the exclusion to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_work_item_commentAdd work item commentA
Add a discussion comment to a work item. Plain text is converted to HTML; HTML is accepted as-is. Returns the new comment id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item id | |
| text | Yes | Comment text (plain text or HTML). | |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: plain text is converted to HTML, HTML is accepted as-is, and the new comment id is returned. This is especially valuable because there is no output schema and the annotations only state read-only/idempotent/destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no filler, and the core action is front-loaded. Each sentence contributes a distinct fact: the operation, the text handling behavior, and the return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create-with-comment tool, the description is nearly complete: all parameters are documented in the schema, the return value is specified, and the conversion behavior is disclosed. The only gap is not addressing the closely named sibling 'add_comment_to_work_items', but the singular phrasing mitigates this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds semantic value by explaining how the 'text' parameter is processed (plain text converted to HTML, HTML accepted as-is), which goes beyond the schema's simple 'plain text or HTML' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') and a clear resource ('discussion comment to a work item'). It distinguishes from read/update siblings by the action, and from 'add_comment_to_work_items' by singular vs. plural scope, though it does not explicitly name the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells what the tool does but not when to use it versus alternatives. It does not mention the sibling 'add_comment_to_work_items' or any conditions, prerequisites, or exclusions, leaving usage decisions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_identityGet current identityARead-onlyIdempotent
Identify the user behind the configured PAT: id, display name, account (DOMAIN\user or e-mail), descriptor, plus a ready-to-use assignedToValue for update_work_item(s). Also returns basic server info (deployment type, instance id).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is known. The description adds non-obvious behavioral context by disclosing that it returns basic server info and a derived `assignedToValue`, which an agent could not infer from the tool's name or annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the primary purpose, then lists the returned fields and the practical `assignedToValue` use case, making every sentence informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description provides a complete picture: it names the identity attributes, the derived assignment value, and the server info fields. An agent can confidently call this tool and know exactly what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the empty input schema is fully covered, so there are no parameter semantics to clarify. The description correctly focuses on what is returned instead, which is the relevant semantic information for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Identify') and a specific resource ('the user behind the configured PAT'), and enumerates what is returned: id, display name, account, descriptor, assignedToValue, and server info. This clearly distinguishes it from sibling tools like search_identities, which searches, rather than returns the configured identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: it identifies the PAT's user and specifically calls out the `assignedToValue` for update_work_item(s), signaling when this tool is useful. It does not explicitly mention alternatives or when not to use it, but the provided integration hint is strong enough guidance for the main use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_contentGet file contentARead-onlyIdempotent
Read a file from a Git repository at a given branch/commit/tag (default: the repo's default branch). Text files are returned inline; binaries as base64. If the file does not exist, the error explains whether the repository, the branch or the directory is missing and lists the parent directory's entries.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag name (alternative to branch). | |
| path | Yes | Path inside the repository, e.g. '/src/app/main.ts'. | |
| branch | No | Branch name (e.g. 'develop'). Defaults to the repository's default branch. | |
| commit | No | Commit SHA (alternative to branch). | |
| project | No | Team project name or id that owns the repository. Overrides TFS_DEFAULT_PROJECT. | |
| maxBytes | No | Truncate content beyond this many bytes (binaries are omitted entirely). | |
| repository | Yes | Repository name or id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses output encoding (text inline vs binary base64), the default ref behavior, and detailed error diagnostics when the file is missing. This gives agents actionable expectations for both success and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three targeted sentences with no filler: core operation, encoding behavior, and error behavior. The most important information is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains return value format (inline vs base64) and exceptional cases. Combined with full schema parameter descriptions and readOnly/idempotent annotations, an agent has enough information to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some ref-selection context (branch/commit/tag alternatives and default behavior), but does not materially improve on the parameter docs for path, project, or maxBytes. Therefore no upgrade beyond baseline is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('a file from a Git repository'), clarifies ref selection with a default branch, and is distinguishable from siblings like get_files_content and list_directory because it targets a single file's contents. This clearly separates it from the plural and directory-oriented tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys a clear usage context: retrieving one file's content from a repo at a chosen branch/commit/tag. It doesn't explicitly mention alternatives or exclusions, but the single-file scope is unambiguous, so an agent can identify when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_files_contentGet multiple files' contentARead-onlyIdempotent
Read several files from one repository at the same branch/commit/tag in a single call. Existence and metadata are checked with one itemsbatch request, then contents are fetched in parallel. Missing files are reported per path with the same verbose diagnostics as get_file_content.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag name (alternative to branch). | |
| paths | Yes | File paths inside the repository. | |
| branch | No | Branch name (e.g. 'develop'). Defaults to the repository's default branch. | |
| commit | No | Commit SHA (alternative to branch). | |
| project | No | Team project name or id that owns the repository. Overrides TFS_DEFAULT_PROJECT. | |
| repository | Yes | Repository name or id. | |
| maxBytesPerFile | No | Truncate each file beyond this many bytes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, which cover the main behavioral transparency. The description adds implementation details (one itemsbatch request, parallel fetch) that don't contradict or undermine safety, and it explains error reporting for missing files, providing extra clarity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, using three sentences to convey the batch operation, the process, and the error handling. No redundant information, and it's easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch read operation, the description is complete: it specifies what the tool does, how it behaves (including missing file reporting), and refers to the singular tool's diagnostics for consistency. No output schema is needed, and the description provides enough context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter clearly explained. The main description doesn't add additional meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it reads several files from one repository at a specific branch/commit/tag in a single call. It differentiates from the singular get_file_content by emphasizing the batch nature, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when multiple files need to be fetched simultaneously and contrasts with the singular counterpart via 'in a single call'. It also mentions how missing files are reported, giving practical guidance, though it doesn't explicitly state when not to use it (e.g., for a single file).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queryGet saved queryARead-onlyIdempotent
Read a saved work item query by GUID or path (e.g. 'Shared Queries/Team/Open Bugs'): name, path, type, columns and WIQL text. For folders, children are listed (depth 1).
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| queryId | Yes | Query GUID or full path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description's 'Read' phrasing is consistent with those. It adds meaningful behavioral detail beyond annotations by specifying the output fields and the folder behavior, including that children are listed at depth 1. It does not go into error behavior, but the safety profile is already covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence with no fluff. It front-loads the core operation and lookup method, then adds return-value details and the folder edge case in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains what the tool returns, including name, path, type, columns, WIQL text, and folder children behavior. Combined with 100% parameter schema coverage and safety annotations, nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents queryId and project. The description adds a helpful path example ('Shared Queries/Team/Open Bugs') but does not materially expand on the parameter meanings beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read'), the resource ('a saved work item query'), and the lookup mechanism (GUID or path). It also lists the returned fields, which helps distinguish this tool from sibling tools like run_query and run_wiql that execute queries rather than retrieve their definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for reading saved query definitions rather than executing them, but it does not explicitly say when to prefer this over run_query or run_wiql. The path example gives useful context, but the 'when vs. alternatives' guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_itemGet work itemARead-onlyIdempotent
Get a single work item: metadata (type, title, state, assignee, area/iteration, tags, dates), rich-text content (description, repro steps, acceptance criteria), relations (parent/children/links) and optionally its comments.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item id | |
| expand | No | Which extra data to expand when `fields` is not given. | all |
| fields | No | Restrict returned fields to these reference names (e.g. System.Title, System.State). When omitted, all fields plus relations are returned. | |
| format | No | How to return rich-text fields (Description, Repro Steps, comments): converted to plain text/markdown, or raw HTML. | text |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| includeComments | No | Also fetch the discussion comments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior, so the bar is lower. The description adds useful behavioral context by listing what the response will include: metadata, rich-text content, relations, and optionally comments. It does not discuss auth, rate limits, or default expansions, but for a read-only getter this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that leads with the core action ('Get a single work item') and then organizes the response details into clear categories. There is no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values, and it does so at a useful level of detail. It covers metadata, rich-text fields, relations, and comments, though it could have briefly noted default behaviors or the expand/fields relationship. Overall, it is sufficient for an agent to understand what this tool provides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents all six parameters clearly. The description adds minimal parameter-level meaning beyond mentioning rich-text content and optional comments, which maps loosely to format and includeComments. This matches the baseline of 3 for well-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('a single work item'), and enumerates the returned content: metadata, rich-text content, relations, and optional comments. This clearly distinguishes it from plural sibling tools like get_work_items and from comment-specific tools like get_work_item_comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Get a single work item' gives clear context for when to use this tool versus list-style or comment-only tools. However, it does not explicitly name alternatives or state when not to use them, so it falls short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_item_commentsGet work item commentsARead-onlyIdempotent
List discussion comments of a work item (paged). Returns comment ids needed for update_work_item_comment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item id | |
| top | No | Page size (default: server default, max 200). | |
| order | No | asc | |
| format | No | How to return rich-text fields (Description, Repro Steps, comments): converted to plain text/markdown, or raw HTML. | text |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| includeDeleted | No | ||
| continuationToken | No | Token from a previous page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description doesn't need to restate safety. It adds useful behavior context: results are paged and the returned comment ids feed into update_work_item_comment, which goes beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, purposeful sentences with no filler. Pagination is front-loaded, and the second sentence explains why the tool matters by linking to update_work_item_comment.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with strong annotations and mostly self-documenting parameters, the description covers the key context: what is listed, pagination, and downstream use. A fully explicit output shape is absent, but the stated purpose of returning comment ids is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description itself does not explain individual parameters, but the input schema already covers 71% of them with meaningful descriptions for id, top, format, project, and continuationToken. The description adds no parameter-level meaning beyond the schema, landing at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('discussion comments of a work item') and notes pagination. It also explains the practical purpose by stating it returns comment ids needed for update_work_item_comment, which distinguishes this tool from sibling comment-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this tool lists comments and returns IDs needed for updating a comment. It does not explicitly name alternatives or say when not to use it, but the purpose statement makes the primary use case evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_work_itemsGet multiple work itemsARead-onlyIdempotent
Read many work items in one call (uses the workitemsbatch API, chunked by 200 ids). Missing ids are reported in failed instead of failing the whole request (errorPolicy=omit).
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Work item ids | |
| expand | No | Which extra data to expand when `fields` is not given. | all |
| fields | No | Restrict returned fields to these reference names (e.g. System.Title, System.State). When omitted, all fields plus relations are returned. | |
| format | No | How to return rich-text fields (Description, Repro Steps, comments): converted to plain text/markdown, or raw HTML. | text |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| errorPolicy | No | omit: skip missing ids; fail: whole call fails if any id is missing. | omit |
| includeComments | No | Also fetch comments for every item (one extra request per item). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds valuable behavior beyond the readOnlyHint/idempotentHint annotations: chunking by 200 ids and partial failure reporting via the 'failed' field. This gives the agent realistic expectations about batch limits and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with the core purpose front-loaded and technical details following. Every sentence adds useful information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch-read tool with rich schema and safety annotations, the description provides the key behavioral details: API name, chunk size, and partial-failure semantics. It doesn't describe the return shape, but no output schema exists and the description is otherwise sufficient to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline 3 applies. The description mentions errorPolicy=omit, but this is already encoded in the schema; it adds no new meaning beyond what the parameter descriptions provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read'), resource ('work items'), and scope ('many in one call'), using the workitemsbatch API. This clearly distinguishes the tool from the singular 'get_work_item' sibling without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'many work items in one call' clearly signals the intended use case over fetching items individually. It does not explicitly name alternatives or exclusion conditions, but the context is sufficient for an agent to pick the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directoryList directoryARead-onlyIdempotent
List files and folders under a directory path in a Git repository (one level or full recursion) with metadata: object ids, content type, and the latest commit that touched each entry.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag name (alternative to branch). | |
| path | No | Directory path, e.g. '/src'. Defaults to the repository root. | / |
| branch | No | Branch name (e.g. 'develop'). Defaults to the repository's default branch. | |
| commit | No | Commit SHA (alternative to branch). | |
| project | No | Team project name or id that owns the repository. Overrides TFS_DEFAULT_PROJECT. | |
| recursion | No | oneLevel | |
| repository | Yes | Repository name or id. | |
| includeMetadata | No | Include content metadata and latest change per entry (slower on large trees). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds useful behavioral context beyond annotations: recursion modes, inclusion of metadata, and the fact that each entry carries the latest commit that touched it. This helps the agent predict output richness without contradicting the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that front-loads the core action and resource, then adds scoping and output details. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no output schema, and read-only/idempotent annotations, the description gives enough context for selecting and invoking the tool. It names key return metadata but not the full response shape; however, the schema covers parameter usage sufficiently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (88%), so the schema already documents parameters like path, recursion, branch, and includeMetadata. The description only restates recursion behavior and metadata, adding little parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('files and folders under a directory path in a Git repository'), and adds precision with 'one level or full recursion' and metadata details. This clearly distinguishes it from work-item siblings and file-content tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool ā when you need to enumerate repository contents ā but it does not explicitly mention alternatives such as get_file_content or list_repositories. There is no when-not-to-use guidance, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repositoriesList Git repositoriesARead-onlyIdempotent
List Git repositories in a project (or in the whole collection when no project is given), with default branch and URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Project to list; omit (and unset TFS_DEFAULT_PROJECT) to list every project's repositories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds behavioral value by stating the scope behavior ('when no project is given') and the return contents ('default branch and URLs'), which is useful since there is no output schema. This is beyond what the annotations alone provide, though it does not discuss pagination or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence conveys purpose, scope, conditional behavior, and expected output fields with no filler. The key information about scope is front-loaded before the output note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, idempotent list operation with one optional parameter, the description together with the schema and annotations is complete. It addresses what is returned, how scope is controlled, and the operation's non-mutating nature via annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The parameter description already contains the omit/unset TFS_DEFAULT_PROJECT behavior, and the tool description mostly rephrases this rather than adding new semantic meaning. No additional parameter syntax, format, or constraint details are introduced beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List Git repositories' with a clear scope ('in a project or in the whole collection'). It explicitly mentions the output fields ('default branch and URLs'), which further distinguishes it from sibling tools like get_file_content or list_directory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use: list repositories in a project, or when no project is given, in the whole collection. It does not explicitly name alternatives, but there are no repository-listing siblings, so the exclusion criteria are less necessary. It stops short of a 5 because it does not state when not to use this tool versus another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryRun saved queryARead-onlyIdempotent
Execute a saved query by GUID or path and return the matching work items. Optionally append a custom WIQL filter (extraWhere, passed as-is and AND-ed with the query's WHERE clause), e.g. "[System.State] = 'Active' AND [System.Tags] CONTAINS 'hotfix'".
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max number of work items to materialise. | |
| fields | No | Fields to return per work item. Defaults to the query's columns. | |
| format | No | How to return rich-text fields (Description, Repro Steps, comments): converted to plain text/markdown, or raw HTML. | text |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| queryId | Yes | Query GUID or full path. | |
| extraWhere | No | Additional WIQL condition, AND-ed with the saved query's WHERE clause. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the readOnly/idempotent annotations by explaining that extraWhere is 'passed as-is and AND-ed' with the saved query's WHERE clause, plus a concrete example. No side effects or contradictions are present; the readOnly annotations align with the execution semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry the core purpose, the optional filtering behavior, and a useful example. There is no redundant repetition of schema fields, and the most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query execution tool, the description is sufficient: it identifies the resource, the result type, and the key extension mechanism. The remaining details (field selection, formatting, top count) are well covered by the input schema, and no output schema exists to describe return shape further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds value by explaining queryId accepts either a GUID or path and by giving a concrete WIQL example for extraWhere, including the 'passed as-is' caveat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Execute a saved query') and a clear resource ('by GUID or path'), and specifies the result ('return the matching work items'). It is distinct from sibling tools like run_wiql or get_work_item because it explicitly targets saved queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes when to use it: when a saved query exists and needs execution, optionally with an extra WIQL filter. It does not explicitly name alternatives such as run_wiql, but the saved-query focus is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_wiqlRun WIQLARead-onlyIdempotent
Execute an arbitrary WIQL query string as-is, e.g. "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = @project AND [System.State] = 'Active'". Returns the matching work items (flat) or the link tree (tree/oneHop queries).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max number of work items to materialise. | |
| wiql | Yes | Full WIQL statement. | |
| fields | No | Fields to return per work item. Defaults to the SELECT columns. | |
| format | No | How to return rich-text fields (Description, Repro Steps, comments): converted to plain text/markdown, or raw HTML. | text |
| project | No | Project used to resolve @project; optional for collection-wide queries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent, covering the safety profile. The description adds meaningful behavioral context by stating that the query is executed as-is and that results are returned flat for flat WIQL queries or as a link tree for tree/oneHop queries. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the core purpose front-loaded, followed by one illustrative example and a compact note about return shape. There is no filler, repetition, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully covers parameter semantics, annotations cover read-only and idempotent behavior, and the description states the return shape. Since there is no output schema, the explicit mention of flat versus tree/oneHop results is valuable; the only notable gap is the absent routing guidance for choosing between run_wiql and run_query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters with descriptions. The tool description does not explain individual parameters beyond the schema, and its WIQL example only lightly illustrates the wiql parameter. This matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Execute'), a precise resource ('arbitrary WIQL query string'), and provides a concrete example with a SELECT query. It also distinguishes itself from siblings like run_query by emphasizing raw, as-is WIQL execution rather than saved-query execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'arbitrary WIQL query string as-is' implies that this tool is for raw query text rather than saved queries, but it does not explicitly mention when to use it versus alternatives such as run_query. No exclusions or routing guidance is given, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_identitiesSearch identitiesARead-onlyIdempotent
Find users or groups by display name, account name or e-mail to obtain a valid assignedTo value. Returns id, display name, unique account name and assignedToValue for each match.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'John', 'DOMAIN\\jdoe' or 'john@corp.com'. | |
| filter | No | Which identity property to match. | General |
| includeGroups | No | Include groups in the results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. It discloses the return fields (id, display name, unique account name, assignedToValue) and the search purpose. However, it does not explain search matching semantics (prefix/substring/exact), whether groups are included by default, or any auth requirements. No contradictions with annotations exist since there are none.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: purpose is front-loaded, followed by the return fields. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three parameters, no annotations, and no output schema, so the description is the only guidance. It adequately covers purpose and return shape, but the undocumented includeGroups parameter and the ambiguity around group search leave a notable gap. It is viable for basic user lookups but not fully complete for all advertised uses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents query and filter with examples and meaning, but includeGroups appears in the schema with no description. The description adds nothing about includeGroups and does not clarify how 'users or groups' maps to that flag. With roughly 67% schema coverage, the description should compensate for the missing parameter, and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Find users or groups') with the search dimensions (display name, account name, e-mail) and the concrete downstream purpose (obtain a valid assignedTo value). This clearly distinguishes it from sibling tools like get_current_identity or work item/query tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies when to use the tool: whenever an assignedTo value is needed. It doesn't explicitly contrast with alternatives like get_current_identity or describe when not to use it, but the context is strong enough that an agent can infer the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_itemUpdate work itemAIdempotent
Update a work item's metadata via JSON Patch. state and assignedTo are mandatory; other fields are optional. Returns the updated work item.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item id | |
| tags | No | Replaces System.Tags. Empty array clears tags. | |
| state | Yes | New System.State value (e.g. 'Active', 'Resolved', 'Closed'). Required. | |
| title | No | ||
| fields | No | Additional fields by reference name, e.g. {"Microsoft.VSTS.Scheduling.RemainingWork": 4}. Use null to clear a field. | |
| reason | No | System.Reason (some state transitions require a specific reason). | |
| comment | No | Discussion comment added together with the update (System.History). | |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| areaPath | No | ||
| priority | No | Microsoft.VSTS.Common.Priority | |
| assignedTo | Yes | New System.AssignedTo value: display name, 'DOMAIN\\user', e-mail, or 'Display Name <DOMAIN\\user>'. Use an empty string to unassign. Required. Use get_current_identity to obtain a value for the PAT owner. | |
| bypassRules | No | Bypass work item type rules (requires project collection admin rights). | |
| description | No | System.Description; plain text is converted to HTML. | |
| expectedRev | No | Optimistic concurrency: fail if the current revision differs. | |
| validateOnly | No | Validate the update without saving. | |
| iterationPath | No | ||
| suppressNotifications | No | Do not fire notifications for this update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond those: the update uses JSON Patch, state and assignedTo are mandatory even though other fields are optional, and the tool returns the updated work item. This is meaningful given there is no output schema, though it does not discuss edge cases like failed state transitions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. It front-loads the operation ('Update a work item's metadata'), specifies the method ('via JSON Patch'), states the mandatory fields, and closes with the return value. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a Ā17-paramĀeter mutation tool with no output schema, the descripĀtion covers the return value but does not address the exisĀtence of update_work_iĀtems (batch) or explain when the single-item update should be preferred. The rich input schema mitigates paramĀeter gaps, but the missing sibling routing and minimal behavioral caveats leave the descripĀtion functionĀally adequate yet incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 82%, so the schema already documents most parameters. The description adds aggregate guidance by naming state and assignedTo as mandatory and calling other fields optional, but it omits the required id from that statement, which could slightly mislead. It does not add per-parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update a work item's metadata via JSON Patch.' It distinguishes the tool from read/get siblings and from the plural update_work_items by making the singular 'a work item' explicit. However, it does not explicitly name or contrast the sibling update_work_items, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus update_work_items or other sibling tools. It mentions that state and assignedTo are mandatory, which is a prerequisite rather than usage context. There are no when-to-use, when-not-to-use, or alternative-tool signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_item_commentUpdate work item commentAIdempotent
Replace the text of an existing comment (use get_work_item_comments to find comment ids).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Work item id | |
| text | Yes | New comment text (plain text or HTML). | |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| commentId | Yes | Comment id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no further behavioral context such as permissions, rate limits, or whether the original text is irreversibly overwritten, although 'replace' does convey in-place modification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with no filler. The main operation is front-loaded, and the parenthetical adds a useful workflow pointer without bloating the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter update tool with a fully-described schema and helpful annotations, the description is nearly sufficient: it covers what the tool does and how to source the required commentId. The only minor gap is that it doesn't explicitly contrast this tool with add_work_item_comment or mention what the operation returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema_description_coverage is 100%, so the schema already documents all four parameters. The description adds extra value by telling the agent that comment ids can be obtained via get_work_item_comments, which gives practical meaning to the commentId parameter beyond the schema's simple 'Comment id'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Replace the text of an existing comment.' The parenthetical about get_work_item_comments reinforces that this operates on existing comments, clearly distinguishing it from add_work_item_comment and add_comment_to_work_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit prerequisite guidance: use get_work_item_comments to find comment ids. It clearly implies this tool is for existing comments rather than adding new ones, though it does not explicitly name add_work_item_comment as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_work_itemsUpdate multiple work itemsAIdempotent
Apply the same update (state + assignedTo, optionally more fields/comment) to many work items. Uses the wit/$batch endpoint (one HTTP request per 200 items) and falls back to parallel single PATCH calls if $batch is unavailable. Per-item results are reported.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Work item ids | |
| tags | No | Replaces System.Tags. Empty array clears tags. | |
| state | Yes | New System.State value (e.g. 'Active', 'Resolved', 'Closed'). Required. | |
| title | No | ||
| fields | No | Additional fields by reference name, e.g. {"Microsoft.VSTS.Scheduling.RemainingWork": 4}. Use null to clear a field. | |
| reason | No | System.Reason (some state transitions require a specific reason). | |
| comment | No | Discussion comment added together with the update (System.History). | |
| project | No | Team project name or id. Overrides TFS_DEFAULT_PROJECT. Work items and repos may live in different projects. | |
| areaPath | No | ||
| priority | No | Microsoft.VSTS.Common.Priority | |
| assignedTo | Yes | New System.AssignedTo value: display name, 'DOMAIN\\user', e-mail, or 'Display Name <DOMAIN\\user>'. Use an empty string to unassign. Required. Use get_current_identity to obtain a value for the PAT owner. | |
| bypassRules | No | Bypass work item type rules (requires project collection admin rights). | |
| description | No | System.Description; plain text is converted to HTML. | |
| validateOnly | No | Validate the update without saving. | |
| iterationPath | No | ||
| suppressNotifications | No | Do not fire notifications for this update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing the batching behavior, the fallback to parallel single PATCH calls, and the per-item result reporting. This gives an agent useful expectations about performance and partial-failure reporting, and nothing contradicts the idempotentHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the essential purpose, endpoint behavior, and result semantics with no filler. The core statement is front-loaded, making the tool's role immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count and absence of an output schema, the description covers the key operational aspects: batch updates, fallback behavior, and per-item results. It does not describe the exact result format, but 'Per-item results are reported' provides enough orienting context for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 81%, so the schema already documents parameters such as tags, fields, reason, comment, and assignedTo. The description adds only a high-level note that state and assignedTo are the core update fields, which is useful but does not significantly expand on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: applying the same update to many work items, with state and assignedTo called out. It clearly distinguishes the batch tool from the singular sibling update_work_item by emphasizing 'many work items' and 'same update'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for updating many work items with the same update, which distinguishes it from update_work_item. It does not explicitly name the alternative or state when not to use it, but the batch-purpose framing is strong enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
17 tool updates
v0.1.0- First observed
add_comment_to_work_items - First observed
add_work_item_comment - First observed
get_current_identity - First observed
get_file_content - First observed
get_files_content - First observed
get_query - First observed
get_work_item - First observed
get_work_item_comments - First observed
get_work_items - First observed
list_directory - First observed
list_repositories - First observed
run_query - First observed
run_wiql - First observed
search_identities - First observed
update_work_item - First observed
update_work_item_comment - First observed
update_work_items
TDQS
Most tools target clearly distinct resources and actions, such as fetching a single work item vs. many, or reading file content vs. listing a directory. The main area of potential confusion is between the singular/plural comment tools, especially add_work_item_comment and add_comment_to_work_items, though their descriptions clarify the difference.
Tool names mostly follow a consistent snake_case verb_noun pattern: list_, get_, update_, add_, run_, and search_. Minor deviations exist, notably add_comment_to_work_items vs. add_work_item_comment and get_current_identity, but overall the naming is predictable and readable.
17 tools is slightly above the ideal range but reasonable for a server covering both work item management and Git repository file access. Each tool serves a distinct purpose, and the count reflects the breadth of the domain without feeling bloated.
The work item surface is strong for reading and updating, including bulk operations and comments, but there is no create_work_item or delete_work_item, which is a notable lifecycle gap. The Git side is also read-only, covering file/directory access but no branch, commit, or repository management operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Connect to Atlassian Jira, Confluence, and Compass to search, create, and manage your work.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query and interact with Azure DevOps data, including work items, projects, ticket statistics, and backlog information through natural language commands.6,573MIT
- FlicenseNot gradedqualityFmaintenanceEnables LLMs and AI applications to interact with Azure DevOps Work Items, supporting queries, filtering, status updates, date management, effort tracking, descriptions, and comments through natural language.-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Azure DevOps APIs for managing projects, work items, repositories, pull requests, and pipelines through natural language.19MIT
- FlicenseCqualityDmaintenanceEnables AI agents to interact with Azure DevOps through natural language, supporting work items, pull requests, sprints, boards, teams, repositories, and wiki pages.30-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/K3roru/tfs-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server