Labsco
MCP SERVER

A self-hosted tool server: run commands, drive a browser, evaluate Python safely, and add your own plugins.

MCP Plumbing: Proxies, Registries & Inspectors
Summary
Your own tool surface, defined in YAML rather than code.

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.

What it is

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.

What you get
  • 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
Requirements

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.