Tool definitions load from a YAML file and can be overridden privately through PRIVATE_TOOL_ROOT, which is how a team keeps internal tools out of the repository. Python evaluation runs under RestrictedPython — worth checking against your own threat model before you expose the endpoint.
A Python framework exposing a set of built-in tools and loading more from plugins. It runs as a standalone Starlette service with an SSE endpoint and several web dashboards, or embeds in another project.
- Command execution, synchronous with run-to-completion output capture or asynchronous with background job endpoints
- Browser automation through Playwright — page HTML, Markdown, screenshots and panel captures
- Python expressions evaluated under RestrictedPython
- A DataFrame service for analysis and visualisation, with its own web interface
- Time helpers, and tool definitions loaded dynamically from YAML
- Plugins for Azure DevOps pull requests, Git operations, knowledge indexing, Kusto queries and CircleCI
- Dashboards at /tools, /dataframes, /knowledge and /pyeval
- External plugins declared in plugin_config.yaml and installed by running mcp_admin with the refresh_plugins operation
Python with uv — uv sync, then uv run server/main.py. Configuration comes from a .env copied from config/env.template; GIT_ROOT and the AZREPO_ORG, AZREPO_PROJECT and AZREPO_REPO trio matter if you use the Azure plugins. Clients connect to the SSE endpoint at http://0.0.0.0:8000/sse. A Dockerfile is included, exposing port 8000.
