Best for
- Use Code Mode When
- Do NOT Use Code Mode For
- Common Use Cases
MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/.opencode/skills/mcp-code-mode/SKILL.md
MCP orchestration via TypeScript execution. Use Code Mode for ALL external MCP tool calls; ~98% context reduction, type-safe.
Decision brief
Execute TypeScript code with direct access to 200+ MCP tools through progressive disclosure. Code Mode eliminates context overhead by loading tools on-demand, enabling complex multi-tool workflows in a single execution with state persistence and built-in error handling.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory --skill ".opencode/skills/mcp-code-mode"Inspect the Agent Skill "mcp-code-mode" from https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/blob/3d386ee21366523774d89c0aff3ebbbc8fa7ff10/.opencode/skills/mcp-code-mode/SKILL.md at commit 3d386ee21366523774d89c0aff3ebbbc8fa7ff10. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Discover tools with searchtools() or listtools(). 2. Confirm exact callable syntax with toolinfo(). 3. Execute calltoolchain() with {manualname}.{manualname}{toolname} calls. 4. Return structured state from the TypeScript block.
These discovery methods ONLY work for Code Mode tools in .utcpconfig.json They do NOT show Sequential Thinking (which is in .mcp.json)
IMPORTANT: This only shows Code Mode servers in .utcpconfig.json, NOT Sequential Thinking
MANDATORY for ALL MCP tool calls: - ✅ Calling ClickUp, Notion, Figma, MyService, Chrome DevTools, or any other MCP tools - ✅ Accessing external APIs through MCP servers - ✅ Managing tasks in project management tools - ✅ Interacting with design tools, databases, or services - ✅ B…
MANDATORY for ALL MCP tool calls: - ✅ Calling ClickUp, Notion, Figma, MyService, Chrome DevTools, or any other MCP tools - ✅ Accessing external APIs through MCP servers - ✅ Managing tasks in project management tools - ✅ Interacting with design tools, databases, or services - ✅ B…
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 97/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 34 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Execute TypeScript code with direct access to 200+ MCP tools through progressive disclosure. Code Mode eliminates context overhead by loading tools on-demand, enabling complex multi-tool workflows in a single execution with state persistence and built-in error handling.
MANDATORY for ALL MCP tool calls:
Benefits over traditional tool calling:
Use native tools instead:
/speckit:resume first; only use native Spec Kit Memory tools after handover.md -> _memory.continuity -> spec docs has been exhausted)sequential_thinking_sequentialthinking() directly - NATIVE MCP)See Section 4 for details on Native MCP vs Code Mode distinction.
| Scenario | Code Mode Approach | Benefit |
|---|---|---|
| Create ClickUp task | call_tool_chain({ code: "await clickup.clickup_create_task({...})" }) | Type-safe, single execution |
| Multi-tool workflow | Figma → ClickUp → MyService in one execution | State persists, 5× faster |
| Browser automation | Chrome DevTools MCP for testing/screenshots | Sandboxed, reliable |
| Design-to-implementation | Fetch Figma design → Create task → Update CMS | Atomic workflow |
| External API access | Any MCP server (Notion, GitHub, etc.) | Progressive tool loading |
| Level | When to Load | Resources |
|---|---|---|
| ALWAYS | Every skill invocation | Core quick reference |
| CONDITIONAL | If intent signals match | Intent-mapped references |
| ON_DEMAND | Only on explicit request | Full configuration/workflows |
The authoritative routing logic for scoped loading, weighted intent scoring, and ambiguity handling. This skill uses a simple flat-resource intent router: references/ and assets/ contain direct markdown resources, not keyed references/<key>/ or assets/<key>/ subdirectories. Keep the resilient mechanics from the canonical router, but do not force keyed subdirectory discovery onto this skill.
Typed leaf projection (fleet routing standard). mcp-code-mode is a normal, standalone single-mode skill whose sole workflow mode is mcp-code-mode (there is no mode-registry.json). Every routable leaf under references/, assets/, and the manual-testing playbook is enumerated in leaf-manifest.json, generated from leaf-manifest.config.json (regenerate with generate-leaf-manifest.cjs --write .opencode/skills/mcp-code-mode; it must stay byte-stable under --check). leaf-aliases.json binds each router-emitted root-relative path (e.g. references/naming-convention.md) to its typed (mcp-code-mode, leafResourceId) identity, so a deterministic router replay recovers real typed pairs against the manifest. The RESOURCE_MAP below emits the reference and asset paths; playbook leaves are manifest-routed resources and must remain synchronized. Regenerate leaf-manifest.json and keep leaf-aliases.json in sync whenever any enumerated corpus changes.
discover_markdown_resources() recursively inventories current markdown under references/ and assets/.load_if_available() guards paths, checks inventory, and de-duplicates with seen.routing_key stays code-mode because there are no runtime keyed resource subdirectories.UNKNOWN_FALLBACK returns a disambiguation checklist and missing matches return a "no knowledge base" notice.from pathlib import Path
SKILL_ROOT = Path(__file__).resolve().parent
RESOURCE_BASES = (SKILL_ROOT / "references", SKILL_ROOT / "assets")
DEFAULT_RESOURCE = "references/workflows.md"
ROUTING_KEY = "code-mode"
INTENT_SIGNALS = {
"NAMING": {"weight": 4, "keywords": ["tool not found", "naming", "prefix", "format"]},
"SETUP": {"weight": 4, "keywords": ["setup", "install", "configure", ".utcp_config", ".env"]},
"VALIDATE": {"weight": 4, "keywords": ["validate", "validation", "check config", "schema"]},
"CATALOG": {"weight": 3, "keywords": ["what tools", "list tools", "discover tools", "catalog"]},
"WORKFLOW": {"weight": 3, "keywords": ["workflow", "orchestrate", "multi-tool", "error handling"]},
"ARCHITECTURE": {"weight": 2, "keywords": ["architecture", "token", "performance", "internals"]},
}
RESOURCE_MAP = {
"NAMING": ["references/naming-convention.md"],
"SETUP": ["references/configuration.md", "assets/config-template.md", "assets/env-template.md"],
"VALIDATE": ["references/configuration.md", "references/naming-convention.md"],
"CATALOG": ["references/tool-catalog.md"],
"WORKFLOW": ["references/workflows.md"],
"ARCHITECTURE": ["references/architecture.md"],
}
COMMAND_BOOSTS = {
"search_tools": "CATALOG",
"list_tools": "CATALOG",
"tool_info": "CATALOG",
"call_tool_chain": "WORKFLOW",
}
LOADING_LEVELS = {
"ALWAYS": [DEFAULT_RESOURCE],
"ON_DEMAND_KEYWORDS": ["full config", "deep dive", "full workflow", "all tools", "call_tool_chain", "tool chain", "mcp tools", "tool catalog", "code mode"],
"ON_DEMAND": ["references/configuration.md", "references/workflows.md"],
}
def _task_text(task) -> str:
parts = [
str(getattr(task, "query", "")),
str(getattr(task, "text", "")),
" ".join(getattr(task, "keywords", []) or []),
str(getattr(task, "command", "")),
]
return " ".join(parts).lower()
def _guard_in_skill(relative_path: str) -> str:
resolved = (SKILL_ROOT / relative_path).resolve()
resolved.relative_to(SKILL_ROOT)
if resolved.suffix.lower() != ".md":
raise ValueError(f"Only markdown resources are routable: {relative_path}")
return resolved.relative_to(SKILL_ROOT).as_posix()
def discover_markdown_resources() -> set[str]:
docs = []
for base in RESOURCE_BASES:
if base.exists():
docs.extend(p for p in base.rglob("*.md") if p.is_file())
return {doc.relative_to(SKILL_ROOT).as_posix() for doc in docs}
def score_intents(task) -> dict[str, float]:
"""Weighted intent scoring from request text and signals."""
text = _task_text(task)
scores = {intent: 0.0 for intent in INTENT_SIGNALS}
for intent, cfg in INTENT_SIGNALS.items():
for keyword in cfg["keywords"]:
if keyword in text:
scores[intent] += cfg["weight"]
command = str(getattr(task, "command", "")).lower()
for signal, intent in COMMAND_BOOSTS.items():
if signal in command:
scores[intent] += 4
return scores
def select_intents(scores: dict[str, float], ambiguity_delta: float = 1.0, max_intents: int = 2) -> list[str]:
ranked = sorted(scores.items(), key=lambda item: item[1], reverse=True)
if not ranked or ranked[0][1] <= 0:
return ["WORKFLOW"]
selected = [ranked[0][0]]
if len(ranked) > 1 and ranked[1][1] > 0 and (ranked[0][1] - ranked[1][1]) <= ambiguity_delta:
selected.append(ranked[1][0])
return selected[:max_intents]
def route_code_mode_resources(task):
inventory = discover_markdown_resources()
scores = score_intents(task)
intents = select_intents(scores, ambiguity_delta=1.0)
loaded = []
seen = set()
def load_if_available(relative_path: str) -> None:
guarded = _guard_in_skill(relative_path)
if guarded in inventory and guarded not in seen:
load(guarded)
loaded.append(guarded)
seen.add(guarded)
for relative_path in LOADING_LEVELS["ALWAYS"]:
load_if_available(relative_path)
if max(scores.values() or [0]) < 0.5:
return {
"routing_key": ROUTING_KEY,
"intents": intents,
"intent_scores": scores,
"load_level": "UNKNOWN_FALLBACK",
"needs_disambiguation": True,
"disambiguation_checklist": ["Confirm tool discovery, setup, validation, or workflow need", "Confirm target MCP/tool family", "Provide the tool call or error if available"],
"resources": loaded,
}
matched_intents = []
for intent in intents:
before_count = len(loaded)
for relative_path in RESOURCE_MAP.get(intent, []):
load_if_available(relative_path)
if len(loaded) > before_count:
matched_intents.append(intent)
text = _task_text(task)
if any(keyword in text for keyword in LOADING_LEVELS["ON_DEMAND_KEYWORDS"]):
for relative_path in LOADING_LEVELS["ON_DEMAND"]:
load_if_available(relative_path)
if not loaded:
load_if_available(DEFAULT_RESOURCE)
result = {"routing_key": ROUTING_KEY, "intents": intents, "intent_scores": scores, "resources": loaded}
if not matched_intents:
result["notice"] = f"No knowledge base found for intent(s): {', '.join(intents)}"
return result
The #1 most common error when using Code Mode is using wrong function names. All MCP tool calls MUST follow this pattern:
{manual_name}.{manual_name}_{tool_name}
Examples:
✅ Correct:
await myservice.myservice_sites_list({});
await clickup.clickup_create_task({...});
await figma.figma_get_file({...});
❌ Wrong (missing manual prefix):
await myservice.sites_list({}); // Error: Tool not found
await clickup.create_task({...}); // Error: Tool not found
See references/naming-convention.md for complete guide with troubleshooting.
Many Code Mode tools require a context parameter (15-25 words) for analytics:
await myservice.myservice_sites_list({
context: "Listing sites to identify collection structure for CMS update"
});
This helps with usage tracking and debugging.
Note:
list_tools()returns names ina.b.cformat (e.g.,myservice.myservice.sites_list). To call the tool, use underscore format:myservice.myservice_sites_list(). Thetool_info()function shows the correct calling syntax.
search_tools() or list_tools().tool_info().call_tool_chain() with {manual_name}.{manual_name}_{tool_name} calls.Full multi-tool examples live in references/workflows.md.
IMPORTANT: Code Mode only accesses tools in .utcp_config.json. Native MCP tools are NOT accessed through Code Mode.
1. Native MCP (opencode.json) - Direct tools (call directly, NOT through Code Mode):
sequential_thinking_sequentialthinking()/speckit:resume for recovery; native Spec Kit Memory tools such as session_bootstrap(), session_resume(), memory_context(), and memory_search() when canonical packet sources need deeper support2. Code Mode MCP (.utcp_config.json) - External tools accessed through Code Mode:
.utcp_config.json (project root).env (project root)call_tool_chain() wrapperThese discovery methods ONLY work for Code Mode tools in .utcp_config.json
They do NOT show Sequential Thinking (which is in .mcp.json)
Step 1: Check Configuration
// Read .utcp_config.json to see configured Code Mode MCP servers
// Look for "manual_call_templates" array
// Each object has a "name" field (this is the manual name)
// Check "disabled" field - if true, server is not active
// NOTE: Sequential Thinking is NOT in this file
// Sequential Thinking is in .mcp.json and called directly
Step 2: Use Progressive Discovery
// Search for Code Mode tools by description
const tools = await search_tools({
task_description: "browser automation",
limit: 10
});
// List all available Code Mode tools
const allTools = await list_tools();
// Get info about a specific Code Mode tool
const info = await tool_info({
tool_name: "server_name.server_name_tool_name"
});
// NOTE: These discovery tools are part of Code Mode
// They only show tools configured in .utcp_config.json
// Sequential Thinking will NOT appear in these results
See Section 3: Critical Naming Pattern for the complete guide.
Quick reminder: {manual_name}.{manual_name}_{tool_name} (e.g., myservice.myservice_sites_list())
Sequential Thinking Exception:
.utcp_config.json - uses native MCP toolssequential_thinking_sequentialthinking()call_tool_chain()Use .utcp_config.json with manual_call_templates[]; each entry defines the manual name, MCP server command/args/env, and disabled state. See references/configuration.md and assets/config-template.md.
⚠️ IMPORTANT: Code Mode prefixes ALL environment variables with
{manual_name}_from your configuration.
Example:
"name": "clickup" and env section references ${CLICKUP_API_KEY}.env file MUST use: clickup_CLICKUP_API_KEY=pk_xxxCLICKUP_API_KEY=pk_xxx will cause: Error: Variable 'clickup_CLICKUP_API_KEY' not foundQuick Reference:
| Manual Name | Config Reference | .env Variable |
|---|---|---|
clickup | ${CLICKUP_API_KEY} | clickup_CLICKUP_API_KEY |
figma | ${FIGMA_API_KEY} | figma_FIGMA_API_KEY |
notion | ${NOTION_TOKEN} | notion_NOTION_TOKEN |
See env-template.md for complete examples.
IMPORTANT: This only shows Code Mode servers in .utcp_config.json, NOT Sequential Thinking
Run list_tools() through Code Mode and group returned names by the prefix before the first dot. Sequential Thinking is native MCP and will not appear.
{manual_name}.{manual_name}_{tool_name} (see naming-convention.md)search_tools() before calling unknown tools{ success, data, errors, timestamp }myservice.sites_list instead of myservice.myservice_sites_listsearch_tools() to discover correct nameslist_tools() firstCode Mode implementation complete when:
call_tool_chain (no direct tool calls){manual_name}.{manual_name}_{tool_name} patternsearch_tools before calling).utcp_config.json and .env correct)This skill operates within the behavioral framework defined in AGENTS.md.
Key integrations:
skill_advisor.pyExternal Tool Integration:
Workflow: discover tools, call them inside one call_tool_chain() execution, return state for the caller, and surface errors explicitly.
Automatic activation when:
What Code Mode produces:
Use search_tools(), tool_info(), list_tools(), and call_tool_chain() as the core command set. For parallel execution, use Promise.all() when all calls must succeed and Promise.allSettled() when partial success is acceptable. Full examples live in references/workflows.md.
See Section 3: Critical Naming Pattern for the complete guide with examples.
Pattern: {manual_name}.{manual_name}_{tool_name}
The router discovers reference, asset, and script docs dynamically. Start with references/naming-convention.md, references/configuration.md, references/tool-catalog.md, references/workflows.md, references/architecture.md, assets/config-template.md, assets/env-template.md, then load task-specific resources from references/, templates from assets/, and automation from scripts/ when present.
Scripts: scripts/install.sh, scripts/update.sh, scripts/validate_config.py.
Related skills: mcp-chrome-devtools for browser debugging routes that can fall back to Code Mode.
Install guide: INSTALL-GUIDE.md.
Frequently asked questions
Execute TypeScript code with direct access to 200+ MCP tools through progressive disclosure. Code Mode eliminates context overhead by loading tools on-demand, enabling complex multi-tool workflows in a single execution with state persistence and built-in error handling.
The source record exposes this install command: npx skills add https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory --skill ".opencode/skills/mcp-code-mode". Inspect the command and pinned source before running it.
Alternatives
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing
oaustegard/claude-skills
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre