# Ikenga iyke (control bridge) (npm · @ikenga/mcp-iyke)

Drive a running Ikenga desktop app from MCP clients — DOM, click, type, navigate, screenshot.

- Trust score: 90/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `@ikenga/mcp-iyke`: 90/100 (this document), [markdown](https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke.md), [page](https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke)

## Channel facts

- Registry: `npm`
- Package: `@ikenga/mcp-iyke`
- Version: `0.2.3`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 97 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to ikenga-hq/ikenga-pkgs).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 30 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 6863 tokens (~90/item across 76 items; 76 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 75/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 26% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "iyke_iframe_send" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 76 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Ikenga iyke (control bridge) MCP server?

Ikenga iyke (control bridge) runs locally as an npm package, launched with npx -y @ikenga/mcp-iyke. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add dev-ikenga-mcp-iyke -- npx -y @ikenga/mcp-iyke
```

### Cursor

```json
{
  "mcpServers": {
    "dev-ikenga-mcp-iyke": {
      "command": "npx",
      "args": [
        "-y",
        "@ikenga/mcp-iyke"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "dev-ikenga-mcp-iyke": {
      "command": "npx",
      "args": [
        "-y",
        "@ikenga/mcp-iyke"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add dev-ikenga-mcp-iyke -- npx -y @ikenga/mcp-iyke
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-ikenga-mcp-iyke": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@ikenga/mcp-iyke"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add dev-ikenga-mcp-iyke --command npx --arg -y --arg @ikenga/mcp-iyke
```

### Hermes

```yaml
mcp_servers:
  dev-ikenga-mcp-iyke:
    command: "npx"
    args: ["-y", "@ikenga/mcp-iyke"]
```

### Netclaw

```json
{
  "McpServers": {
    "dev-ikenga-mcp-iyke": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@ikenga/mcp-iyke"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add dev-ikenga-mcp-iyke -t stdio -c npx -a -y @ikenga/mcp-iyke
```

### Other

```json
{
  "mcpServers": {
    "dev-ikenga-mcp-iyke": {
      "command": "npx",
      "args": [
        "-y",
        "@ikenga/mcp-iyke"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 90, 0)

- [security] Stability: 0.97 → pass

### 2026-09-19 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-08 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-06 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (76)

### `iyke_state` (~121 tokens)

Get the current state of the Ikenga desktop app — sidebar mode, focused pane route, and the full pane tree under shell.panes. shell.panes has shape { leaves: [{ id, focused, activeTabIdx, tabs: [{kind,title}] }], tree: <recursive PaneNode> }; use leaves[].id with iyke_focus or iyke_close (pane_id) to operate on a specific pane. Call this before iyke_go / iyke_mode / iyke_focus / iyke_close to check what the user is currently looking at.

### `iyke_go` (~77 tokens)

Navigate the focused pane to a route path inside the Ikenga desktop app (e.g. "/notes/today"). Path must start with "/". This replaces the focused pane's active tab content; use iyke_open with kind=route to add a new tab instead.

Input parameters:

- `path` (string, required): Route path, must start with "/".

### `iyke_mode` (~60 tokens)

Switch the activity-bar sidebar mode. Valid modes: app, files, agents, sessions, settings, storyboard, video-engine, canvas-design, image-generator. The first five are core; the rest are mini-apps.

Input parameters:

- `mode` (string, required)

### `iyke_open` (~276 tokens)

Open a new tab in the focused pane. `kind` selects the view type. For "route" pass `path`; "terminal" optionally `cmd` (a shell command string); "chat" requires `session_id`; "artifact" requires `path` (a single .html file); "artifact-studio" requires `path` plus optional `density` (grid for a folder, loupe for a single artifact, compare for two — with a `vs` sibling path); "artifact-grid" is a back-compat alias for `artifact-studio` at grid density; "mini-app" requires `name`.

Input parameters:

- `cmd` (string): For terminal kind. Omit for default login shell.
- `density` (string): For artifact-studio kind. Defaults: folder path → 'grid'; file path → 'loupe'. Required with `vs` for compare.
- `kind` (string, required)
- `name` (string): For mini-app kind.
- `path` (string): For route, artifact, artifact-studio, or artifact-grid kinds. For artifact-studio: a folder for grid density, a file for loupe / compare.
- `session_id` (string): For chat kind.
- `vs` (string): For artifact-studio kind at compare density — the second artifact path.

### `iyke_split` (~76 tokens)

Split the focused pane (or a specific pane via pane_id) into two. "horizontal" splits side-by-side; "vertical" splits top-bottom. Subject to the in-app MAX_LEAVES cap (currently 6).

Input parameters:

- `direction` (string, required)
- `pane_id` (string): Optional. Defaults to focused pane.

### `iyke_focus` (~74 tokens)

Focus a specific pane. Provide either pane_id (leaf id from iyke_state response — shell.panes.leaves[].id) or index (1-based DFS leaf index, matching the in-app ⌃1..⌃6 keyboard shortcuts).

Input parameters:

- `index` (integer)
- `pane_id` (string)

### `iyke_close` (~82 tokens)

Close a pane (or the focused pane if pane_id omitted). Closes the entire pane and all its tabs — to close a single tab from the in-app keyboard, use ⌘⇧W (⌘W closes the whole pane). Refuses to close the last remaining pane.

Input parameters:

- `pane_id` (string): Optional. Defaults to focused pane.

### `iyke_dom` (~120 tokens)

Take an accessibility-tree snapshot of the focused pane. Returns Playwright-style text plus structured JSON. Each interactive element gets a stable ref like e1, e2; pass that ref to iyke_click / iyke_type / iyke_key. Refs invalidate on the next snapshot or page navigation. Use `query` for substring filter, `all=true` to include hidden elements.

Input parameters:

- `all` (boolean): Include hidden + aria-hidden elements.
- `pane` (string)
- `query` (string): Substring filter against role/name/value.

### `iyke_logs` (~76 tokens)

Read recent console + error logs (last 500) from the running webview. Includes window error and unhandledrejection captures.

Input parameters:

- `level` (string)
- `since` (integer): Only entries with ts >= this (epoch ms).
- `source` (string): Filter by pane source ("shell" or leaf id).

### `iyke_network` (~54 tokens)

Read recent fetch + XHR network activity (last 100). Each entry has method, url, status, duration_ms, and error if it failed.

Input parameters:

- `since` (integer)
- `source` (string)

### `iyke_screenshot` (~79 tokens)

Capture a PNG screenshot of either the full window or a specific pane. Returns the saved path, dimensions, and byte count. Default writes to ~/.local/share/ikenga/screenshots/.

Input parameters:

- `out_path` (string): Override default output path.
- `pane_id` (string): Required when target=pane.
- `target` (string)

### `iyke_wait` (~82 tokens)

Wait until a predicate is satisfied or timeout. Use this after iyke_click / iyke_go to wait for the new state to render, instead of fixed sleeps. Returns { satisfied, elapsed_ms, message? }.

Input parameters:

- `kind` (string, required)
- `pane` (string)
- `timeout_ms` (integer)
- `value` (string, required)

### `iyke_click` (~75 tokens)

Click an element. Specify exactly one of `ref` (from iyke_dom), `selector` (CSS), or `text` (innerText match). Refs are most reliable.

Input parameters:

- `pane` (string)
- `ref` (string)
- `selector` (string)
- `text` (string)

### `iyke_type` (~82 tokens)

Type text into an input/textarea/contenteditable element. Specify exactly one of `ref` or `selector`. By default appends; pass `replace=true` to overwrite the existing value.

Input parameters:

- `pane` (string)
- `ref` (string)
- `replace` (boolean)
- `selector` (string)
- `text` (string, required)

### `iyke_key` (~105 tokens)

Dispatch a keyboard combo. Use names like "Enter", "Escape", "Tab", "ArrowDown", and modifiers Ctrl/Alt/Shift/Meta separated by + or , (e.g. "Ctrl+S", "Meta+K"). Optional `ref`/`selector` targets a specific element; otherwise the active element receives.

Input parameters:

- `combo` (string, required)
- `pane` (string)
- `ref` (string)
- `selector` (string)

### `iyke_query_cache` (~67 tokens)

Dump the TanStack Query cache: queryKey, status, fetchStatus, isStale, dataUpdatedAt, errorUpdatedAt, error, and a 200-char data preview for each entry. Useful for diagnosing stale data or failed fetches.

Input parameters:

- `pane` (string)

### `iyke_devtools` (~31 tokens)

Open Chrome DevTools for the main webview (debug builds only). Returns 503 in production builds.

### `iyke_iframe_state` (~61 tokens)

Read the latest published state object for an iframe pane (storyboard cursor, comp current frame, etc.). Iframes call publishState(key, value) from their iyke-bridge to expose runtime state for inspection.

Input parameters:

- `pane` (string, required)

### `iyke_iframe_send` (~76 tokens)

Send a fire-and-forget postMessage to an iframe pane. The iframe bridge listens for known kinds (e.g. "story-select") and acts on the payload. Use to drive mini-app actions from outside the running app.

Input parameters:

- `kind` (string, required)
- `pane` (string, required)
- `payload`

### `iyke_project_create` (~279 tokens)

Create a new project in the Ikenga shell. Projects scope chats, installed pkgs, pane layouts, todos, scratchpads and cron jobs — switching project rebinds those surfaces. Slug `id` must match ^[a-z0-9][a-z0-9_-]{0,63}$ and be unique; `default` is reserved. `display_name` is freely Unicode, capped at 120 chars. `root_path` is optional but recommended — it becomes the cwd for new chats spawned inside the project. `color` is a hex string used for the activity-bar dot. Use when the user asks to set up a new working context (a codebase, a label, an experiment).

Input parameters:

- `color` (string): Hex color like #4f8cff for the activity-bar dot.
- `description` (string)
- `display_name` (string, required): Human-readable name, up to 120 chars.
- `icon` (string): Emoji or filename inside ~/.local/share/ikenga/projects/<id>/.
- `id` (string, required): Slug: ^[a-z0-9][a-z0-9_-]{0,63}$. Unique. "default" is reserved.
- `root_path` (string): Absolute path. Used as cwd for new chats. Need not exist yet.

### `iyke_project_update` (~109 tokens)

Patch fields on an existing project. Only the fields you pass in `patch` are touched — omit a field to leave it as is. Pass `null` to clear a nullable field (root_path, icon, color, description). `position` controls the project ordering in the activity-bar switcher (lower = earlier). Cannot change `id`; create a new project and migrate instead.

Input parameters:

- `id` (string, required): Slug of the project to update.
- `patch` (object, required)

### `iyke_project_list` (~89 tokens)

List projects in switcher order (position ASC, then created_at). Each entry has id, display_name, root_path, icon, color, description, position, is_default, created_at, archived_at. Archived projects are hidden by default — pass include_archived=true to surface them (e.g. when an agent is restoring an old project).

Input parameters:

- `include_archived` (boolean)

### `iyke_project_archive` (~99 tokens)

Archive a project (soft-delete — sets archived_at, no data removed). The project disappears from the default switcher list but its sessions/pkgs/todos remain on disk and can be restored by a later iyke_project_update if needed. Refuses to archive the built-in "Default" project. If the archived project was active, the shell falls back to Default automatically.

Input parameters:

- `id` (string, required): Slug of the project to archive.

### `iyke_project_set_active` (~111 tokens)

Switch the shell's active project. Subsequent new chats, scratchpads, todos and pkg installs default to this project; existing project-scoped TanStack queries (sessions, pkgs, todos, scratchpads, cron) refetch automatically. Does NOT navigate panes — pane contents stay put until a phase-2/6-aware surface reads the new active id. Fails if the id is unknown or archived.

Input parameters:

- `id` (string, required): Slug of an existing, non-archived project.

### `iyke_project_get_active` (~64 tokens)

Return the currently active project (id, display_name, root_path, icon, color, description, position, is_default, created_at). Call this before iyke_project_set_active or any project-scoped mutation so an agent knows which project the user is in.

### `iyke_session_list` (~115 tokens)

List Claude chat sessions. Filter by project (defaults to active); pass include_all=true to list across all projects. Returns at most 50 threads by default (max 200). Each entry has id, title, cwd, project_id, claude_session_id, created_at, updated_at.

Input parameters:

- `include_all` (boolean): Skip the project filter entirely.
- `limit` (integer)
- `project_id` (string): Slug of the project to filter by. Omit to use the shell's active project.

### `iyke_session_move` (~66 tokens)

Move a chat thread between projects. Metadata-only — does not restart the claude subprocess. The cwd captured at spawn time stays whatever it was. Fails if the target project is unknown or archived.

Input parameters:

- `project_id` (string, required)
- `thread_id` (string, required)

### `iyke_session_start_in_project` (~162 tokens)

Mint a new Claude chat thread attached to a project. The shell resolves the project root as the session cwd, builds the layered Claude-config overlay dir (skills + agents + commands + merged .mcp.json) for the spawn, and routes the request through the ACP `session/new` handler. Returns the new thread_id; the actual subprocess spawns lazily on the first prompt — fire `acp_prompt` or open `/sessions/$threadId` in the UI to send the initial message. `initial_prompt` is currently informational only (the bridge does not forward it yet).

Input parameters:

- `cwd` (string): Optional cwd override; defaults to the project root_path.
- `initial_prompt` (string)
- `project_id` (string, required)

### `iyke_chi_run` (~187 tokens)

Start a new chi agent run against an engine. Returns { runId, status, output?, error? }. Use iyke_chi_status to poll for output. engine_id examples: claude-code, gemini, codex. mode controls permissions: plan, default, auto, bypassPermissions.

Input parameters:

- `cwd` (string): Working directory. Defaults to the active project root.
- `engine_id` (string, required): Engine id, e.g. claude-code.
- `mode` (string): Permission mode. Defaults to default.
- `model` (string): Optional engine model.
- `parent_id` (string): Optional parent run id for subagent chains.
- `prompt` (string, required): Initial prompt / task for the agent.
- `resume_session_id` (string): Optional existing engine session id to resume.
- `timeout_seconds` (integer): Timeout in seconds (currently advisory).

### `iyke_chi_resume` (~55 tokens)

Continue an existing chi agent run with a new prompt. Requires run_id from a previous iyke_chi_run or iyke_chi_list.

Input parameters:

- `prompt` (string, required)
- `run_id` (string, required)

### `iyke_chi_status` (~56 tokens)

Get the current status and output of a chi run. Returns { runId, engineId, status, output?, error?, brief? }. Poll periodically after iyke_chi_run.

Input parameters:

- `run_id` (string, required)

### `iyke_chi_list` (~54 tokens)

List chi agent runs. Optionally filter by engine_id. Returns rows newest-first with runId, engineId, status, and brief.

Input parameters:

- `engine_id` (string)
- `limit` (integer)

### `iyke_chi_cancel` (~29 tokens)

Cancel a running chi agent run by run_id.

Input parameters:

- `run_id` (string, required)

### `iyke_mcp_list` (~119 tokens)

List MCP servers visible from a project. Returns each (server name × source) pair so conflicts across tiers are surfaced separately. Each entry reports: source tier (personal | workspace_pkg | project | project_pkg), provider (pkg id or "personal"), lifecycle (long-lived | per-call | on-demand), live state (running / parked / crashed / blocked / not-started / on-demand), and the source file path. Defaults to the active project; pass project_id to query a specific one.

Input parameters:

- `project_id` (string)

### `iyke_mcp_restart` (~87 tokens)

Restart a supervised MCP server by pkg id. Restarts every long-lived MCP entry the pkg declares (the supervisor keys per pkg, not per server name). Useful when a child has wedged. Fails with 404 if the pkg is not supervised — per-call MCPs spawn fresh on every tool invocation and have nothing persistent to restart.

Input parameters:

- `pkg_id` (string, required)

### `iyke_pkg_trust_status` (~129 tokens)

Get the trust state for a single installed pkg. Returns one of: auto_trusted (built-in com.ikenga.* shipped with the shell), auto_granted (no sensitive permissions declared), granted (user approved a specific manifest version), or needs_approval (sensitive perms declared but no current grant; either never approved, perms changed since last grant, or explicitly revoked). When state is needs_approval, MCP tools/call against this pkg returns the structured `trust_required` error until the user grants approval via Settings → Pkgs.

Input parameters:

- `pkg_id` (string, required)

### `iyke_pkg_trust_list` (~73 tokens)

List trust state for every installed pkg. Returns one entry per pkg with state (auto_trusted / auto_granted / granted / needs_approval), declared sensitive permissions summary, and last grant timestamp when applicable. Use when surveying which third-party pkgs need user approval before their MCP tools can be invoked.

### `iyke_pkg_violations_list` (~140 tokens)

List kernel-level permission-violation audit rows newest-first. Today only `shell.execute` denials write here (a pkg attempted to spawn a binary outside its manifest's declared allowlist). Returns one entry per attempt with attempted (the resolved command), declared (the manifest allowlist at attempt time, comma-joined), scope_kind ('shell.execute'), pkg_id, and occurred_at (unix millis). Pass pkg_id to filter to one pkg; omit for a cross-pkg view. limit defaults to 100 and is hard-capped at 1000.

Input parameters:

- `limit` (number)
- `pkg_id` (string)

### `iyke_secret_get` (~131 tokens)

Read a secret from the vault. The scope arg partitions the read: omit it (or pass an empty string) to read from the active project; pass "workspace" to read a cross-project shared secret; pass "project:<id>" or "pkg:<id>" to target a specific partition. Returns the value as a string, or null when the key does not exist in the chosen scope. Falls back transparently to the legacy unscoped key when a scoped value is missing (with a deprecation log on the host).

Input parameters:

- `key` (string, required)
- `scope` (string)

### `iyke_secret_set` (~101 tokens)

Write a secret to the vault under the given scope (same scope semantics as iyke_secret_get). Triggers a re-dump of the runtime env-vault file so sidecars and per-call MCP children pick up the new value on next spawn. Use this sparingly — secrets are sensitive and the values land in the user's encrypted Stronghold snapshot.

Input parameters:

- `key` (string, required)
- `scope` (string)
- `value` (string, required)

### `iyke_secret_delete` (~78 tokens)

Delete a secret from the given scope. Same scope semantics as iyke_secret_get. Returns ok even if the key did not exist. Does not touch the legacy unscoped key — to clean up legacy entries, delete the value at the unscoped key directly.

Input parameters:

- `key` (string, required)
- `scope` (string)

### `iyke_secret_list` (~65 tokens)

List secret KEY NAMES (not values) in a scope. Same scope semantics as iyke_secret_get. Returns sorted bare key names — the scope prefix is stripped. Use to inventory what secrets are stored in a project without revealing values.

Input parameters:

- `scope` (string)

### `iyke_layout_get` (~101 tokens)

Get the saved layout (pane tree, files-explorer state, panel sizes) for a project. Returns the raw layout_state row contents — each field is the JSON the shell wrote, or null when nothing has been saved for that key. Defaults to the active project; pass project_id to query a specific one. Useful for the conductor pattern (an agent inspecting "what does this project look like to the user").

Input parameters:

- `project_id` (string)

### `iyke_layout_reset` (~89 tokens)

Reset a project's saved layout — deletes the pane tree, files-explorer state, and panel sizes rows. Next time the user (or anyone) switches to this project, the layout-swap orchestrator finds no saved state and leaves the current view in place. Use this to recover from a wedged layout or as part of a clean-slate workflow.

Input parameters:

- `project_id` (string, required)

### `iyke_claude_assets_list` (~119 tokens)

List Claude-config assets (skills, agents, commands, hooks, mcps) discovered for a project, grouped by provider tier. Returns a tree where each asset name maps to one or more AssetSource entries; multiple entries on the same name indicate a conflict between tiers. Defaults to the active project; pass project_id to query a specific one. Use this to see what an agent will actually load in a project context.

Input parameters:

- `kind` (string): Optional. Filter to one asset kind.
- `project_id` (string)

### `iyke_claude_asset_pin` (~183 tokens)

Pin a preferred provider for a Claude-config asset name in a scope. When discovery finds the same asset name in multiple tiers (e.g. a `code-reviewer` agent in both ~/.claude/ and a project pkg), the lowest tier wins by default; a pin overrides that. Scope is "workspace" (cross-project) or "project:<id>" (this project only). preferred_tier is one of personal | workspace_pkg | project | project_pkg. preferred_source is the pkg id (or "personal" for ~/.claude/) — omit to match any source in the tier.

Input parameters:

- `asset_kind` (string, required)
- `asset_name` (string, required)
- `preferred_source` (string)
- `preferred_tier` (string, required)
- `scope` (string, required): Either "workspace" or "project:<id>".

### `iyke_claude_asset_unpin` (~53 tokens)

Remove a pinned resolution. Falls back to the default lowest-tier-wins rule.

Input parameters:

- `asset_kind` (string, required)
- `asset_name` (string, required)
- `scope` (string, required)

### `iyke_claude_asset_list_pins` (~74 tokens)

List Claude-config asset pins for a scope. Scope is "workspace" (cross-project) or "project:<id>" (this project only). Returns one entry per pin with preferred_tier + preferred_source.

Input parameters:

- `scope` (string, required): Either "workspace" or "project:<id>".

### `iyke_agent_register` (~121 tokens)

Register this agent so locks and timers can attribute work to it. Returns an opaque id. Pass the id as holder to iyke_lock_acquire. Repeated calls with the same {id} bump last_seen_at; omit id to mint a new one.

Input parameters:

- `id` (string): Optional. Caller-supplied id (e.g. session-derived). Server mints one if omitted.
- `metadata` (object)
- `model` (string)
- `name` (string, required): Display name, e.g. "claude-conductor".

### `iyke_scratchpad_write` (~105 tokens)

Create or replace a project-scoped Markdown scratchpad. Use for plans, handoffs, working context that should outlive a chat. `scope` defaults to the active project (project:<active_id>); pass "workspace" or "pkg:<id>" to opt out. `name` is a slug unique within scope. Body cap 1 MB.

Input parameters:

- `body` (string, required)
- `name` (string, required)
- `scope` (string)

### `iyke_scratchpad_append` (~78 tokens)

Append to a scratchpad without overwriting. Creates it if missing. `with_separator=true` (default) inserts a horizontal rule + timestamp between the prior body and the new content.

Input parameters:

- `body` (string, required)
- `name` (string, required)
- `scope` (string)
- `with_separator` (boolean)

### `iyke_scratchpad_read` (~48 tokens)

Read a scratchpad by scope+name. 404 if missing. Returns id, body, updated_at.

Input parameters:

- `name` (string, required)
- `scope` (string)

### `iyke_scratchpad_list` (~48 tokens)

List scratchpads in a scope (defaults to active project). Each entry has id, name, updated_at, and a 200-char preview.

Input parameters:

- `scope` (string)

### `iyke_scratchpad_delete` (~39 tokens)

Delete a scratchpad by scope+name. Idempotent.

Input parameters:

- `name` (string, required)
- `scope` (string)

### `iyke_kv_set` (~70 tokens)

Store a small JSON value at scope+key. Cap 64 KB per value; cap 1 MB total per scope. For larger durable text, use scratchpads. Scope defaults to active project.

Input parameters:

- `key` (string, required)
- `scope` (string)
- `value` (required)

### `iyke_kv_get` (~51 tokens)

Read a JSON value at scope+key. Returns { key, value: null } if absent (200, not 404).

Input parameters:

- `key` (string, required)
- `scope` (string)

### `iyke_kv_delete` (~34 tokens)

Delete a KV entry. Idempotent.

Input parameters:

- `key` (string, required)
- `scope` (string)

### `iyke_kv_list` (~42 tokens)

List KV entries in a scope. `prefix` filter narrows by key prefix.

Input parameters:

- `prefix` (string)
- `scope` (string)

### `iyke_lock_acquire` (~121 tokens)

Acquire a project-scoped lease lock on a named resource. Use for short-lived coordination around shared files, plans, migrations. holder is the agent id from iyke_agent_register. ttl_ms defaults to 60000 (clamped to [1000, 600000]). If wait_ms is set, blocks up to that long for an existing lock to expire.

Input parameters:

- `holder` (string, required)
- `resource` (string, required)
- `scope` (string)
- `ttl_ms` (integer)
- `wait_ms` (integer)

### `iyke_lock_status` (~45 tokens)

Check whether a resource is currently locked (active leases only). Returns held=false if the lease has expired.

Input parameters:

- `resource` (string, required)
- `scope` (string)

### `iyke_lock_release` (~48 tokens)

Release a lock you hold. No-op if held by someone else or already expired.

Input parameters:

- `holder` (string, required)
- `resource` (string, required)
- `scope` (string)

### `iyke_lock_renew` (~63 tokens)

Extend a lock you hold by ttl_ms. Useful for long-running work that needs more time than the original lease.

Input parameters:

- `holder` (string, required)
- `resource` (string, required)
- `scope` (string)
- `ttl_ms` (integer)

### `iyke_todo_create` (~92 tokens)

Create a project-scoped todo. Tags are free-form strings; assignee is a free-form name (agent or user). Set blocker_id to mark this todo as blocked by another.

Input parameters:

- `assignee` (string)
- `blocker_id` (string)
- `body` (string)
- `scope` (string)
- `tags` (array)
- `title` (string, required)

### `iyke_todo_update` (~84 tokens)

Partial update of a todo. Only supplied fields are changed. Pass status="done" or use iyke_todo_complete for the common case.

Input parameters:

- `assignee` (string)
- `blocker_id` (string)
- `body` (string)
- `id` (string, required)
- `status` (string)
- `title` (string)

### `iyke_todo_list` (~60 tokens)

List todos in a scope (defaults to active project). Filter by status, tag, assignee.

Input parameters:

- `assignee` (string)
- `scope` (string)
- `status` (string)
- `tag` (string)

### `iyke_todo_complete` (~40 tokens)

Mark a todo as done and stamp completed_at. Equivalent to iyke_todo_update with status=done.

Input parameters:

- `id` (string, required)

### `iyke_timer_schedule` (~180 tokens)

Schedule a one-shot timer in the active project (or specified scope). Pass either fire_at (absolute epoch-ms) or delay_ms (relative from now), not both. When the timer fires the shell emits an OS notification; if agent_id is set, an entry also lands in that agent's inbox (delivered on its next tool call, 24h TTL).

Input parameters:

- `agent_id` (string): Registered agent id to deliver an inbox event to on fire.
- `body` (string): Optional notification body. <=4 KB.
- `delay_ms` (integer): Fire delay from now, ms. Mutually exclusive with fire_at.
- `fire_at` (integer): Absolute fire time, unix epoch ms. Mutually exclusive with delay_ms.
- `scope` (string)
- `title` (string, required): Notification title. <=300 chars.

### `iyke_timer_cancel` (~39 tokens)

Cancel a pending timer by id. No-op if already fired or cancelled. Returns { cancelled: bool }.

Input parameters:

- `id` (string, required)

### `iyke_timer_list` (~53 tokens)

List timers in a scope (defaults to active project). Optional status filter: pending | fired | cancelled. Returns timers sorted by fire_at ascending.

Input parameters:

- `scope` (string)
- `status` (string)

### `iyke_pkg_list` (~92 tokens)

List installed pkgs visible from the active project. Workspace-scoped pkgs are always included; project-scoped pkgs are included only when their project is active unless include_other_projects=true. Each entry: id, version, install_path, enabled, source, scope ("workspace" | "project:<id>"), active_now.

Input parameters:

- `include_other_projects` (boolean)
- `kind` (string)

### `iyke_pkg_install_scope_set` (~71 tokens)

Change the scope of an installed pkg. scope="workspace" (always loaded) or "project:<id>" (loaded only when that project is active). Triggers a kernel reconcile so sidecars start/stop accordingly.

Input parameters:

- `pkg_id` (string, required)
- `scope` (string, required)

### `iyke_pkg_uninstall` (~74 tokens)

Uninstall a pkg. Stops its sidecars, removes its registry entries, deletes its files. Project-scoped state in iyke_kv / iyke_scratchpads / iyke_todos survives. Builtins (com.ikenga.*) cannot be uninstalled.

Input parameters:

- `pkg_id` (string, required)

### `iyke_pin_read` (~127 tokens)

Fetch the full payload for an artifact-grid pin by id. The routing dispatcher pastes a short prompt referencing the pin id; call this tool to retrieve the structured context — artifact_path (the .html file on disk), selector (CSS selector inside the artifact iframe), text (the user's comment body), screenshot_path (local PNG of the targeted element, may be null), plus lifecycle stamps. Use the path + selector + text to reason about and execute the requested change. 404 if the pin no longer exists.

Input parameters:

- `id` (integer, required): Pin id as posted by the dispatcher.

### `iyke_pin_acknowledge` (~79 tokens)

Transition a pin from `open` to `in_progress`. Call this once you've read the pin and started working — the grid cell's pin dot flips to kola-amber so the user sees you're on it. Idempotent: later calls leave the existing `acknowledged_at` timestamp intact.

Input parameters:

- `id` (integer, required)

### `iyke_pin_resolve` (~100 tokens)

Transition a pin to `resolved`. Call this after committing the change you set out to make — the grid cell's pin dot flips to verdigris (resolved). Users can also resolve manually from the grid right-click menu; this is the agent-initiated path for closing the loop without bouncing back to the human. Stamps `resolved_at` on first transition; idempotent on re-calls.

Input parameters:

- `id` (integer, required)

### `iyke_pa_actions_pause` (~168 tokens)

Pause a batch of drafted actions into the Ikenga approve gate for operator sign-off (ux_mode: approve). Call this INSTEAD of performing the side effect (sending an email, posting, etc.) once you have drafted the outgoing items: it writes them to the gate at /outbox/approvals where the operator edits + approves, then STOP — the operator's approval drives the real send, not you. Each draft's `payload` must be `{ item: DraftItem, meta: ApproveGateMeta }` (the draft content + batch metadata).

Input parameters:

- `actionId` (string, required): The action id, e.g. "<pkgId>/<verb>".
- `batchId` (string, required): A unique id for this pause batch.
- `drafts` (array, required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke#diagnostics

## Score history

- 2026-09-20: 90
- 2026-09-19: 90
- 2026-09-18: 89
- 2026-09-17: 89
- 2026-09-16: 88
- 2026-09-15: 88
- 2026-09-14: 87
- 2026-09-13: 87
- 2026-09-12: 86
- 2026-09-11: 86
- 2026-09-10: 86
- 2026-09-09: 85
- 2026-09-08: 85
- 2026-09-07: 84
- 2026-09-06: 84
- 2026-09-05: 83
- 2026-09-04: 83
- 2026-09-03: 82
- 2026-09-02: 82
- 2026-09-01: 81
- 2026-08-31: 81
- 2026-08-30: 80
- 2026-08-29: 80
- 2026-08-28: 79
- 2026-08-27: 76
- 2026-08-26: 76
- 2026-08-25: 76
- 2026-08-24: 76
- 2026-08-23: 76
- 2026-08-22: 76

## Common questions

### What is the Ikenga iyke (control bridge) MCP server?

Ikenga iyke (control bridge) is an MCP server listed in the public MCP registry as dev.ikenga/mcp-iyke. Drive a running Ikenga desktop app from MCP clients, DOM, click, type, navigate, screenshot. This page covers its npm package (@ikenga/mcp-iyke).

### Is the Ikenga iyke (control bridge) MCP server safe to use?

Ikenga iyke (control bridge) scores 90 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Ikenga iyke (control bridge) MCP server expose?

Ikenga iyke (control bridge) exposes 76 tools: iyke_state, iyke_go, iyke_mode, iyke_open, iyke_split, and 71 more. Their descriptions and schemas cost roughly 6,863 tokens of context every time the server is loaded.

### Is the Ikenga iyke (control bridge) MCP server still maintained?

Ikenga iyke (control bridge) is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Ikenga iyke (control bridge) MCP server under?

Ikenga iyke (control bridge) declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@ikenga/mcp-iyke
- Socket report: https://socket.dev/npm/package/@ikenga/mcp-iyke
- Repository: https://github.com/ikenga-hq/ikenga-pkgs
- Website: https://github.com/ikenga-hq/ikenga-pkgs/tree/main/packages/mcp/iyke#readme
- Changelog RSS feed: https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke.xml
- Changelog JSON feed: https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke.json
- HTML version of this page: https://verifymcp.io/servers/dev-ikenga-mcp-iyke/ikenga-mcp-iyke
