Ikenga iyke (control bridge) MCP server
dev.ikenga/mcp-iyke·v0.2.3Drive a running Ikenga desktop app from MCP clients — DOM, click, type, navigate, screenshot.
0 stars140 downloads/wk
Reviews
Write oneNobody has reviewed Ikenga iyke (control bridge) yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Ikenga iyke (control bridge) tools (76, 14 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
iyke_agent_registerRegister 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.
iyke_chi_cancelwrite actionCancel a running chi agent run by run_id.
iyke_chi_listList chi agent runs. Optionally filter by engine_id. Returns rows newest-first with runId, engineId, status, and brief.
iyke_chi_resumeContinue an existing chi agent run with a new prompt. Requires run_id from a previous iyke_chi_run or iyke_chi_list.
iyke_chi_runwrite actionStart 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.
iyke_chi_statusGet the current status and output of a chi run. Returns { runId, engineId, status, output?, error?, brief? }. Poll periodically after iyke_chi_run.
iyke_claude_asset_list_pinsList 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.
iyke_claude_asset_pinPin 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
iyke_claude_asset_unpinwrite actionRemove a pinned resolution. Falls back to the default lowest-tier-wins rule.
iyke_claude_assets_listList 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
iyke_clickClick an element. Specify exactly one of `ref` (from iyke_dom), `selector` (CSS), or `text` (innerText match). Refs are most reliable.
iyke_closeClose 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.
iyke_devtoolsOpen Chrome DevTools for the main webview (debug builds only). Returns 503 in production builds.
iyke_domTake 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.
iyke_focusFocus 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).
iyke_goNavigate 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.
iyke_iframe_sendwrite actionSend 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.
iyke_iframe_stateRead 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.
iyke_keyDispatch 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.
iyke_kv_deletewrite actionDelete a KV entry. Idempotent.
iyke_kv_getRead a JSON value at scope+key. Returns { key, value: null } if absent (200, not 404).
iyke_kv_listList KV entries in a scope. `prefix` filter narrows by key prefix.
iyke_kv_setStore 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.
iyke_layout_getGet 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").
iyke_layout_resetReset 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.
iyke_lock_acquireAcquire 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.
iyke_lock_releaseRelease a lock you hold. No-op if held by someone else or already expired.
iyke_lock_renewExtend a lock you hold by ttl_ms. Useful for long-running work that needs more time than the original lease.
iyke_lock_statusCheck whether a resource is currently locked (active leases only). Returns held=false if the lease has expired.
iyke_logsRead recent console + error logs (last 500) from the running webview. Includes window error and unhandledrejection captures.
iyke_mcp_listList 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.
iyke_mcp_restartRestart 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.
iyke_modeSwitch 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.
iyke_networkRead recent fetch + XHR network activity (last 100). Each entry has method, url, status, duration_ms, and error if it failed.
iyke_openOpen 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 ba
iyke_pa_actions_pausePause 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 `payloa
iyke_pin_acknowledgeTransition 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.
iyke_pin_readFetch 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 pat
iyke_pin_resolveTransition 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.
iyke_pkg_install_scope_setChange 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.
iyke_pkg_listList 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.
iyke_pkg_trust_listList 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_trust_statusGet 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_approva
iyke_pkg_uninstallUninstall 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.
iyke_pkg_violations_listList 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
iyke_project_archiveArchive 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.
iyke_project_createwrite actionCreate 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 insid
iyke_project_get_activeReturn 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_project_listList 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).
iyke_project_set_activeSwitch 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.
iyke_project_updatewrite actionPatch 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.
iyke_query_cacheDump 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.
iyke_scratchpad_appendAppend 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.
iyke_scratchpad_deletewrite actionDelete a scratchpad by scope+name. Idempotent.
iyke_scratchpad_listList scratchpads in a scope (defaults to active project). Each entry has id, name, updated_at, and a 200-char preview.
iyke_scratchpad_readRead a scratchpad by scope+name. 404 if missing. Returns id, body, updated_at.
iyke_scratchpad_writewrite actionCreate 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.
iyke_screenshotCapture 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/.
iyke_secret_deletewrite actionDelete 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.
iyke_secret_getRead 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
iyke_secret_listList 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.
iyke_secret_setwrite actionWrite 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.
iyke_session_listList 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.
iyke_session_moveMove 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.
iyke_session_start_in_projectMint 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
iyke_splitSplit 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).
iyke_stateGet 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 chec
iyke_timer_cancelwrite actionCancel a pending timer by id. No-op if already fired or cancelled. Returns { cancelled: bool }.
iyke_timer_listList timers in a scope (defaults to active project). Optional status filter: pending | fired | cancelled. Returns timers sorted by fire_at ascending.
iyke_timer_scheduleSchedule 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).
iyke_todo_completeMark a todo as done and stamp completed_at. Equivalent to iyke_todo_update with status=done.
iyke_todo_createwrite actionCreate 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.
iyke_todo_listList todos in a scope (defaults to active project). Filter by status, tag, assignee.
iyke_todo_updatewrite actionPartial update of a todo. Only supplied fields are changed. Pass status="done" or use iyke_todo_complete for the common case.
iyke_typeType 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.
iyke_waitWait 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? }.
Public scan report
scanner v0.1.10 · 2026-11-02 · same rubric, same numbers if you re-run it
- Code scan11 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identitynamespace and repository owner differ4/10
How Ikenga iyke (control bridge) compares
Against every graded Productivity MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 86/100
- higher than 68% of 1,299 Productivity servers
- Tools
- 76
- the typical Productivity server has 7
- Tools that change things
- 18%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 140
- more than 64% of 427 Productivity servers with a package
What its tools let an agent do: 62 read · 14 change
Install Ikenga iyke (control bridge) in Claude Code, Cursor or VS Code
Runs npx -y @ikenga/mcp-iyke on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add mcp-iyke -- npx -y @ikenga/mcp-iyke
What the publisher says
From the Ikenga iyke (control bridge) repository's README, as published. We do not edit it. Read it on GitHub
ikenga-pkgs
The canonical home for first-party Ikenga packages — engines, MCP servers, mini-apps, and
helpers — in one Apache-2.0 monorepo.
What it is
Every first-party Ikenga package lives here (ADR-009), versioned and published with Changesets. It's a good place to read working examples of each pkg archetype before authoring your own.
Layout
packages/
engine/ AI engine adapters (claude-code, noop, …)
mcp/ MCP servers (iyke, …)
apps/ User-facing iframe mini-apps (studio, tasks, …)
connectors/ External-service adapters
sidecars/ Long-lived headless processesWorkflow
This monorepo uses Changesets for per-package versioning and publish.
pnpm install
pnpm -r build
pnpm changeset # author a changeset describing your change
git commit -am "feat: ..."
# Open PR; on merge to main, "Version Packages" PR opens.
# Merging that PR publishes all bumped packages to npm and updates the registry index.Each PR that changes a package must include a .changeset/*.md (the changeset-bot will nag you on PRs that don't).
Registry
Published versions appear in the ikenga-registry within seconds of pnpm changeset publish completing, via the scripts/update-registry-index.mjs step in the release workflow. The shell and ikenga CLI both consume that registry for discovery and install.
Links
- ikenga — the desktop shell that loads these
- ikenga-contract — the manifest schema each pkg validates against
- Building in the Loop — biweekly letters on running a real multi-agent Claude Code system
License
Apache-2.0 — see LICENSE.
Nothing above is checked by us. What we check is on the safety report.
Ikenga iyke (control bridge): common questions
- Is Ikenga iyke (control bridge) MCP server safe?
- Yes, by our scan: it is graded A (86/100). Read the Ikenga iyke (control bridge) safety report
- How do I install Ikenga iyke (control bridge)?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Ikenga iyke (control bridge) need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Ikenga iyke (control bridge) maintained?
- The last commit was 2 days ago (2026-11-02). The latest release is v0.2.3.
- What can I use instead of Ikenga iyke (control bridge)?
- Servers from other publishers that do the same job: DOMShell MCP server, Renforge MCP server and iPhone Use MCP server. Compare all Ikenga iyke (control bridge) alternatives.
- How does Ikenga iyke (control bridge) compare with other Productivity MCP servers?
- safety score 86/100 (higher than 68% of 1,299 Productivity servers); tools 76 (the typical Productivity server has 7); tools that change things 18% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Ikenga iyke (control bridge)
Same job from other publishers: the closest match first, then the best rated.
DOMShellDrive Chrome with filesystem commands (ls, cd, grep, click, type). One MCP tool, multi-agent.not reviewedGrowingA- RenforgeInspect, drive and debug a running Ren'Py game: state, screenshots, guarded clicks, saves, builds.not reviewedGrowingA
iPhone UseDrive a real iPhone from a Mac: read the screen as text, tap, type, scroll, replay saved flows.not reviewedGrowingB- HunchFocus-free macOS control for AI agents: drive your real Mac apps in the background, no stolen focus.not reviewedGrowingA
- TailscaleDrive a Tailscale node and its tailnet through the CLI and the control-plane APInot reviewedGrowingB