Desktop extensibility

Skills and MCP publishing

Kendr skill packs are versioned archives that can include agent instructions, MCP server definitions, and runnable server code. KendrWeb hosts the catalog and archive; Kendr Desktop installs, updates, enables, disables, and exposes only active skills and MCP tools to agentic mode.

Versioned packs Hosted archive MCP tools Desktop updates

Pack contract

A Kendr skill pack is a folder with a plugin manifest, optional skills, and optional MCP server config. Every change that users should update to must bump version. The file contract is published as the Kendr Skill Pack SDK.

my-pack/
  .cursor-plugin/plugin.json
  mcp.json
  server.py
  skills/
    my-skill/
      SKILL.md
{
  "name": "Docker MCP",
  "description": "Read-only Docker inspection tools and guidance for agentic mode.",
  "author": { "name": "Kendr" },
  "version": "0.1.0",
  "homepage": "https://kendr.org/docs/skills-and-mcp.html",
  "skills": "./skills",
  "mcpServers": "./mcp.json"
}

The manifest supports .cursor-plugin/plugin.json, .claude-plugin/plugin.json, or root plugin.json. Relative paths are resolved inside the installed pack directory.

Skill files

A skill is a folder containing SKILL.md. Kendr extracts the frontmatter name and description for the UI, and passes enabled skill guidance into agentic mode when it is relevant to the user's task.

---
name: Docker Operations
description: Inspect Docker containers, images, and local Docker disk usage before proposing container operations.
---

# Docker Operations

Use Docker MCP tools when the user asks about containers, images, compose stacks, or Docker storage.
Prefer read-only inspection before proposing any change.
Disable behavior

Disabled packs and disabled skills are not included in the agentic capability snapshot sent to the model.

MCP config

Bundle Cursor-style MCP JSON in mcp.json. Kendr rewrites relative cwd, envFile, and script paths into the installed pack directory.

{
  "mcpServers": {
    "docker": {
      "command": "${KENDR_PYTHON}",
      "args": ["docker_mcp_server.py"],
      "timeout": 30
    }
  }
}

Use ${KENDR_PYTHON} when the bundled server should run with the same Python interpreter as the Kendr backend. Hosted packs should default to read-only tools unless the pack description clearly explains side effects and approvals.

Python MCP server

MCP servers can be plain Python files using the MCP FastMCP API. Return structured dictionaries when possible so the agent can inspect results without scraping terminal text.

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Example MCP")

@mcp.tool(name="list_items", description="List local items for inspection.")
def list_items(limit: int = 20) -> dict:
    return {"ok": True, "items": []}

if __name__ == "__main__":
    mcp.run(transport="stdio")

Publish on KendrWeb

Add the pack folder under skill-packs/<slug>, then add a catalog entry in backend/early_access_api.py. The hosted API returns the version, archive URL, tool counts, and SHA-256 archive checksum. Catalog entries can be checked against catalog-entry.schema.json.

GET /api/skills/catalog
GET /api/skills/packs/<slug>/archive
{
  "id": "docker",
  "slug": "docker",
  "label": "Docker MCP",
  "version": "0.1.0",
  "install_source": "https://kendr.org/api/skills/packs/docker/archive",
  "archive_sha256": "...",
  "mcp_server_names": ["docker"],
  "tool_count": 4
}

Kendr Desktop compares the hosted version with the installed version and exposes update actions from the Skills overlay. Reinstalling or updating preserves the user's pack and skill enablement state.

Desktop install and update

Users install hosted packs from the Skills overlay, or paste a GitHub repo, local folder, or zip archive URL. Installed packs can be updated later from their stored source.

# Hosted catalog
curl https://kendr.org/api/skills/catalog

# Hosted archive
curl -L https://kendr.org/api/skills/packs/docker/archive -o docker.zip

In agentic mode, Kendr only advertises enabled MCP servers, enabled MCP tools, enabled packs, and enabled individual skills. Disabled entries remain installed but are withheld from the model context.

Release checklist

  • Bump plugin.json.version for every pack behavior change.
  • Keep tool names stable when possible; changing tool names breaks saved user expectations.
  • Prefer structured tool output and clear read-only vs side-effect descriptions.
  • Test archive install from an HTTP URL, not only from a local folder.
  • Verify disabled packs and disabled skills stay hidden from agentic mode.