Skip to Content
Perstack 0.0.1 is released 🎉

Skills

Skills give Experts access to external tools via MCP (Model Context Protocol).

TypeUse case
mcpStdioSkillConnect to MCP servers via command line
mcpSseSkillConnect to MCP servers via HTTP (Server-Sent Events)
interactiveSkillDefine custom tools that pause for user input

MCP Skills

MCP is a standard protocol for connecting LLM applications to tools. Perstack runs MCP servers as subprocesses and manages their lifecycle.

STDIO (most common)

Run an MCP server as a subprocess. Works with npm packages, Python modules, or any executable.

[experts."researcher".skills."web-search"] type = "mcpStdioSkill" command = "npx" packageName = "exa-mcp-server" requiredEnv = ["EXA_API_KEY"]

The package is auto-installed at runtime.

SSE (remote servers)

Connect to MCP servers over HTTP.

[experts."analyst".skills."remote-api"] type = "mcpSseSkill" endpoint = "https://api.example.com/mcp"

Why minimal privilege matters

MCP servers are like npm packages — anyone can publish them, and they’re not reviewed. They often handle sensitive data like API keys. Perstack applies minimal privilege by default:

  • Environment variables: Only those listed in requiredEnv are passed to the server
  • Tool access: Use pick/omit to control which tools are available
  • Lifecycle: Runtime starts and stops servers on demand — no persistent daemons
[experts."editor".skills."filesystem"] type = "mcpStdioSkill" command = "npx" packageName = "some-mcp-server" requiredEnv = ["WORKSPACE_PATH"] pick = ["read_file", "write_file"] omit = ["delete_file"]

You define what each MCP server can access. The runtime enforces it.

Interactive Skills

Define custom tools that pause execution and wait for external input.

User input — Ask users for confirmation or choices:

[experts."wizard".skills."interaction"] type = "interactiveSkill" [experts."wizard".skills."interaction".tools."askChoice"] description = "Ask user to choose from options" inputJsonSchema = """ { "type": "object", "properties": { "question": { "type": "string" } } } """

Application integration — Let your app handle operations:

[experts."assistant".skills."app"] type = "interactiveSkill" [experts."assistant".skills."app".tools."addToCart"] description = "Add product to cart" inputJsonSchema = """ { "type": "object", "properties": { "productId": { "type": "string" } } } """

When an interactive tool is called, execution pauses and returns control to the caller.

Adding usage rules

Use rule to guide how the LLM uses the skill:

[experts."researcher".skills."web-search"] type = "mcpStdioSkill" command = "npx" packageName = "exa-mcp-server" rule = "Prefer .edu and .gov sources. Avoid user-generated content."

What’s next