Private
Public Access
0
0

fix(opencode): Remove invalid MCP tools block, add timeout/env, grant subagent access

The 46-entry mcp.manual-slop.tools block added in commit 30281843 was invalid per the v1.16.2 schema (McpLocalConfig has additionalProperties: false) and was being silently dropped. Also adds proper MCP server configuration and subagent permission grants.

Changes:

opencode.json:
- Remove the silently-dropped mcp.manual-slop.tools block (46 entries)
- Add timeout: 30000 (default 5000 is fragile)
- Add environment block with PYTHONPATH, GIT_TERMINAL_PROMPT, GCM_INTERACTIVE, GIT_ASKPASS, HOME so mcp_env.toml values are injected into the MCP server process
- Top-level 'tools' block intentionally omitted: schema only accepts boolean values (enable/disable), not description objects. Tool descriptions come from the MCP server's list_tools response (mcp_client.MCP_TOOL_SPECS).

.opencode/agents/{tier1-orchestrator,tier2-tech-lead,tier3-worker,tier4-qa,explore}.md:
- Add 'manual-slop_*': allow to each agent's permission block so subagents can use the 46 MCP tools (previously defaulted to deny in some permission schemas)

general.md: no change (no permission block, defaults to allow all)

Verified:
- opencode.json is now schema-valid (no more 'Expected boolean' errors)
- Both MCP servers connected: MiniMax (2 tools), manual-slop (46 tools)
- manual-slop MCP server startup: ~651ms (well under 30s timeout)
- All MCP tests pass: test_mcp_config.py + test_mcp_perf_tool.py = 4/4
- Subagent permission blocks confirmed in 'opencode debug config' output
This commit is contained in:
2026-06-06 15:44:52 -04:00
parent 9eed60238a
commit ca35b3ef48
6 changed files with 15 additions and 140 deletions
+1
View File
@@ -12,6 +12,7 @@ permission:
"git log*": allow
"ls*": allow
"dir*": allow
'manual-slop_*': allow
---
You are a fast, read-only agent specialized for exploring codebases. Use this when you need to quickly find files by patterns, search code for keywords, or answer about the codebase.
+1
View File
@@ -10,6 +10,7 @@ permission:
"git status*": allow
"git diff*": allow
"git log*": allow
'manual-slop_*': allow
---
STRICT SYSTEM DIRECTIVE: You are a Tier 1 Orchestrator.
+1
View File
@@ -6,6 +6,7 @@ temperature: 0.4
permission:
edit: ask
bash: ask
'manual-slop_*': allow
---
STRICT SYSTEM DIRECTIVE: You are a Tier 2 Tech Lead.
+1
View File
@@ -6,6 +6,7 @@ temperature: 0.3
permission:
edit: allow
bash: allow
'manual-slop_*': allow
---
STRICT SYSTEM DIRECTIVE: You are a stateless Tier 3 Worker (Contributor).
+1
View File
@@ -10,6 +10,7 @@ permission:
"git status*": allow
"git diff*": allow
"git log*": allow
'manual-slop_*': allow
---
STRICT SYSTEM DIRECTIVE: You are a stateless Tier 4 QA Agent.
+10 -140
View File
@@ -27,145 +27,13 @@
"C:\\projects\\manual_slop\\scripts\\mcp_server.py"
],
"enabled": true,
"tools": {
"read_file": {
"description": "Read the full UTF-8 content of a file within the allowed project paths"
},
"list_directory": {
"description": "List files and subdirectories within an allowed directory"
},
"search_files": {
"description": "Search for files matching a glob pattern within an allowed directory"
},
"get_file_summary": {
"description": "Get a compact heuristic summary of a file without reading its full content"
},
"get_file_slice": {
"description": "Read a specific line range from a file"
},
"set_file_slice": {
"description": "Replace a specific line range in a file with new content"
},
"edit_file": {
"description": "Replace exact string match in a file. Preserves indentation and line endings"
},
"get_tree": {
"description": "Returns a directory structure up to a max depth"
},
"get_git_diff": {
"description": "Returns the git diff for a file or directory"
},
"py_get_skeleton": {
"description": "Get a skeleton view of a Python file with function signatures and docstrings"
},
"py_get_code_outline": {
"description": "Get a hierarchical outline of a Python code file with line ranges"
},
"py_get_definition": {
"description": "Get the full source code for a specific class, function, or method definition"
},
"py_update_definition": {
"description": "Surgically replace the definition of a class or function in a Python file"
},
"py_get_signature": {
"description": "Get only the signature part of a Python function or method"
},
"py_set_signature": {
"description": "Surgically replace only the signature of a Python function or method"
},
"py_get_class_summary": {
"description": "Get a summary of a Python class listing its methods and their signatures"
},
"py_get_var_declaration": {
"description": "Get the assignment/declaration line for a variable"
},
"py_set_var_declaration": {
"description": "Surgically replace a variable assignment/declaration"
},
"py_get_imports": {
"description": "Parses a file's AST and returns a strict list of its dependencies"
},
"py_check_syntax": {
"description": "Runs a quick syntax check on a Python file"
},
"py_get_docstring": {
"description": "Extracts the docstring for a specific module, class, or function"
},
"py_find_usages": {
"description": "Finds exact string matches of a symbol in a given file or directory"
},
"py_get_hierarchy": {
"description": "Scans the project to find subclasses of a given class"
},
"py_remove_def": {
"description": "Excises a specific class or function definition from a Python file using AST"
},
"py_add_def": {
"description": "Inserts a new definition into a specific context (module level or class)"
},
"py_move_def": {
"description": "Relocates a definition within a file or across different Python files"
},
"py_region_wrap": {
"description": "Wraps a specified block of code in #region: Name and #endregion: Name tags"
},
"ts_c_get_skeleton": {
"description": "Get a skeleton view of a C file"
},
"ts_cpp_get_skeleton": {
"description": "Get a skeleton view of a C++ file"
},
"ts_c_get_code_outline": {
"description": "Get a hierarchical outline of a C file with line ranges"
},
"ts_cpp_get_code_outline": {
"description": "Get a hierarchical outline of a C++ file with line ranges"
},
"ts_c_get_definition": {
"description": "Get the full source code for a specific function or struct in a C file"
},
"ts_cpp_get_definition": {
"description": "Get the full source code for a specific class/function/method in a C++ file"
},
"ts_c_get_signature": {
"description": "Get only the signature part of a C function"
},
"ts_cpp_get_signature": {
"description": "Get only the signature part of a C++ function or method"
},
"ts_c_update_definition": {
"description": "Surgically replace the definition of a function in a C file"
},
"ts_cpp_update_definition": {
"description": "Surgically replace the definition of a class or function in a C++ file"
},
"derive_code_path": {
"description": "Recursively traces the execution path of a specific function or method"
},
"web_search": {
"description": "Search the web using DuckDuckGo"
},
"fetch_url": {
"description": "Fetch the full text content of a URL (stripped of HTML tags)"
},
"get_ui_performance": {
"description": "Get current UI performance metrics (FPS, Frame Time, CPU, Input Lag)"
},
"bd_create": {
"description": "Create a new Bead in the active Beads repository"
},
"bd_update": {
"description": "Update an existing Bead"
},
"bd_list": {
"description": "List all Beads in the active Beads repository"
},
"bd_ready": {
"description": "Check if the Beads repository is initialized in the current workspace"
},
"run_powershell": {
"description": "Run a PowerShell script within the project base directory"
}
"timeout": 30000,
"environment": {
"PYTHONPATH": "C:\\projects\\manual_slop\\src",
"GIT_TERMINAL_PROMPT": "0",
"GCM_INTERACTIVE": "never",
"GIT_ASKPASS": "echo",
"HOME": "C:\\Users\\Ed"
}
}
},
@@ -212,5 +80,7 @@
"*.log"
]
},
"plugin": ["superpowers@git+https://github.com/obra/superpowers.git"]
"plugin": [
"superpowers@git+https://github.com/obra/superpowers.git"
]
}