Skip to content

BUG: Skll tool name call MUST match MCP name def in config #18307

@Jelloeater

Description

@Jelloeater

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:

  1. Search by topicKey: graphthulhu_query_properties(property="topicKey", value="architecture/auth-model")
  2. If found → update existing node with graphthulhu_upsert_blocks or graphthulhu_update_block
  3. 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:

  1. Update property: status: resolved
  2. 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"
)
  • Common mistakes that break writes:

    • Passing a single options wrapper object instead of the expected parameter shape.
    • Supplying blocks as a single string, or as an array of objects to create_page (create_page wants an array of strings).
    • Calling upsert_blocks with malformed block objects (missing content).
  • Recovery tips:

    • If graphthulhu_upsert_blocks fails with format errors, first call graphthulhu_create_page with the page name, properties, and simple blocks (strings). Then retry upsert_blocks with structured block objects.
    • Always include topicKey in 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


### 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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions