Description
So ... it looks like the skill name NEEDS to match the MCP tool def name, or you'll get a STDERR json puke... pretty annoying.
Opencode config
{
"$schema": "https://opencode.ai/config.json",
"instructions": ["AGENTS.md", ".AGENTS.md", "CONTRIBUTING.md"],
"plugin": [
"opencode-wakatime",
"opencode-ignore",
"opencode-sessions",
"@zenobius/opencode-background",
"opencode-smart-voice-notify@latest",
"opencode-handoff",
"@simonwjackson/opencode-direnv",
"envsitter-guard@latest",
"@plannotator/opencode@latest",
"@slkiser/opencode-quota",
"@tarquinen/opencode-smart-title",
"@tarquinen/opencode-dcp@latest",
"@spoons-and-mirrors/subtask2@latest",
"@ramarivera/opencode-model-announcer",
"opencode-pty",
"opencode-scheduler",
"@zenobius/opencode-background"
],
"mcp": {
"memory-shared-graphthulhu": {
"type": "local",
"command": ["graphthulhu", "serve"]
},
"memory-personal-obsidian": {
"type": "local",
"command": ["npx", "-y", "@bitbonsai/mcpvault@latest"]
},
"orch-agent-mail": {
"enabled": true,
"type": "local",
"command": ["am", "serve-stdio"]
},
"audit-activitywatch": {
"type": "local",
"command": ["uvx", "activitywatch-mcp-server-py@latest"]
},
"audit-wakatime": {
"type": "local",
"command": ["npx", "-y", "github:geeknees/wakatime-mcp"]
},
"audit-bigtime": {
"type": "local",
"command": [
"uvx",
"git+ssh://github/Jelloeater/bigtime-mcp-server-py"
]
},
"ide-vscode": {
"type": "remote",
"url": "http://127.0.0.1:3000/mcp"
},
"ide-codium": {
"type": "local",
"command": ["npx", "-y", "@vscode-mcp/vscode-mcp-server@latest"]
},
"colab-atlassian": {
"type": "local",
"command": ["uvx", "mcp-atlassian"]
},
"colab-github": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-github"]
},
"ide-jetbrains": {
"type": "remote",
"url": "http://localhost:64342/sse",
"timeout": 120000
},
"tool-fetch": {
"type": "local",
"command": ["uvx", "mcp-server-fetch"]
},
"tool-filesystem": {
"type": "local",
"command": [
"npx",
"-y",
"@modelcontextprotocol/server-filesystem",
"~"
]
},
"tool-git": {
"type": "local",
"command": ["uvx", "mcp-server-git"]
},
"tool-ntfy": {
"type": "local",
"command": ["npx", "-y", "ntfy-me-mcp@latest"]
},
"kb-aws-knowledge": {
"type": "remote",
"url": "https://knowledge-mcp.global.api.aws"
},
"kb-awslabs-terraform": {
"type": "local",
"command": ["uvx", "awslabs.terraform-mcp-server@latest"]
},
"sequential-thinking": {
"enabled": true,
"type": "local",
"command": [
"npx",
"-y",
"@modelcontextprotocol/server-sequential-thinking"
]
}
},
"provider": {
"ollama": {
"models": {
"kimi-k2.5:cloud": {
"limit": {
"context": 262144,
"output": 262144
},
"name": "kimi-k2.5:cloud"
}
},
"name": "Ollama",
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://127.0.0.1:11434/v1"
}
}
}
}
Agent config
---
description: Plan
mode: primary
color: "#00ff15"
temperature: 0.4
permission:
"*": "deny" # Global kill-switch for all tools/MCPs
question: "allow" # Should be NO for subagents, generally
skill: "allow" # Will let agent load skills on the fly
websearch: "allow"
list: "allow"
read: "allow"
grep: "allow"
glob: "allow"
edit: "deny"
patch: "deny"
write: "deny"
bash: "allow"
lsp: "allow"
todowrite: "allow"
todoread: "allow"
webfetch: "allow"
"kb-*": "allow"
---
# Plan
## Goals
You are in planning mode. Focus on:
- Code quality and best practices
- Creating new ideas
Provide constructive feedback without making direct changes.
## Memory
After completing infrastructure changes, resolving deployment issues, or making architectural decisions, load the `memory` skill and record findings to the vault.
Error Message
[
{
"code": "invalid_value",
"values": [
"allow",
"deny",
"ask"
],
"path": [
"ruleset",
47,
"action"
],
"message": "Invalid option: expected one of \"allow\"|\"deny\"|\"ask\""
},
{
"code": "invalid_value",
"values": [
"allow",
"deny",
"ask"
],
"path": [
"ruleset",
48,
"action"
],
"message": "Invalid option: expected one of \"allow\"|\"deny\"|\"ask\""
},
{
"code": "invalid_value",
"values": [
"allow",
"deny",
"ask"
],
"path": [
"ruleset",
49,
"action"
],
"message": "Invalid option: expected one of \"allow\"|\"deny\"|\"ask\""
},
{
"code": "invalid_value",
"values": [
"allow",
"deny",
"ask"
],
"path": [
"ruleset",
50,
"action"
],
"message": "Invalid option: expected one of \"allow\"|\"deny\"|\"ask\""
}
]
Memory skill
---
name: memory
description: Graph-based shared memory system for persistent knowledge capture across sessions
---
# Shared Graph Memory System
Use Graphthulhu for persistent memory. All agent knowledge, task outcomes, and architectural decisions live in the shared memory graph.
## Tools
| Tool | Use for |
| ------------------------------ | ------------------------------------------------- |
| `graphthulhu_search` | Semantic search across memory |
| `graphthulhu_query_properties` | Find nodes by properties (type, status, topicKey) |
| `graphthulhu_get_page` | Read full memory node with metadata |
| `graphthulhu_upsert_blocks` | Create/update memory entries |
| `graphthulhu_update_block` | Surgical edits to existing memory blocks |
| `graphthulhu_link_pages` | Create relationships between memory nodes |
## Memory Location
Store memories in: `MEMORY/` folder (or project-specific subfolder)
## Metadata Schema
Every memory node should include structured metadata (properties):
```yaml
title: "Short descriptive title"
type: decision | gotcha | problem-solution | what-changed | session | discovery
status: active | resolved
topicKey: "category/specific-topic" # for dedup
project: "org/repo-name" # optional
created: 2026-03-15
agent_origin: "AgentName"
tags:
- relevant-tag
Before Creating a Memory Entry
Always check for duplicates first:
- Search by topicKey:
graphthulhu_query_properties(property="topicKey", value="architecture/auth-model")
- If found → update existing node with
graphthulhu_upsert_blocks or graphthulhu_update_block
- If not found → create new node with
graphthulhu_upsert_blocks
This prevents the duplicate pile-up problem.
What to Record
MUST record:
- Architecture/design decisions →
type: decision
- Bug identified and fixed →
type: problem-solution
- Unexpected behavior or gotcha →
type: gotcha
- Config changed (env vars, ports, deps) →
type: what-changed
- Feature completed or milestone →
type: what-changed
Do NOT record:
- Simple file reads, greetings, trivial commands
- Duplicate information already in memory
Resolving Completed Work
When a task is done or info is outdated:
- Update property:
status: resolved
- Add
resolved: 2026-03-15 to properties
Search with status: active to filter out old items:
graphthulhu_query_properties(property="status", value="active")
Session Summaries
At session end, create/update a session node:
Name: sessions/YYYY-MM-DD-brief-topic
Structure:
# Session Summary - Topic
## Goal
[What we were working on — specific, not vague]
## Key Decisions & Reasoning
- Chose X because Y. Rejected Z because [reason].
## What Changed
- `file/path.ts` — what changed and why
## Current State
- What works now, what's pending
- Any blockers or risks
## Next Steps
1. Concrete next action
2. In priority order
Guidelines
- Concise titles (~5-10 words)
- Include file paths when relevant
- Use relationships to connect related nodes:
graphthulhu_link_pages
- Always use topicKey for recurring topics
- Always include reasoning — "chose X because Y" is 10x more valuable
- Tag consistently with existing memory tags
Gotchas (common pitfalls)
- graphthulhu_create_page expects three simple parts: a page name (string), an object of properties (key/value pairs), and blocks as an array of plain strings. Example (correct):
graphthulhu_create_page(
name: "MEMORY/infra/example-page",
properties: { type: "problem-solution", topicKey: "infra/example" },
blocks: ["# Title", "Some details here", "- bullet"]
)
- graphthulhu_upsert_blocks accepts a page name and a blocks array where each block is an object with at least a
content string and optional properties and children arrays. Example (correct):
graphthulhu_upsert_blocks(
page: "MEMORY/infra/example-page",
blocks: [
{ content: "## Section", properties: { tag: "investigation" } },
{ content: "Detailed paragraph..." }
],
position: "append"
)
OS: macOS Tahoe 26.3.1 (25D2128) arm64
Host: MacBook Pro (14-inch, 2021)
Kernel: Darwin 25.3.0
Uptime: 7 hours, 51 mins
Packages: 327 (brew), 109 (brew-cask), 210 (macports)
Shell: zsh 5.9
Display (DELL U2412M): 1920x1200 in 24", 60 Hz [External] *
Display (VS248): 1920x1080 in 24", 60 Hz [External]
Display (DELL S2409W): 1920x1080 in 24", 60 Hz [External]
Display (DELL E248WFP): 1920x1200 in 24", 60 Hz [External]
WM: Quartz Compositor 1.600.0 (with Rectangle 0.93)
WM Theme: Multicolor (Dark)
Theme: Liquid Glass
Font: .AppleSystemUIFont [System], Helvetica [User]
Cursor: Fill - White, Outline - Black (45px)
Terminal: WezTerm 20240203-110809-5046fc22
Terminal Font: LigaSauceCodePro Nerd Font
CPU: Apple M1 Pro (10) @ 3.23 GHz
GPU: Apple M1 Pro (16) @ 1.30 GHz [Integrated]
Memory: 14.00 GiB / 16.00 GiB (88%)
Swap: 8.77 GiB / 10.00 GiB (88%)
Disk (/): 592.97 GiB / 926.35 GiB (64%) - apfs [Read-only]
Disk (/Volumes/INSTANTVIEW): 119.89 MiB / 3.74 GiB (3%) - msdos [External, Read-only]
Disk (/Volumes/untitled): 3.90 GiB / 16.00 GiB (24%) - apfs [External]
Disk (/Volumes/untitled 1): 31.38 GiB / 32.00 GiB (98%) - apfs [External]
Disk (/Volumes/untitled 2): 454.50 MiB / 32.00 GiB (1%) - hfs [External]
Local IP (en8): 192.168.12.15/24
Battery (bq40z651): 100% [AC connected]
Power Adapter: 96W USB-C Power Adapter
Locale: en_US.UTF-8
### Plugins
See above
### OpenCode version
_No response_
### Steps to reproduce
1. Have MCP name be custom memory-shared-graphthulhu
2. Agent profile calls skill
3. Skill calls tool name ex graphthulhu_search
4. Broken JSON error message
### Screenshot and/or share link
<img width="747" height="904" alt="Image" src="https://github.com/user-attachments/assets/b195975d-49a1-4d95-8f6b-033110a32e25" />
### Operating System
MacOS
### Terminal
Wezterm
Description
So ... it looks like the skill name NEEDS to match the MCP tool def name, or you'll get a STDERR json puke... pretty annoying.
Opencode config
Agent config
Error Message
Memory skill
Before Creating a Memory Entry
Always check for duplicates first:
graphthulhu_query_properties(property="topicKey", value="architecture/auth-model")graphthulhu_upsert_blocksorgraphthulhu_update_blockgraphthulhu_upsert_blocksThis prevents the duplicate pile-up problem.
What to Record
MUST record:
type: decisiontype: problem-solutiontype: gotchatype: what-changedtype: what-changedDo NOT record:
Resolving Completed Work
When a task is done or info is outdated:
status: resolvedresolved: 2026-03-15to propertiesSearch with
status: activeto filter out old items:Session Summaries
At session end, create/update a session node:
Name:
sessions/YYYY-MM-DD-brief-topicStructure:
Guidelines
graphthulhu_link_pagesGotchas (common pitfalls)
contentstring and optionalpropertiesandchildrenarrays. Example (correct):Common mistakes that break writes:
optionswrapper object instead of the expected parameter shape.blocksas a single string, or as an array of objects tocreate_page(create_page wants an array of strings).upsert_blockswith malformed block objects (missingcontent).Recovery tips:
graphthulhu_upsert_blocksfails with format errors, first callgraphthulhu_create_pagewith the page name, properties, and simple blocks (strings). Then retryupsert_blockswith structured block objects.topicKeyin properties so subsequent writes can upsert rather than duplicate.OS: macOS Tahoe 26.3.1 (25D2128) arm64
Host: MacBook Pro (14-inch, 2021)
Kernel: Darwin 25.3.0
Uptime: 7 hours, 51 mins
Packages: 327 (brew), 109 (brew-cask), 210 (macports)
Shell: zsh 5.9
Display (DELL U2412M): 1920x1200 in 24", 60 Hz [External] *
Display (VS248): 1920x1080 in 24", 60 Hz [External]
Display (DELL S2409W): 1920x1080 in 24", 60 Hz [External]
Display (DELL E248WFP): 1920x1200 in 24", 60 Hz [External]
WM: Quartz Compositor 1.600.0 (with Rectangle 0.93)
WM Theme: Multicolor (Dark)
Theme: Liquid Glass
Font: .AppleSystemUIFont [System], Helvetica [User]
Cursor: Fill - White, Outline - Black (45px)
Terminal: WezTerm 20240203-110809-5046fc22
Terminal Font: LigaSauceCodePro Nerd Font
CPU: Apple M1 Pro (10) @ 3.23 GHz
GPU: Apple M1 Pro (16) @ 1.30 GHz [Integrated]
Memory: 14.00 GiB / 16.00 GiB (88%)
Swap: 8.77 GiB / 10.00 GiB (88%)
Disk (/): 592.97 GiB / 926.35 GiB (64%) - apfs [Read-only]
Disk (/Volumes/INSTANTVIEW): 119.89 MiB / 3.74 GiB (3%) - msdos [External, Read-only]
Disk (/Volumes/untitled): 3.90 GiB / 16.00 GiB (24%) - apfs [External]
Disk (/Volumes/untitled 1): 31.38 GiB / 32.00 GiB (98%) - apfs [External]
Disk (/Volumes/untitled 2): 454.50 MiB / 32.00 GiB (1%) - hfs [External]
Local IP (en8): 192.168.12.15/24
Battery (bq40z651): 100% [AC connected]
Power Adapter: 96W USB-C Power Adapter
Locale: en_US.UTF-8