06dba9a4ad
- Add branch naming convention: type/scope/short-description - Update gitea-push skill: branch guard in Step 1 (never commit to main) - Update rules-mcp-builder: create branch before any MCP build - Update rules-bigmind: create branch before any BigMind task - Update rules-homelab: create branch before any homelab task - Add Section 11 to REPO_STRATEGY.md: full branching strategy doc (types, scopes, workflow, Lumen responsibilities, examples) - Ticketing decision: Gitea Issues only, no Docker ticketing service
3.1 KiB
3.1 KiB
MCP Builder Mode Behavior — Roo Code
Active Persona: Craftsman Patrick
Patrick is in MCP Builder mindset. He is building or extending MCP servers in the pi_mcps monorepo. Consistency and testability are the highest values — every server should feel like it belongs in the same ecosystem.
pi_mcps Structure (always active in this mode)
~/pi_mcps/
mcp/
{server-name}/ ← one dir per server
src/
server.py ← FastMCP server (single file)
__init__.py
tests/
conftest.py ← sys.path + shared fixtures
test_server.py ← 100% mock coverage
pyproject.toml ← name=mcp-{name}, uv-managed
README.md
java/ ← Java projects (not MCP servers)
plans/ ← architecture plans
FastMCP Pattern (non-negotiable)
from fastmcp import FastMCP
mcp = FastMCP("server-name")
@mcp.tool()
def tool_name(param: str) -> str:
"""Tool description."""
...
if __name__ == "__main__":
mcp.run()
Before Starting Any MCP Build
- Search Existing Patterns:
memory_search_facts("pi_mcps server")+memory_search_chunks("FastMCP pattern") - Check Gitea: Does a similar server already exist in pi_mcps?
- Create a branch (MANDATORY — never work on main):
git checkout -b feat/mcp/{server-name} # or fix/mcp/{server-name} for a bug fix - Write PLAN.md: Purpose, tools list with signatures, tech stack, v1 scope boundaries
- Announce Focus:
memory_announce_focus(session_id, "MCP Builder: new server X on branch feat/mcp/X", files=["mcp/X/src/server.py"], ide_hint="VS Code") - Form Hypothesis:
memory_add_hypothesis(session_id, "Server X will need N tools and Y authentication pattern")
Standard Build Sequence
mcp/{name}/PLAN.md— purpose, tools, tech stackmcp/{name}/src/__init__.py— emptymcp/{name}/src/server.py— FastMCP server with all toolsmcp/{name}/tests/conftest.py— sys.path + fixturesmcp/{name}/tests/test_server.py— full mock coveragemcp/{name}/pyproject.toml— uv + fastmcp + depsmcp/{name}/README.md— usage, env vars, tool list
pyproject.toml Conventions
[project]
name = "mcp-{name}"
requires-python = ">=3.11"
dependencies = ["fastmcp>=0.1.0", ...]
[project.optional-dependencies]
test = ["pytest", "pytest-mock", "pytest-cov"]
Test Conventions
- Mock ALL external calls (HTTP, filesystem, subprocess)
- Use
monkeypatchfor env vars and module-level state conftest.py:sys.path.insert(0, str(Path(__file__).parent.parent / "src"))- Aim for 100% tool function coverage
- Run:
uv run pytest tests/ -v
After Building a Server
- Store Fact:
memory_store_fact("codebase", "mcp/{name} has N tools: [list]. Stack: X. Env vars: Y.") - Wire into .roo/mcp.json: Add the server entry with correct uv path
- Update root README.md: Add to MCPs table
- Push to Gitea: Conventional commit:
feat(mcp-{name}): add initial server with N tools - Resolve Hypothesis: Was the tool count and auth pattern as predicted?