A .NET-based MCP server demonstrating tool registration and integration with Azure DevOps and local utilities
This server demonstrates basic tool structure but falls short of production-grade quality. Of 4 tools, only GetTestCaseResultsAsync has a reasonably complete schema; the other 3 (Echo, ReverseEcho, GetUtcNow) have trivial functionality with minimal or missing parameter descriptions. Parameter descriptions are present in the Azure tool but absent or minimal in utility tools. Output schemas are partially documented via response records for the Azure tool, but the simple utilities return bare types (string, DateTime) with no LLM-facing schema guidance. Error handling in GetTestCaseResultsAsync is structured (returns a response record with Success flag), but the Echo/Reverse/Time tools lack any error context. The tool names follow verb_noun conventions (Get*, Echo, Reverse), which is good, but descriptions are generic and lack guidance on when to use each tool. No tool annotations (readOnlyHint, idempotentHint) are present despite all tools being read-only. Overall, this is a fair C-grade server: present but incomplete definitions.
Echoes your message back.
Retrieve test case results from the latest successful build of a pipeline/definition in Azure DevOps.
Returns the current UTC time.
Reverses the string you provide.
Trivial utility tools (Echo, ReverseEcho, GetUtcNow) lack substantive descriptions and parameter guidance. 'Echoes your message back' and 'Reverses the string you provide' are under 50 chars and provide no context for when an LLM should use them.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) declared despite all 4 tools being read-only. This is critical for agent planning, LLMs need explicit hints to distinguish safe discovery calls from destructive operations.
Echo and ReverseEcho tools are not domain-relevant and serve no practical purpose in an Azure DevOps integration. They dilute the server's focus and waste token budget. Consider removing them or placing in a separate debug-only server.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 20 | - | v1 |
Parameter 'message' in Echo and ReverseEcho lacks any description in the schema. Even trivial parameters need descriptions so LLMs understand the expected format and constraints.
GetTestCaseResultsAsync parameters (projectName, definitionName, testCaseTitle) lack minimum/maximum length constraints and format guidance in descriptions. LLMs cannot infer whether values are case-sensitive or accept wildcards.
GetTestCaseResultsAsync performs environment variable validation inline (AZURE_DEVOPS_COLLECTION_URL, AZURE_DEVOPS_PAT) but returns a generic error string. Should validate credentials at server startup, not per-call, to avoid token waste and provide clearer failure modes.
Output schema for GetTestCaseResultsAsync includes a 'LogMessages' field (concatenated log strings) that pollutes the response. LLMs do not need internal debugging logs; strip these and return only Success, TestResults, and ErrorMessage.
SimpleDateTime return type from GetUtcNow() has no documented output schema or format. Should specify ISO 8601 string format or custom parsing guidance for downstream LLM reasoning.