execute_command_asyncLABSCO 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.
Setup effort
Build from source
USE CASES
Letting an agent run long shell work
Start it asynchronously and poll the background job endpoints, or run to completion when you want the whole output captured in one call.
Reading a page an agent cannot otherwise reach
Playwright fetches the HTML or Markdown and can capture screenshots or specific panels, rather than relying on a plain HTTP fetch.
Adding an internal tool without forking
Declare it in YAML and point PRIVATE_TOOL_ROOT at a folder outside the repository, so private definitions load ahead of the defaults.
Pulling in a plugin someone else wrote
List the repository and sub-directory in plugin_config.yaml, then run the admin tool's refresh operation to clone or update it.
7 tools
Listed in project docs. Your client may show a different list.
execute_tasklist_tasksquery_task_statusdataframe_querybrowser_get_pagemcp_adminBEFORE YOU INSTALL
What to know first
Tools you get
7 tools named in the project's documentation. The tool set varies with MCP_PLUGIN_MODE, MCP_REGISTER_CODE_TOOLS, MCP_REGISTER_YAML_TOOLS, MCP_ECOSYSTEMS and MCP_OS. refresh_plugins, enable_plugin and disable_plugin are operations of mcp_admin, not tools.
Where it runs
Both documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
git clone https://github.com/plusplusoneplusplus/mcp
cd mcpInstallation
uv syncEnvironment Setup
cp config/env.template .envRunning the Server
uv run server/main.pyMCP Clients
Cursor
{
"mcpServers": {
"mymcp-sse": {
"url": "http://0.0.0.0:8000/sse"
}
}
}VS Code
{
"servers": {
"mymcp-sse": {
"url": "http://0.0.0.0:8000/sse"
}
}
}