Skip to main content

maco

Connect every MCP server you need, keeping your agent's context lean.

https://github.com/user-attachments/assets/4b91ea97-d48e-41c5-8189-0da8522ac459

As the number of MCP servers you connect grows, tool schemas and intermediate tool call results clutter your agent's context. maco (mcp-as-code) collapses them all into a single endpoint with a programmatic interface.

Instead of loading hundreds if not thousands of tool schemas upfront, maco reconstructs every MCP tool as Pydantic models and Python functions in a virtual filesystem and hands your agent just two of its favourite tools: bash to navigate, and code_execute to run. The agent discovers and composes tools as code, the thing frontier models do best.

How it works

Small context footprint: the agent starts with two tools (bash and code_execute), not every MCP tool schema upfront.

Progressive discovery: frontier models excel at navigating filesystems. By representing the tool interface as code on a filesystem, the agent can leverage rg, fd and all the POSIX tools to discover and execute relevant MCP tools.

tools
├── playwright
│   ├── browserClick.py
│   ├── browserClose.py
│   ├── ... many other tools
│   └── __init__.py
└── github
    ├── addIssueComment.py
    └── __init__.py

Programmatic leverage: the agent is given a real programming language, Python, allowing it to orchestrate complex control flows with exceptional context-efficiency using loops, conditions, and state management.

import asyncio
from collections import Counter
from tools.github import ListCommitsInput, list_commits

async def main():
    owner, repo, page, counts = "openclaw", "openclaw", 1, Counter()

    while True:
        commits = await list_commits(ListCommitsInput(owner=owner, repo=repo, per_page=100, page=page))
        for commit in commits:
            login = (commit.get("author") or {}).get("login")
            if login and "bot" not in login.lower():
                counts[login] += 1
        if len(commits) < 100 or page >= 20:
            break
        page += 1

    total = sum(counts.values())
    for login, count in counts.most_common():
        if count / total < 0.01:
            break
        print(f"@{login}: {count} commits ({count / total:.1%})")

asyncio.run(main())

The example above illustrates the MCP code that will be executed to find the top contributors to an open-source repository.

Installation

Install the Python package mcp-as-code; it provides the maco executable:

uv tool install mcp-as-code

Then verify the CLI:

maco version

Quick start

Create a mcp.json:

{
    "mcpServers": {
        "playwright": {
            "command": "npx",
            "args": ["-y", "@playwright/mcp@latest"]
        },
        "github": {
            "url": "https://api.githubcopilot.com/mcp/",
            "headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" }
        }
    }
}

This config needs npx (for Playwright MCP), a GitHub token in GITHUB_TOKEN, and Docker if you use the docker provider.

Start the maco MCP server:

maco up --config mcp.json --provider docker

Use --provider local for a faster, non-isolated local feedback loop.

By default this serves Streamable HTTP MCP at http://127.0.0.1:8789/mcp.

Configure an MCP client to connect to that endpoint:

Codex
codex mcp add maco --url http://127.0.0.1:8789/mcp
Claude Code
claude mcp add --transport http maco http://127.0.0.1:8789/mcp

See examples/serve-mcp for a complete example that wraps multiple upstream MCP servers behind one maco endpoint.

MCP config

See docs/mcp-config.md for the full config reference, including environment expansion, headers, OAuth hints, token caching, and tool filtering.

Sandbox providers

Choose the execution provider with --provider:

  • local: ideally for local development and fast feedback loop, or maco is already running in an isolated sandbox.
  • docker: runs mcp bash and code execution in a long-lived Docker container.
  • matchlock: runs mcp bash and code execution in a long-lived Matchlock micro-VM.

Credits

maco is inspired by and builds on ideas from:

License

Apache License 2.0. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_as_code-0.1.6.tar.gz (50.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_as_code-0.1.6-py3-none-any.whl (60.7 kB view details)

Uploaded Python 3

File details

Details for the file mcp_as_code-0.1.6.tar.gz.

File metadata

  • Download URL: mcp_as_code-0.1.6.tar.gz
  • Upload date:
  • Size: 50.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_as_code-0.1.6.tar.gz
Algorithm Hash digest
SHA256 45857ba64154d796319a5a9ef198f1f81b1105cce0f059e5bb37c8fdff985d27
MD5 6cb6e052851fef30ef4688f095eb3a45
BLAKE2b-256 3290ee4053693cec46b0d141bb20b68deb6dc1272e410867eef00d91d575f301

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_as_code-0.1.6.tar.gz:

Publisher: release.yml on jingkaihe/maco

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcp_as_code-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: mcp_as_code-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 60.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_as_code-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 e37ef7ae9a69d483c3eb2d1bed19527c23ec80153adcf95230165e4bcdf2a481
MD5 5a6c9ed76a6080420788070bdf6f49e2
BLAKE2b-256 12a0f4ba0df0f0eb53d3cbb868c52f05df74c1cc8072d5ff9dc60b7b87786349

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_as_code-0.1.6-py3-none-any.whl:

Publisher: release.yml on jingkaihe/maco

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page