Tutorials

Custom Workflows

Step-by-step guide to building your own MCPN workflow
  1. Make a new YAML file in your .mcp-workflows or .workflows folder:
    mkdir -p .mcp-workflows
    touch .mcp-workflows/my-custom-workflow.yaml
    
  2. Define your workflow:

    Basic Configuration

    my_custom_mode:
      description: "Demonstrates a custom workflow mode"
      prompt: |
        You are now in "Custom Mode". Let's walk through a series of steps:
          1. ...
          2. ...
        Please follow this pattern for all tasks.
    

    With Parameters

    custom_mode:
      description: "Workflow with parameter injection"
      parameters:
        thought:
          type: "string"
          description: "A thought to deeply reflect upon"
          required: true
        idea:
          type: "string"
          description: "An additional idea to consider"
      prompt: |
        Deeply reflect upon the provided thought.
        Here's the thought: {{ thought }}
    
        Additional idea to consider: {{ idea }}
    
        Reflect upon the implications/tradeoffs it may have as it relates to my current goals.
    

    With Tools (Situational Mode)

    web_debugger_mode:
      description: "Debug my web application with browser logs"
      prompt: |
        Deeply reflect upon all of this and think about why this isn't working.
        Theorize 4-6 different possible sources of the problem.
      tools: getConsoleLogs, getConsoleErrors, getNetworkLogs, getNetworkErrors, takeScreenshot
    

    With Sequential Tools

    web_debugger_mode:
      description: "Debug my web application with browser logs"
      prompt: |
        Deeply reflect upon all of this and think about why this isn't working.
        Theorize 4-6 different possible sources of the problem.
      toolMode: sequential
      tools: getConsoleLogs, getConsoleErrors, getNetworkLogs, getNetworkErrors, takeScreenshot
    

    Advanced Tool Configuration

    deep_thinking_mode:
      description: "Reflect on a thought and produce a reflection"
      parameters:
        thought:
          type: string
          description: "A thought to deeply reflect upon"
          required: true
      prompt: |
        Deeply reflect upon the provided thought.
        Reflect upon the implications/tradeoffs it may have as it relates to my current goals.
      toolMode: "sequential"
      tools:
        analyze_thought: analyze a previously generated thought
        explore_perspectives: think about additional perspectives given the analysis
        apply_findings:
          prompt: implement the findings of the analysis
          optional: true
    
  3. Use the workflow:
    • If you've installed the MCPN server using npx -y mcpn@latest init
    • Reference your workflow in your MCP client by its name (e.g., my_custom_mode)
    • For Cursor, you can configure your MCPN server like this:
      {
        "mcpServers": {
          "workflows-mcp": {
            "command": "npx",
            "args": ["mcpn@latest server", "--config", "/path/to/.mcp-workflows", "--preset", "thinking,coding"]
          }
        }
      }
      
  4. Test & Iterate:
    • Add or remove sections, prompts, or parameters as you refine your workflow
    • Experiment with different tool modes (sequential vs. situational)
    • Share your workflow configurations with your team via version control

Parameter Types

You can define various parameter types in your workflows:

  • String:
    name:
      type: "string"
      description: "User's name"
      required: true
    
  • Number:
    limit:
      type: "number"
      description: "Maximum items to return"
      default: 10
    
  • Boolean:
    includeArchived:
      type: "boolean"
      description: "Include archived items"
      default: false
    
  • Enum:
    sortOrder:
      type: "enum"
      enum: ["asc", "desc"]
      description: "Sort direction"
      default: "asc"
    
  • Array:
    tags:
      type: "array"
      description: "List of tags to filter by"
      items:
        type: "string"
        description: "A tag value"
    
  • Object:
    filters:
      type: "object"
      description: "Complex filter object"
      properties:
        status:
          type: "enum"
          enum: ["active", "inactive", "pending"]
          description: "Status filter"