Ziel: Jedes Tool braucht einen MCP Server (JSON-RPC 2.0 über stdio), damit es in opencode als Tool aufgerufen werden kann.
Status: ✅ DONE (2026-06-02) Aufwand: ~30 Minuten pro Tool = ~3.5 Stunden total
Jedes Tool hat:
- CLI-Modus:
discover -path ... -format json(bereits implementiert) - MCP-Server-Modus:
discover --mcp(JSON-RPC 2.0 über stdio)
// Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "discover",
"arguments": {
"path": "/Users/jeremy/dev/PROJECT",
"pattern": "**/*.py",
"sort_by": "relevance",
"max_results": 10
}
}
}
// Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": "{...JSON output...}"
}]
}
}// cmd/discover/mcp_server.go
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
type MCPRequest struct {
JSONRPC string `json:"jsonrpc"`
ID int `json:"id"`
Method string `json:"method"`
Params MCPRequestParams `json:"params"`
}
type MCPRequestParams struct {
Name string `json:"name"`
Arguments map[string]interface{} `json:"arguments"`
}
type MCPResponse struct {
JSONRPC string `json:"jsonrpc"`
ID int `json:"id"`
Result MCPResult `json:"result,omitempty"`
Error MCPError `json:"error,omitempty"`
}
type MCPResult struct {
Content []MCPContent `json:"content"`
}
type MCPContent struct {
Type string `json:"type"`
Text string `json:"text"`
}
type MCPError struct {
Code int `json:"code"`
Message string `json:"message"`
}
func runMCPServer() error {
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
for scanner.Scan() {
var req MCPRequest
if err := json.Unmarshal(scanner.Bytes(), &req); err != nil {
sendError(0, -32700, "Parse error")
continue
}
switch req.Method {
case "tools/list":
handleToolsList(&req)
case "tools/call":
handleToolsCall(&req)
default:
sendError(req.ID, -32601, "Method not found")
}
}
return nil
}
func handleToolsCall(req *MCPRequest) {
args := req.Params.Arguments
// Convert MCP args to CLI flags
path, _ := args["path"].(string)
pattern, _ := args["pattern"].(string)
// Call the tool's Run function
result, err := runDiscover(path, pattern, ...)
if err != nil {
sendError(req.ID, -32000, err.Error())
return
}
// Send JSON result
jsonBytes, _ := json.MarshalIndent(result, "", " ")
sendResult(req.ID, string(jsonBytes))
}- Method:
discover_files - Args:
path,pattern,sort_by,max_results,format - Returns: Array of file metadata
- Method:
execute_command - Args:
command,timeout,cwd - Returns: Exit code, stdout, stderr, duration
- Method:
map_architecture - Args:
path,action,max_depth - Returns: Module map, dependency graph
- Method:
grasp_file - Args:
file,file_path - Returns: File structure, dependencies, related files
- Method:
scout_code - Args:
query,path,search_type - Returns: Code matches with context
- Method:
harvest_url - Args:
url,method,headers,body - Returns: Status, headers, body
- Method:
orchestrate_task - Args:
action,title,dependencies,tags - Returns: Task ID, plan, rollback
Für jeden MCP Server:
- Test 1:
tools/list— Gibt korrekte Tool-Definition zurück - Test 2:
tools/callmit validen Args — Gibt JSON-Ergebnis zurück - Test 3:
tools/callmit ungültigen Args — Gibt Fehler zurück - Test 4: Integration mit opencode — Tool ist verfügbar
- ✅ Erstelle
cmd/discover/mcp_server.go - ✅ Erstelle
cmd/execute/mcp_server.go - ✅ Erstelle
cmd/map/mcp_server.go - ✅ Erstelle
cmd/grasp/mcp_server.go - ✅ Erstelle
cmd/scout/mcp_server.go - ✅ Erstelle
cmd/harvest/mcp_server.go - ✅ Erstelle
cmd/orchestrate/mcp_server.go - ✅ Füge
--mcpFlag zu jedem Tool hinzu - ✅ Teste jeden Server mit
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | discover --mcp - ✅ Update AGENTS.md mit MCP-Server-Anweisungen
Ein Commit pro Tool:
feat(mcp): add MCP server to discover toolfeat(mcp): add MCP server to execute tool- ...
Oder ein Mega-Commit:
feat(mcp): add MCP servers to all 7 SIN-Code tools
- Pro Tool: 30 Minuten (Server + Tests)
- Total: ~3.5 Stunden
- Plus Debugging: +1 Stunde
- Total: ~5 Stunden
- Starte mit Discover-Tool (einfachstes Beispiel)
- Kopiere Pattern für andere Tools
- Teste mit opencode Integration