Skip to content
Perstack

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 is a standard protocol for connecting LLM applications to tools. Perstack runs MCP servers as subprocesses and manages their lifecycle.

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.

Connect to MCP servers over HTTP.

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

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.

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.

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."