⚠️ Proof of Concept (POC) - Created for the July 2025 AzNet ILDC AI Hackathon
A Model Context Protocol (MCP) proxy server that transforms Azure DevOps API responses by filtering out verbose metadata and URLs, providing cleaner, more focused data for AI applications.
This project implements an MCP proxy that wraps the official Azure DevOps MCP server (@azure-devops/mcp) and applies jq-based transformations to tool responses. The proxy intercepts specific tool calls and filters out unnecessary fields like _links, URLs, dates, and other metadata that can clutter AI context windows. It additionally writes to the new structuredContent response field for more intelligent client handling.
- Upstream Server:
@azure-devops/mcp(npm package) - Proxy Layer: FastMCP-based transformation server
- Transform Engine: Pre-compiled jq filters for performance
- Transport: stdio/SSE protocols
- Client calls transformed tool
- Proxy forwards request to upstream Azure DevOps MCP server
- Response intercepted and processed through jq filter
- Cleaned response returned to client
The main.py file uses script dependencies and can be executed directly:
# Run with default stdio transport
uv run main.py
# Run with specific transport
uv run main.py --transport sseFor development, testing, and modification:
# Clone and setup development environment
git clone https://github.com/microsofthackathons/ado-mcp-transform.git
cd ado-mcp-transform
# Install dependencies
uv sync
# Run in development mode
python main.py
python main.py --transport sseUse the SSE server launch settings provided by launch.json for debugging in VS Code.
The current transformations have been defined (other files remain unchanged:)
Filter: {"id", "name", "defaultBranch", "remoteUrl"}
Filter: Removes _links, URLs, and href fields recursively
Filter: Complex filter for thread cleanup
- Filters out deleted threads
- Removes properties, links, dates, descriptors
- Keeps only active discussion threads
- Add jq filter to
TOOL_TRANSFORMATIONSdictionary:
TOOL_TRANSFORMATIONS["new_tool_name"] = 'your_jq_filter_here'- The transformation will be automatically applied if the tool exists in the upstream server.
Test filters independently:
echo '{"test": "data"}' | jq 'your_filter_here'It is helpful to use an LLM and/or the jq playground for developing the expressions.
- stdio (default) - Standard input/output for local MCP clients
- sse - Server-Sent Events for debugging
Transport can be configured via:
- Command line flag:
--transport stdioor--transport sse
- The architecture here is configuration-based, so it could theoretically be applied to any json-based LLM by passing in a path to an appropriate configuration file.
- Logging, etc is not present
- additional tools
- Filter out unneeded tools with the new
tool_transformationssupport