{
  "$schema": "https://focus-mcp.github.io/marketplace/schemas/catalog/v1.json",
  "name": "FocusMCP Marketplace",
  "description": "Catalogue officiel des briques MCP FocusMCP.",
  "owner": {
    "name": "FocusMCP contributors",
    "url": "https://github.com/focus-mcp",
    "email": "contact@focusmcp.dev"
  },
  "updated": "2026-05-24T21:30:04.642Z",
  "bricks": [
    {
      "name": "agent",
      "version": "1.1.0",
      "description": "Agent registry — register AI agents with capabilities, list available agents, query capabilities.",
      "tags": [
        "agent",
        "registry",
        "capabilities",
        "ai"
      ],
      "keywords": [
        "agent-registry",
        "ai-agent",
        "capabilities",
        "multi-agent",
        "register",
        "discovery"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "multi-agent",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "register",
          "description": "Register an agent with name, capabilities list, and optional metadata.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Human-readable name of the agent"
              },
              "capabilities": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of capability identifiers the agent can handle"
              },
              "metadata": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Optional key-value metadata about the agent"
              }
            },
            "required": [
              "name",
              "capabilities"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "unregister",
          "description": "Remove an agent from the registry by ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Unique identifier of the agent to remove"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "list",
          "description": "List all registered agents, optionally filtered by capability.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "capability": {
                "type": "string",
                "description": "Filter agents by this capability (optional)"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "capabilities",
          "description": "Query which agents can handle a specific capability/task type.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "capability": {
                "type": "string",
                "description": "Capability identifier to query"
              }
            },
            "required": [
              "capability"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-agent"
      },
      "license": "MIT"
    },
    {
      "name": "aiteam",
      "version": "1.1.1",
      "description": "AI team coordination — loads dispatch, parallel, debate, review, agent for multi-agent orchestration.",
      "tags": [
        "aiteam",
        "composite",
        "orchestration",
        "multi-agent"
      ],
      "keywords": [
        "multi-agent",
        "orchestration",
        "composite",
        "team",
        "dispatch",
        "debate",
        "parallel"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "multi-agent",
        "backend",
        "analysis"
      ],
      "dependencies": [
        "dispatch",
        "parallel",
        "debate",
        "review",
        "agent"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-aiteam"
      },
      "license": "MIT"
    },
    {
      "name": "autopilot",
      "version": "1.1.0",
      "description": "Autopilot workflow — autonomous task execution with reasoning, context management, and shell commands.",
      "tags": [
        "autopilot",
        "workflow",
        "autonomous",
        "planning"
      ],
      "keywords": [
        "autopilot",
        "autonomous",
        "workflow",
        "plan-execute",
        "reasoning",
        "task-automation"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "backend",
        "analysis",
        "devops"
      ],
      "dependencies": [
        "codebase",
        "smartcontext",
        "devtools",
        "thinking"
      ],
      "tools": [
        {
          "name": "plan",
          "description": "Create an execution plan for a task — break it into steps with reasoning.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "task": {
                "type": "string",
                "description": "Task description"
              },
              "dir": {
                "type": "string",
                "description": "Project root directory"
              }
            },
            "required": [
              "task"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "execute",
          "description": "Execute a plan step by step with reasoning at each stage.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "planId": {
                "type": "string",
                "description": "Plan ID from auto_plan"
              },
              "step": {
                "type": "number",
                "description": "Step to execute (default: next pending)"
              }
            },
            "required": [
              "planId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "status",
          "description": "Get autopilot status — current plan, completed steps, next step.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "planId": {
                "type": "string",
                "description": "Plan ID"
              }
            },
            "required": [
              "planId"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-autopilot"
      },
      "license": "MIT"
    },
    {
      "name": "batch",
      "version": "1.1.0",
      "description": "Batch execution patterns — run multiple operations sequentially, in parallel, or as a pipeline.",
      "tags": [
        "batch",
        "execution",
        "parallel",
        "sequential",
        "pipeline",
        "devtools"
      ],
      "keywords": [
        "batch",
        "parallel-execution",
        "sequential",
        "pipeline",
        "multi-command",
        "devtools"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "devops",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "multi",
          "description": "Execute multiple shell commands and collect all results. Each command runs independently.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "commands": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of shell commands"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory for all commands"
              },
              "timeout": {
                "type": "number",
                "description": "Per-command timeout in ms (default 30000)"
              }
            },
            "required": [
              "commands"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "sequential",
          "description": "Execute commands one by one. Stops on first failure unless continueOnError is set.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "commands": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Commands to run in order"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              },
              "timeout": {
                "type": "number",
                "description": "Per-command timeout in ms (default 30000)"
              },
              "continueOnError": {
                "type": "boolean",
                "description": "Continue after failure (default false)"
              }
            },
            "required": [
              "commands"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "parallel",
          "description": "Execute all commands in parallel. Returns when all complete.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "commands": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Commands to run in parallel"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              },
              "timeout": {
                "type": "number",
                "description": "Per-command timeout in ms (default 30000)"
              },
              "maxConcurrency": {
                "type": "number",
                "description": "Max parallel commands (default: unlimited)"
              }
            },
            "required": [
              "commands"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "pipeline",
          "description": "Pipe stdout of each command into stdin of the next (shell pipe chain).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "commands": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Commands to pipe together"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              },
              "timeout": {
                "type": "number",
                "description": "Total pipeline timeout in ms (default 30000)"
              }
            },
            "required": [
              "commands"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-batch"
      },
      "license": "MIT"
    },
    {
      "name": "cache",
      "version": "1.1.1",
      "description": "In-memory file cache — avoid redundant disk reads with mtime-based invalidation.",
      "tags": [
        "cache",
        "performance",
        "io"
      ],
      "keywords": [
        "cache",
        "in-memory",
        "file-cache",
        "mtime",
        "invalidation",
        "warmup",
        "performance"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "performance",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "get",
          "description": "Get a file from cache. Returns content + hit/miss status.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute file path"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "set",
          "description": "Force a file into the cache with given content.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute file path"
              },
              "content": {
                "type": "string",
                "description": "File content to cache"
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "invalidate",
          "description": "Invalidate one file or the entire cache (omit path to clear all).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path to invalidate; omit to clear all"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "warmup",
          "description": "Pre-load a list of files into the cache.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "paths": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of absolute file paths to cache"
              }
            },
            "required": [
              "paths"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "stats",
          "description": "Return cache metrics: entry count, total size, hit rate.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-cache"
      },
      "license": "MIT"
    },
    {
      "name": "callgraph",
      "version": "1.2.1",
      "description": "Call graph analysis — callers, callees, call chains.",
      "tags": [
        "callgraph",
        "code-intel",
        "analysis"
      ],
      "keywords": [
        "call-graph",
        "ast",
        "code-intel",
        "analysis",
        "callers",
        "callees",
        "call-chain"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "callers",
          "description": "Find which functions call this function (grep usage in files).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Function name to find callers for"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "callees",
          "description": "Find which functions this function calls.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Function name"
              },
              "file": {
                "type": "string",
                "description": "File containing the function"
              },
              "startLine": {
                "type": "number",
                "description": "Start line of function body"
              },
              "endLine": {
                "type": "number",
                "description": "End line of function body"
              }
            },
            "required": [
              "name",
              "file",
              "startLine",
              "endLine"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "chain",
          "description": "Find the call chain from function A to function Z.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "from": {
                "type": "string",
                "description": "Start function name"
              },
              "to": {
                "type": "string",
                "description": "End function name"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              },
              "maxDepth": {
                "type": "number",
                "description": "Maximum search depth (default 5)"
              }
            },
            "required": [
              "from",
              "to",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "depth",
          "description": "Find the maximum call depth of a function.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Function name"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              },
              "maxDepth": {
                "type": "number",
                "description": "Maximum depth to explore (default 5)"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-callgraph"
      },
      "license": "MIT"
    },
    {
      "name": "codebase",
      "version": "1.1.2",
      "description": "Complete codebase intelligence — loads treesitter, symbol, outline, callgraph, depgraph, refs.",
      "tags": [
        "codebase",
        "composite",
        "code-intelligence"
      ],
      "keywords": [
        "project",
        "codebase",
        "navigation",
        "overview",
        "composite",
        "code-intelligence",
        "all-in-one"
      ],
      "recommendedFor": [
        "any"
      ],
      "dependencies": [
        "treesitter",
        "symbol",
        "outline",
        "callgraph",
        "depgraph",
        "refs"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-codebase"
      },
      "license": "MIT"
    },
    {
      "name": "codeedit",
      "version": "1.2.1",
      "description": "Precise code editing — replace function bodies, insert before/after, safe delete with dependency check.",
      "tags": [
        "edit",
        "code",
        "refactoring",
        "insert",
        "delete",
        "codemod"
      ],
      "keywords": [
        "code-editing",
        "refactoring",
        "ast",
        "insert",
        "delete",
        "replace",
        "safe-delete"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust",
        "php",
        "refactoring"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "replacebody",
          "description": "Replace the body of a function or method by name. Uses AST parsing for PHP; brace-matching for TS/JS/Python/Go/Rust/Java. Returns found=false with error if language is unsupported.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "name": {
                "type": "string",
                "description": "Function or method name"
              },
              "newBody": {
                "type": "string",
                "description": "New function body content (without braces)"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              },
              "dryRun": {
                "type": "boolean",
                "description": "When true, return preview only — never write to disk"
              }
            },
            "required": [
              "path",
              "name",
              "newBody"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "insertafter",
          "description": "Insert code after a specific line number or after a pattern match. If the pattern matches multiple lines, returns inserted=false with a matches list; disambiguate via lineHint.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "after": {
                "type": "number",
                "description": "Line number to insert after (1-based)"
              },
              "pattern": {
                "type": "string",
                "description": "Regex pattern to insert after (alternative to line number)"
              },
              "lineHint": {
                "type": "number",
                "description": "Preferred line number when pattern has multiple matches — picks the closest match"
              },
              "content": {
                "type": "string",
                "description": "Content to insert"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              },
              "dryRun": {
                "type": "boolean",
                "description": "When true, return diff only — never write to disk"
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "insertbefore",
          "description": "Insert code before a specific line number or before a pattern match. If the pattern matches multiple lines, returns inserted=false with a matches list; disambiguate via lineHint.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "before": {
                "type": "number",
                "description": "Line number to insert before (1-based)"
              },
              "pattern": {
                "type": "string",
                "description": "Regex pattern to insert before"
              },
              "lineHint": {
                "type": "number",
                "description": "Preferred line number when pattern has multiple matches — picks the closest match"
              },
              "content": {
                "type": "string",
                "description": "Content to insert"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              },
              "dryRun": {
                "type": "boolean",
                "description": "When true, return diff only — never write to disk"
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "safedelete",
          "description": "Delete a function or export, checking first if anything depends on it. Refuses if dependents exist.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "name": {
                "type": "string",
                "description": "Function/export name to delete"
              },
              "dir": {
                "type": "string",
                "description": "Project root to check for dependents"
              },
              "force": {
                "type": "boolean",
                "description": "Delete even if dependents exist (default false)"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              },
              "dryRun": {
                "type": "boolean",
                "description": "When true, return diff only — never write to disk"
              }
            },
            "required": [
              "path",
              "name"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-codeedit"
      },
      "license": "MIT"
    },
    {
      "name": "codemod",
      "version": "1.1.2",
      "description": "Code modification toolkit — loads symbol, rename, codeedit, inline, textsearch for automated refactoring.",
      "tags": [
        "codemod",
        "composite",
        "refactoring"
      ],
      "keywords": [
        "codemod",
        "refactoring",
        "ast",
        "transforms",
        "rename",
        "inline",
        "composite"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "refactoring"
      ],
      "dependencies": [
        "symbol",
        "rename",
        "codeedit",
        "inline",
        "textsearch"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-codemod"
      },
      "license": "MIT"
    },
    {
      "name": "compress",
      "version": "1.1.1",
      "description": "Compress text output to save tokens — strip comments, collapse whitespace, abbreviate patterns.",
      "tags": [
        "compress",
        "tokens",
        "output",
        "json"
      ],
      "keywords": [
        "compression",
        "token-saving",
        "whitespace",
        "strip-comments",
        "terse",
        "output"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "performance",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "output",
          "description": "Strip comments, collapse whitespace, remove blank lines from code or text.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "Text to compress"
              },
              "level": {
                "type": "string",
                "enum": [
                  "light",
                  "medium",
                  "aggressive"
                ],
                "description": "Compression level (default: medium)"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "response",
          "description": "Compress a JSON tool response: strip null/undefined values, shorten paths, abbreviate keys.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "json": {
                "type": "string",
                "description": "JSON string to compress"
              }
            },
            "required": [
              "json"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "terse",
          "description": "Ultra-compressed: keep ONLY identifiers, function names, type names. Strip all implementation.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "Source text to make terse"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-compress"
      },
      "license": "MIT"
    },
    {
      "name": "contextpack",
      "version": "1.1.0",
      "description": "Pack files into a compressed context bundle — reduce token usage by extracting only signatures, maps, or full content.",
      "tags": [
        "context",
        "pack",
        "tokens",
        "compression"
      ],
      "keywords": [
        "context-pack",
        "token-budget",
        "signatures",
        "compression",
        "prioritize",
        "bundle"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "analysis",
        "performance"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "pack",
          "description": "Pack multiple files into a single context string.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths to pack"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "signatures",
                  "map",
                  "full"
                ],
                "description": "Pack mode: signatures (exports only), map (key lines), full (entire file). Default: signatures"
              }
            },
            "required": [
              "files"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "budget",
          "description": "Given a token budget, pack as many files as possible.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths"
              },
              "budget": {
                "type": "number",
                "description": "Token budget"
              }
            },
            "required": [
              "files",
              "budget"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "estimate",
          "description": "Estimate pack size without actually packing.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "signatures",
                  "map",
                  "full"
                ],
                "description": "Pack mode (default: signatures)"
              }
            },
            "required": [
              "files"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "prioritize",
          "description": "Sort files by relevance to a query.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths"
              },
              "query": {
                "type": "string",
                "description": "Relevance query"
              }
            },
            "required": [
              "files",
              "query"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-contextpack"
      },
      "license": "MIT"
    },
    {
      "name": "convert",
      "version": "1.2.1",
      "description": "Convert between formats and units — unit conversion, encoding, format transformation, naming conventions.",
      "tags": [
        "convert",
        "units",
        "encoding",
        "format",
        "naming"
      ],
      "keywords": [
        "unit-conversion",
        "encoding",
        "base64",
        "format-transform",
        "naming-convention",
        "csv",
        "yaml"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "units",
          "description": "Convert between units: bytes (B/KB/MB/GB), time (ms/s/m/h), or tokens with cost estimate.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "value": {
                "type": "number",
                "description": "The numeric value to convert"
              },
              "from": {
                "type": "string",
                "description": "Source unit: b, kb, mb, gb, ms, s, m, h, tokens"
              },
              "to": {
                "type": "string",
                "description": "Target unit: b, kb, mb, gb, ms, s, m, h, tokens, cost"
              },
              "pricePerMillion": {
                "type": "number",
                "description": "Token price per 1M tokens in USD (required when converting tokens→cost)"
              }
            },
            "required": [
              "value",
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "encoding",
          "description": "Encode or decode text using base64, hex, URL encoding, or HTML entities.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "The text to encode or decode"
              },
              "operation": {
                "type": "string",
                "enum": [
                  "base64encode",
                  "base64decode",
                  "hexencode",
                  "hexdecode",
                  "urlencode",
                  "urldecode",
                  "htmlescape",
                  "htmlunescape"
                ],
                "description": "The encoding operation to perform"
              }
            },
            "required": [
              "text",
              "operation"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "format",
          "description": "Convert data between formats: JSON, CSV, and YAML.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "description": "The input data string to convert"
              },
              "from": {
                "type": "string",
                "enum": [
                  "json",
                  "csv"
                ],
                "description": "Source format"
              },
              "to": {
                "type": "string",
                "enum": [
                  "json",
                  "csv",
                  "yaml"
                ],
                "description": "Target format"
              }
            },
            "required": [
              "data",
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "language",
          "description": "Convert naming conventions between camelCase, snake_case, kebab-case, and PascalCase.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "The identifier to convert"
              },
              "to": {
                "type": "string",
                "enum": [
                  "camel",
                  "snake",
                  "kebab",
                  "pascal"
                ],
                "description": "Target naming convention"
              }
            },
            "required": [
              "text",
              "to"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-convert"
      },
      "license": "MIT"
    },
    {
      "name": "debate",
      "version": "1.1.0",
      "description": "Structured multi-perspective debate — define positions, score arguments, find consensus, summarize.",
      "tags": [
        "debate",
        "consensus",
        "scoring",
        "analysis",
        "reasoning"
      ],
      "keywords": [
        "debate",
        "multi-perspective",
        "consensus",
        "scoring",
        "reasoning",
        "positions"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "analysis",
        "multi-agent",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "debate",
          "description": "Start a debate with a topic and an array of positions (role + argument).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "topic": {
                "type": "string",
                "description": "The debate topic or question"
              },
              "positions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "role": {
                      "type": "string",
                      "description": "Name or role of the debater"
                    },
                    "argument": {
                      "type": "string",
                      "description": "The debater's argument"
                    }
                  },
                  "required": [
                    "role",
                    "argument"
                  ],
                  "additionalProperties": false
                },
                "minItems": 2,
                "description": "List of positions (minimum 2)"
              }
            },
            "required": [
              "topic",
              "positions"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "consensus",
          "description": "Find common ground between positions in a debate by extracting overlapping keywords and themes.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "debateId": {
                "type": "string",
                "description": "ID of the debate to analyze"
              }
            },
            "required": [
              "debateId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "score",
          "description": "Score each position on criteria (relevance, evidence, feasibility) from 1 to 10 and compute a weighted ranking.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "debateId": {
                "type": "string",
                "description": "ID of the debate to score"
              },
              "scores": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "role": {
                      "type": "string",
                      "description": "Role being scored"
                    },
                    "relevance": {
                      "type": "number",
                      "description": "Relevance score 1-10"
                    },
                    "evidence": {
                      "type": "number",
                      "description": "Evidence quality score 1-10"
                    },
                    "feasibility": {
                      "type": "number",
                      "description": "Feasibility score 1-10"
                    }
                  },
                  "required": [
                    "role",
                    "relevance",
                    "evidence",
                    "feasibility"
                  ],
                  "additionalProperties": false
                },
                "description": "Criteria scores per position"
              }
            },
            "required": [
              "debateId",
              "scores"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "summary",
          "description": "Summarize the debate with winner, key points, and areas of agreement and disagreement.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "debateId": {
                "type": "string",
                "description": "ID of the debate to summarize"
              }
            },
            "required": [
              "debateId"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-debate"
      },
      "license": "MIT"
    },
    {
      "name": "decision",
      "version": "1.1.0",
      "description": "Structured decision-making — define options, analyze tradeoffs, recommend, and record decisions.",
      "tags": [
        "decision",
        "tradeoff",
        "analysis",
        "recommendation",
        "adr"
      ],
      "keywords": [
        "decision",
        "tradeoff",
        "adr",
        "recommendation",
        "weighted-score",
        "options"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "analysis",
        "backend",
        "documentation"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "options",
          "description": "Define options for a decision. Each option has a label and optional pros/cons.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "question": {
                "type": "string",
                "description": "The decision question"
              },
              "options": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": "string"
                    },
                    "pros": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "cons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "label"
                  ]
                },
                "description": "Available options"
              }
            },
            "required": [
              "question",
              "options"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "tradeoffs",
          "description": "Add criteria and weights to evaluate options. Score each option against criteria.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "decisionId": {
                "type": "string",
                "description": "Decision ID"
              },
              "criteria": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "weight": {
                      "type": "number",
                      "description": "Weight 1-10"
                    }
                  },
                  "required": [
                    "name",
                    "weight"
                  ]
                },
                "description": "Evaluation criteria"
              },
              "scores": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "option": {
                      "type": "string"
                    },
                    "scores": {
                      "type": "array",
                      "items": {
                        "type": "number"
                      },
                      "description": "Score per criterion (1-10)"
                    }
                  },
                  "required": [
                    "option",
                    "scores"
                  ]
                },
                "description": "Scores per option"
              }
            },
            "required": [
              "decisionId",
              "criteria",
              "scores"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "recommend",
          "description": "Get a recommendation based on weighted scores.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "decisionId": {
                "type": "string",
                "description": "Decision ID"
              }
            },
            "required": [
              "decisionId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "record",
          "description": "Record the final decision with rationale. Persists to a JSON file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "decisionId": {
                "type": "string",
                "description": "Decision ID"
              },
              "chosen": {
                "type": "string",
                "description": "The chosen option label"
              },
              "rationale": {
                "type": "string",
                "description": "Why this option was chosen"
              },
              "outputPath": {
                "type": "string",
                "description": "File path to save the decision record (optional)"
              }
            },
            "required": [
              "decisionId",
              "chosen",
              "rationale"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-decision"
      },
      "license": "MIT"
    },
    {
      "name": "depgraph",
      "version": "1.2.1",
      "description": "Dependency graph analysis — imports, exports, circular deps, fan-in/out.",
      "tags": [
        "depgraph",
        "imports",
        "analysis",
        "circular"
      ],
      "keywords": [
        "dependency",
        "graph",
        "code-intel",
        "analysis",
        "imports",
        "exports",
        "circular-deps",
        "fan-in",
        "fan-out"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "monorepo"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "imports",
          "description": "List all imports of a file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute file path"
              }
            },
            "required": [
              "file"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "exports",
          "description": "List all exports of a file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute file path"
              }
            },
            "required": [
              "file"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "circular",
          "description": "Detect circular dependencies in a directory.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Absolute directory path"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "fanin",
          "description": "Find which files import this file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute file path"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              }
            },
            "required": [
              "file",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "fanout",
          "description": "Count how many files this file imports.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute file path"
              }
            },
            "required": [
              "file"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-depgraph"
      },
      "license": "MIT"
    },
    {
      "name": "devtools",
      "version": "1.1.1",
      "description": "Developer tools — loads shell, sandbox, batch for command execution and scripting.",
      "tags": [
        "devtools",
        "composite",
        "execution"
      ],
      "keywords": [
        "devtools",
        "composite",
        "shell",
        "sandbox",
        "batch",
        "scripting"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "devops",
        "backend"
      ],
      "dependencies": [
        "shell",
        "sandbox",
        "batch"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-devtools"
      },
      "license": "MIT"
    },
    {
      "name": "diagram",
      "version": "1.1.0",
      "description": "Diagram generation — produce Mermaid, DOT/Graphviz, and ASCII diagrams from data.",
      "tags": [
        "diagram",
        "mermaid",
        "graphviz",
        "dot",
        "ascii",
        "visualization"
      ],
      "keywords": [
        "diagram",
        "mermaid",
        "graphviz",
        "dot",
        "ascii",
        "visualization",
        "flowchart"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "documentation",
        "analysis",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "mermaid",
          "description": "Generate a Mermaid diagram from structured data (flowchart, sequence, class, or graph).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "description": "Diagram type: flowchart, sequence, classDiagram, graph"
              },
              "nodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Nodes/participants"
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string"
                    },
                    "to": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "from",
                    "to"
                  ]
                },
                "description": "Connections between nodes"
              },
              "direction": {
                "type": "string",
                "description": "Graph direction: TB, BT, LR, RL (default TB)"
              }
            },
            "required": [
              "type",
              "nodes",
              "edges"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "dot",
          "description": "Generate a DOT/Graphviz diagram from structured data.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "nodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "shape": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Nodes"
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string"
                    },
                    "to": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "from",
                    "to"
                  ]
                },
                "description": "Edges"
              },
              "directed": {
                "type": "boolean",
                "description": "Directed graph (default true)"
              }
            },
            "required": [
              "nodes",
              "edges"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "ascii",
          "description": "Generate a simple ASCII box-and-arrow diagram from nodes and edges.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "nodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Nodes"
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string"
                    },
                    "to": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "from",
                    "to"
                  ]
                },
                "description": "Edges"
              }
            },
            "required": [
              "nodes",
              "edges"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-diagram"
      },
      "license": "MIT"
    },
    {
      "name": "dispatch",
      "version": "1.1.0",
      "description": "Task dispatch queue — send tasks, manage queue, cancel, check status for multi-step workflows.",
      "tags": [
        "dispatch",
        "queue",
        "task",
        "orchestration",
        "workflow"
      ],
      "keywords": [
        "dispatch",
        "queue",
        "task-queue",
        "orchestration",
        "workflow",
        "cancel",
        "priority"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "backend",
        "multi-agent",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "send",
          "description": "Send a task to the dispatch queue. Returns a task ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "description": "Task type (e.g. 'review', 'build')"
              },
              "payload": {
                "type": "object",
                "description": "Task payload data"
              },
              "priority": {
                "type": "number",
                "description": "Priority 1-10 (default 5)"
              }
            },
            "required": [
              "type",
              "payload"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "queue",
          "description": "List all tasks in the queue, optionally filtered by status.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "Filter: 'pending', 'running', 'done', 'cancelled', 'all' (default 'all')"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "cancel",
          "description": "Cancel a pending or running task by ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Task ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "status",
          "description": "Get detailed status of a specific task.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Task ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-dispatch"
      },
      "license": "MIT"
    },
    {
      "name": "echo",
      "version": "1.1.1",
      "description": "Hello-world brick — returns the message it receives. Serves as a smoke test for the FocusMCP pipeline.",
      "tags": [
        "example",
        "smoke-test",
        "hello-world"
      ],
      "keywords": [
        "echo",
        "smoke-test",
        "hello-world",
        "canary",
        "template",
        "example"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "testing",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "say",
          "description": "Returns the received message as-is. Useful as a canary to verify FocusMCP correctly dispatches tool calls end-to-end.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string",
                "description": "Message to echo back"
              }
            },
            "required": [
              "message"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-echo"
      },
      "license": "MIT"
    },
    {
      "name": "filediff",
      "version": "1.1.1",
      "description": "File comparison — diff, patch, delta between files or versions.",
      "tags": [
        "file",
        "diff",
        "patch"
      ],
      "keywords": [
        "diff",
        "patch",
        "file-comparison",
        "unified-diff",
        "delta",
        "version-comparison"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "refactoring",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "diff",
          "description": "Compare two files and return unified diff",
          "inputSchema": {
            "type": "object",
            "properties": {
              "a": {
                "type": "string",
                "description": "Path to first file"
              },
              "b": {
                "type": "string",
                "description": "Path to second file"
              }
            },
            "required": [
              "a",
              "b"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "patch",
          "description": "Apply a unified diff patch to a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File to patch"
              },
              "patch": {
                "type": "string",
                "description": "Unified diff content"
              }
            },
            "required": [
              "path",
              "patch"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "delta",
          "description": "Show only changed lines between two strings (compact)",
          "inputSchema": {
            "type": "object",
            "properties": {
              "before": {
                "type": "string"
              },
              "after": {
                "type": "string"
              }
            },
            "required": [
              "before",
              "after"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-filediff"
      },
      "license": "MIT"
    },
    {
      "name": "filelist",
      "version": "1.1.1",
      "description": "List directory contents — entries, tree, glob, find.",
      "tags": [
        "file",
        "list",
        "directory"
      ],
      "keywords": [
        "directory-listing",
        "tree",
        "glob",
        "find",
        "filesystem",
        "file-discovery"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "list",
          "description": "List files and directories in a path",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute directory path"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "tree",
          "description": "Recursive directory tree",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "depth": {
                "type": "number",
                "description": "Max depth (default unlimited)"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "glob",
          "description": "Find files matching a glob pattern",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "pattern": {
                "type": "string",
                "description": "Glob pattern (e.g. *.ts)"
              }
            },
            "required": [
              "path",
              "pattern"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "find",
          "description": "Find files by name (substring match)",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "name": {
                "type": "string",
                "description": "Filename substring to match"
              }
            },
            "required": [
              "path",
              "name"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-filelist"
      },
      "license": "MIT"
    },
    {
      "name": "fileops",
      "version": "1.4.0",
      "description": "File operations — move, copy, delete, rename. Call fileops:setRoot first with the absolute path to your workspace, otherwise tools will fail-fast on the first non-existent path.",
      "tags": [
        "file",
        "move",
        "copy",
        "delete"
      ],
      "keywords": [
        "file-operations",
        "move",
        "copy",
        "delete",
        "rename",
        "filesystem"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "move",
          "description": "Move a file or directory to a new path. Requires fileops:setRoot to be called first with the workspace root path.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "from": {
                "type": "string",
                "description": "Source path"
              },
              "to": {
                "type": "string",
                "description": "Destination path"
              }
            },
            "required": [
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "copy",
          "description": "Copy a file to a new path. Requires fileops:setRoot to be called first with the workspace root path.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "from": {
                "type": "string"
              },
              "to": {
                "type": "string"
              }
            },
            "required": [
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "delete",
          "description": "Delete a file or empty directory. Requires fileops:setRoot to be called first with the workspace root path.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to delete"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "rename",
          "description": "Rename a file within its parent directory. Requires fileops:setRoot to be called first with the workspace root path.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Current file path"
              },
              "name": {
                "type": "string",
                "description": "New filename (not a full path)"
              }
            },
            "required": [
              "path",
              "name"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-fileops"
      },
      "license": "MIT"
    },
    {
      "name": "fileread",
      "version": "1.1.1",
      "description": "Read files — full, head, tail, line range, encoding detection.",
      "tags": [
        "file",
        "read",
        "io"
      ],
      "keywords": [
        "file-read",
        "head",
        "tail",
        "line-range",
        "encoding",
        "io"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "read",
          "description": "Read entire file content",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute file path"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "head",
          "description": "Read first N lines of a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "lines": {
                "type": "number",
                "description": "Number of lines (default 10)"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "tail",
          "description": "Read last N lines of a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "lines": {
                "type": "number",
                "description": "Number of lines (default 10)"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "range",
          "description": "Read specific line range from a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "from": {
                "type": "number",
                "description": "Start line (1-based)"
              },
              "to": {
                "type": "number",
                "description": "End line (inclusive)"
              }
            },
            "required": [
              "path",
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-fileread"
      },
      "license": "MIT"
    },
    {
      "name": "filesearch",
      "version": "1.1.1",
      "description": "Search and replace in files — regex search, in-place replace.",
      "tags": [
        "file",
        "search",
        "replace",
        "regex"
      ],
      "keywords": [
        "file-search",
        "regex-search",
        "replace",
        "glob",
        "in-place",
        "pattern"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "refactoring",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "search",
          "description": "Search for a regex pattern in files",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Directory to search in"
              },
              "pattern": {
                "type": "string",
                "description": "Regex pattern"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter (e.g. *.ts)"
              }
            },
            "required": [
              "path",
              "pattern"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "replace",
          "description": "Search and replace in a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "pattern": {
                "type": "string",
                "description": "Regex pattern to find"
              },
              "replacement": {
                "type": "string",
                "description": "Replacement string"
              }
            },
            "required": [
              "path",
              "pattern",
              "replacement"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-filesearch"
      },
      "license": "MIT"
    },
    {
      "name": "filesystem",
      "version": "1.1.1",
      "description": "Complete filesystem operations — loads fileread, filewrite, filelist, fileops, filesearch.",
      "tags": [
        "filesystem",
        "composite"
      ],
      "keywords": [
        "filesystem",
        "composite",
        "file-read",
        "file-write",
        "file-ops",
        "file-search"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [
        "fileread",
        "filewrite",
        "filelist",
        "fileops",
        "filesearch"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-filesystem"
      },
      "license": "MIT"
    },
    {
      "name": "filewrite",
      "version": "1.2.0",
      "description": "Write files — create, overwrite, append.",
      "tags": [
        "file",
        "write",
        "io"
      ],
      "keywords": [
        "file-write",
        "create",
        "append",
        "overwrite",
        "io",
        "filesystem"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "write",
          "description": "Write content to a file (creates or overwrites)",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute file path"
              },
              "content": {
                "type": "string",
                "description": "Content to write"
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "append",
          "description": "Append content to end of a file",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "content": {
                "type": "string"
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "create",
          "description": "Create a new file. Fails if the file already exists by default (safe). Pass options.force=true to overwrite an existing file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute file path"
              },
              "content": {
                "type": "string",
                "description": "Content to write"
              },
              "options": {
                "type": "object",
                "description": "Optional creation options",
                "properties": {
                  "force": {
                    "type": "boolean",
                    "description": "If true, overwrite the file if it already exists. Default: false."
                  }
                },
                "additionalProperties": false
              }
            },
            "required": [
              "path",
              "content"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-filewrite"
      },
      "license": "MIT"
    },
    {
      "name": "format",
      "version": "1.1.1",
      "description": "Format data into various output formats — pretty JSON, YAML, markdown, ASCII tables.",
      "tags": [
        "format",
        "json",
        "yaml",
        "markdown",
        "table",
        "output"
      ],
      "keywords": [
        "format",
        "json",
        "yaml",
        "markdown",
        "ascii-table",
        "pretty-print",
        "output"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "documentation"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "json",
          "description": "Format and pretty-print JSON with optional key sorting and field filtering.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "description": "JSON string to format"
              },
              "indent": {
                "type": "number",
                "description": "Number of spaces for indentation (default 2)"
              },
              "sortKeys": {
                "type": "boolean",
                "description": "Whether to sort object keys alphabetically"
              }
            },
            "required": [
              "data"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "yaml",
          "description": "Convert JSON data to YAML format.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "description": "JSON string to convert to YAML"
              }
            },
            "required": [
              "data"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "markdown",
          "description": "Convert structured JSON data to markdown (headings, lists, or table).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "description": "JSON string to convert to markdown"
              },
              "style": {
                "type": "string",
                "enum": [
                  "list",
                  "table",
                  "headings"
                ],
                "description": "Markdown style: list (default), table, or headings"
              }
            },
            "required": [
              "data"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "table",
          "description": "Format tabular data as an ASCII table with +--+ borders and optional column alignment.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "headers": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Column header labels"
              },
              "rows": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "description": "Table rows as arrays of cell strings"
              },
              "align": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "left",
                    "right",
                    "center"
                  ]
                },
                "description": "Per-column alignment (default: left)"
              }
            },
            "required": [
              "headers",
              "rows"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-format"
      },
      "license": "MIT"
    },
    {
      "name": "fts",
      "version": "1.1.2",
      "description": "Full-text search with TF-IDF ranking — index files, search with relevance scoring, suggest completions.",
      "tags": [
        "search",
        "fulltext",
        "tfidf",
        "index",
        "ranking"
      ],
      "keywords": [
        "full-text-search",
        "tfidf",
        "inverted-index",
        "ranking",
        "autocomplete",
        "suggest"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "documentation"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "index",
          "description": "Index a directory for full-text search. Reads supported files and builds an inverted index.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Directory to index"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter (default: *.ts,*.js,*.md,*.json)"
              },
              "maxFiles": {
                "type": "number",
                "description": "Max files to index (default 500)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "search",
          "description": "Search the index with a query. Returns ranked results with TF-IDF scores.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query (space-separated terms)"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 10)"
              }
            },
            "required": [
              "query"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "rank",
          "description": "Given a query and a list of file paths, rank them by relevance using the index.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "File paths to rank"
              }
            },
            "required": [
              "query",
              "files"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "suggest",
          "description": "Auto-complete a partial query using indexed terms.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "prefix": {
                "type": "string",
                "description": "Partial term to complete"
              },
              "limit": {
                "type": "number",
                "description": "Max suggestions (default 5)"
              }
            },
            "required": [
              "prefix"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-fts"
      },
      "license": "MIT"
    },
    {
      "name": "fullaudit",
      "version": "1.1.0",
      "description": "Full project audit workflow — code quality review, security scan, architecture analysis, and metrics report.",
      "tags": [
        "audit",
        "workflow",
        "quality",
        "security"
      ],
      "keywords": [
        "audit",
        "code-quality",
        "security",
        "architecture",
        "static-analysis",
        "report"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "security",
        "analysis"
      ],
      "dependencies": [
        "codebase",
        "review",
        "metrics"
      ],
      "tools": [
        {
          "name": "run",
          "description": "Run a full audit on a project directory — code quality, security, architecture patterns.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Project root directory"
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Checks to run: 'code', 'security', 'architecture' (default: all)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "report",
          "description": "Generate a markdown audit report from the last run.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "format": {
                "type": "string",
                "description": "'markdown', 'json', or 'summary' (default 'markdown')"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-fullaudit"
      },
      "license": "MIT"
    },
    {
      "name": "graphbuild",
      "version": "1.1.0",
      "description": "Knowledge graph builder — construct a graph of code entities (files, functions, types) and their relationships.",
      "tags": [
        "graph",
        "knowledge",
        "codebase",
        "relationships"
      ],
      "keywords": [
        "knowledge-graph",
        "graph-builder",
        "code-entities",
        "relationships",
        "imports",
        "exports"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "refactoring"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "build",
          "description": "Build a knowledge graph from a directory by scanning imports, exports, and call sites.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "maxFiles": {
                "type": "number",
                "description": "Max files to scan (default 200)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "update",
          "description": "Incrementally update the graph for changed files without full rebuild.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Changed file paths to re-scan"
              }
            },
            "required": [
              "files"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "watch",
          "description": "Return graph stats and detect stale nodes (files that no longer exist).",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "add",
          "description": "Manually add a node or edge to the graph.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "node": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  }
                },
                "description": "Node to add"
              },
              "edge": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string"
                  },
                  "to": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string"
                  }
                },
                "description": "Edge to add"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "multimodal",
          "description": "Return the graph in multiple formats: summary stats, node list, edge list.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "format": {
                "type": "string",
                "description": "Output format: 'summary', 'nodes', 'edges', 'full' (default 'summary')"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-graphbuild"
      },
      "license": "MIT"
    },
    {
      "name": "graphcluster",
      "version": "1.1.0",
      "description": "Graph clustering — detect communities, explain groupings, identify architecture layers.",
      "tags": [
        "graph",
        "cluster",
        "community",
        "architecture",
        "analysis"
      ],
      "keywords": [
        "graph-clustering",
        "community-detection",
        "label-propagation",
        "architecture-layers",
        "analysis"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "refactoring",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "cluster",
          "description": "Detect clusters of tightly connected nodes using label propagation algorithm.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "maxClusters": {
                "type": "number",
                "description": "Max clusters to detect (default 10)"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "communities",
          "description": "List all detected communities with their members and interconnection density.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "minSize": {
                "type": "number",
                "description": "Minimum community size (default 2)"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "explain",
          "description": "Explain a cluster — what connects its members, common types, shared dependencies.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "clusterId": {
                "type": "number",
                "description": "Cluster index from cluster results"
              }
            },
            "required": [
              "clusterId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "architecture",
          "description": "Detect architecture layers — group nodes by directory depth and dependency direction (top-down).",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-graphcluster"
      },
      "license": "MIT"
    },
    {
      "name": "graphexport",
      "version": "1.2.0",
      "description": "Generate visualizations from a provided or upstream graph. For upstream graphs, use with graphbuild/callgraph/depgraph first. Alternatively, load an inline graph via ge_input(graph) to use standalone.",
      "tags": [
        "graph",
        "export",
        "mermaid",
        "graphml",
        "cypher",
        "obsidian"
      ],
      "keywords": [
        "graph-export",
        "mermaid",
        "graphml",
        "cypher",
        "neo4j",
        "obsidian",
        "visualization"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "documentation",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "input",
          "description": "Load an inline graph (nodes + edges JSON) into ambient state for subsequent export tools. Use this to make graphexport standalone without an upstream graphbuild/callgraph/depgraph brick.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "graph": {
                "type": "object",
                "description": "Inline graph with nodes and edges arrays",
                "properties": {
                  "nodes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "label",
                        "type"
                      ]
                    }
                  },
                  "edges": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "from": {
                          "type": "string"
                        },
                        "to": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "from",
                        "to",
                        "type"
                      ]
                    }
                  }
                },
                "required": [
                  "nodes",
                  "edges"
                ]
              }
            },
            "required": [
              "graph"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "html",
          "description": "Export graph as a standalone HTML page with a simple SVG visualization. Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "Page title (default 'Knowledge Graph')"
              },
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "mermaid",
          "description": "Export graph as Mermaid diagram syntax. Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "direction": {
                "type": "string",
                "description": "TB, LR, BT, RL (default TB)"
              },
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "graphml",
          "description": "Export graph as GraphML XML format. Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "cypher",
          "description": "Export graph as Cypher CREATE statements (Neo4j compatible). Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "obsidian",
          "description": "Export graph as Obsidian-compatible markdown files with [[wikilinks]]. Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "wiki",
          "description": "Export graph as a single wiki-style markdown document with sections per node. Pass graph inline or rely on upstream graphbuild/callgraph/depgraph context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "graph": {
                "type": "object",
                "description": "Optional inline graph (overrides upstream context)",
                "properties": {
                  "nodes": {
                    "type": "array"
                  },
                  "edges": {
                    "type": "array"
                  }
                }
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-graphexport"
      },
      "license": "MIT"
    },
    {
      "name": "graphquery",
      "version": "1.1.0",
      "description": "Knowledge graph query — find nodes, traverse neighbors, find paths, filter by type.",
      "tags": [
        "graph",
        "query",
        "traversal",
        "path",
        "knowledge"
      ],
      "keywords": [
        "graph-query",
        "traversal",
        "shortest-path",
        "bfs",
        "subgraph",
        "neighbors"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "refactoring"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "query",
          "description": "Query the graph with a pattern — find nodes by type, label substring, or connected to a specific node.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "pattern": {
                "type": "string",
                "description": "Search pattern (substring match on label)"
              },
              "type": {
                "type": "string",
                "description": "Filter by node type"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 20)"
              }
            },
            "required": [
              "pattern"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "node",
          "description": "Get full details of a specific node by ID, including all edges.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Node ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "neighbors",
          "description": "Find all nodes connected to a given node (incoming and outgoing edges).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Node ID"
              },
              "direction": {
                "type": "string",
                "description": "'in', 'out', or 'both' (default 'both')"
              },
              "edgeType": {
                "type": "string",
                "description": "Filter by edge type"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "path",
          "description": "Find shortest path between two nodes using BFS.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "from": {
                "type": "string",
                "description": "Start node ID"
              },
              "to": {
                "type": "string",
                "description": "End node ID"
              },
              "maxDepth": {
                "type": "number",
                "description": "Max path length (default 5)"
              }
            },
            "required": [
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "filter",
          "description": "Filter the graph to a subgraph matching criteria (node types, edge types).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "nodeTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Keep only these node types"
              },
              "edgeTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Keep only these edge types"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-graphquery"
      },
      "license": "MIT"
    },
    {
      "name": "heatmap",
      "version": "1.1.0",
      "description": "File access heatmap — track read/write patterns, detect hot and cold files.",
      "tags": [
        "heatmap",
        "tracking",
        "patterns",
        "files",
        "analysis"
      ],
      "keywords": [
        "heatmap",
        "file-access",
        "hot-files",
        "cold-files",
        "access-patterns",
        "tracking"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "performance",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "track",
          "description": "Record a file access (read or write) with the current timestamp.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute or relative path of the accessed file"
              },
              "type": {
                "type": "string",
                "enum": [
                  "read",
                  "write"
                ],
                "description": "Access type: 'read' or 'write'"
              }
            },
            "required": [
              "file",
              "type"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "hotfiles",
          "description": "Return the most frequently accessed files, optionally filtered by access type.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "type": "number",
                "description": "Maximum number of files to return (default 10)"
              },
              "type": {
                "type": "string",
                "enum": [
                  "read",
                  "write"
                ],
                "description": "Filter by access type (omit for combined count)"
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        {
          "name": "patterns",
          "description": "Detect access patterns — files commonly accessed together within 1 second of each other.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "required": [],
            "additionalProperties": false
          }
        },
        {
          "name": "coldfiles",
          "description": "Find files that have not been accessed within a given time threshold.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "threshold": {
                "type": "number",
                "description": "Inactivity threshold in milliseconds (default 3600000 = 1 hour)"
              }
            },
            "required": [],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-heatmap"
      },
      "license": "MIT"
    },
    {
      "name": "impact",
      "version": "1.1.0",
      "description": "Change impact analysis — given a file or symbol, find what files are affected by a change.",
      "tags": [
        "impact",
        "dependencies",
        "analysis",
        "refactoring"
      ],
      "keywords": [
        "impact-analysis",
        "change-propagation",
        "dependents",
        "affected-files",
        "dependency-graph"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "refactoring",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "analyze",
          "description": "Analyze impact of changing a file: find direct and indirect dependents.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute path to the changed file"
              },
              "dir": {
                "type": "string",
                "description": "Root directory of the project"
              }
            },
            "required": [
              "file",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "affected",
          "description": "List all files affected by changes to the given set of files.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of changed file paths"
              },
              "dir": {
                "type": "string",
                "description": "Root directory of the project"
              }
            },
            "required": [
              "files",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "propagate",
          "description": "Trace how a change propagates through the dependency graph.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute path to the changed file"
              },
              "dir": {
                "type": "string",
                "description": "Root directory of the project"
              },
              "maxDepth": {
                "type": "number",
                "description": "Max propagation depth (default 3)"
              }
            },
            "required": [
              "file",
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-impact"
      },
      "license": "MIT"
    },
    {
      "name": "inline",
      "version": "1.1.0",
      "description": "Inline, extract, and move refactoring — inline variables/functions, extract code to new functions, move between files.",
      "tags": [
        "inline",
        "extract",
        "move",
        "refactoring",
        "codemod"
      ],
      "keywords": [
        "inline",
        "extract-function",
        "move-symbol",
        "refactoring",
        "codemod",
        "variable-inline"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "refactoring",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "inline",
          "description": "Inline a variable or simple function — replace all usages with the definition, then remove the definition.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "name": {
                "type": "string",
                "description": "Variable or function name to inline"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              }
            },
            "required": [
              "path",
              "name"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "extract",
          "description": "Extract lines from a file into a new named function. The original lines are replaced with a call.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "File path"
              },
              "startLine": {
                "type": "number",
                "description": "Start line (1-based)"
              },
              "endLine": {
                "type": "number",
                "description": "End line (1-based, inclusive)"
              },
              "functionName": {
                "type": "string",
                "description": "Name for the extracted function"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              }
            },
            "required": [
              "path",
              "startLine",
              "endLine",
              "functionName"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "move",
          "description": "Move a function or export from one file to another, updating imports in both files.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "sourcePath": {
                "type": "string",
                "description": "Source file path"
              },
              "targetPath": {
                "type": "string",
                "description": "Target file path"
              },
              "name": {
                "type": "string",
                "description": "Function/export name to move"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              }
            },
            "required": [
              "sourcePath",
              "targetPath",
              "name"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-inline"
      },
      "license": "MIT"
    },
    {
      "name": "knowledge",
      "version": "1.1.0",
      "description": "Knowledge base — index documents, search by content, fetch entries, purge stale data, rank by relevance.",
      "tags": [
        "knowledge",
        "search",
        "index",
        "documents",
        "knowledgebase"
      ],
      "keywords": [
        "knowledge-base",
        "document-index",
        "search",
        "rank",
        "purge",
        "retrieval"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "documentation",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "index",
          "description": "Index a document or note into the knowledge base with tags and metadata.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "Document title"
              },
              "content": {
                "type": "string",
                "description": "Document content"
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Tags for categorization"
              },
              "source": {
                "type": "string",
                "description": "Source reference (URL, file path, etc.)"
              }
            },
            "required": [
              "title",
              "content"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "search",
          "description": "Search the knowledge base by query. Returns ranked results.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Filter by tags"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 10)"
              }
            },
            "required": [
              "query"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "fetch",
          "description": "Fetch a specific knowledge entry by ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Entry ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "purge",
          "description": "Remove entries older than a given age or matching specific tags.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "olderThanDays": {
                "type": "number",
                "description": "Remove entries older than N days"
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Remove entries with these tags"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "rank",
          "description": "Re-rank existing search results by additional criteria (recency, tag match, content length).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "boost": {
                "type": "string",
                "description": "Boost factor: 'recency', 'tags', 'length' (default 'recency')"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 10)"
              }
            },
            "required": [
              "query"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-knowledge"
      },
      "license": "MIT"
    },
    {
      "name": "knowledgebase",
      "version": "1.1.1",
      "description": "Knowledge base — loads knowledge, fts, graphbuild, graphquery for document indexing and graph-powered search.",
      "tags": [
        "knowledgebase",
        "composite",
        "search",
        "graph"
      ],
      "keywords": [
        "knowledgebase",
        "composite",
        "document-search",
        "graph-powered",
        "fts",
        "knowledge"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "documentation",
        "backend"
      ],
      "dependencies": [
        "knowledge",
        "fts",
        "graphbuild",
        "graphquery"
      ],
      "tools": [],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-knowledgebase"
      },
      "license": "MIT"
    },
    {
      "name": "lastversion",
      "version": "1.2.2",
      "description": "Package version intelligence — latest version, diff, changelog, audit across npm/pypi/github/gitlab.",
      "tags": [
        "version",
        "release",
        "npm",
        "pypi",
        "github",
        "audit",
        "security",
        "updates"
      ],
      "keywords": [
        "version-check",
        "changelog",
        "security-audit",
        "semver",
        "outdated",
        "npm",
        "pypi"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "security",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "latest",
          "description": "Get the latest version of a package with metadata (date, deprecated flag, LTS flag, audit count).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string",
                "description": "Source: npm, pypi, github, gitlab, cargo, rubygems, gomod"
              },
              "target": {
                "type": "string",
                "description": "Package name or owner/repo (for github/gitlab)"
              },
              "includePrerelease": {
                "type": "boolean",
                "description": "Include pre-releases (alpha/beta/rc). Default false."
              }
            },
            "required": [
              "source",
              "target"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "versions",
          "description": "List recent versions of a package, optionally filtered by semver range or stable-only.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string",
                "description": "Source: npm, pypi, github, gitlab"
              },
              "target": {
                "type": "string",
                "description": "Package name or owner/repo"
              },
              "range": {
                "type": "string",
                "description": "Semver range (e.g. '>=18.0.0')"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 20)"
              },
              "stable": {
                "type": "boolean",
                "description": "Stable only (filter pre-releases). Default true."
              }
            },
            "required": [
              "source",
              "target"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "diff",
          "description": "Compare two versions: bump type (patch/minor/major/breaking), days between, breaking change hints.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string",
                "description": "Source: npm, pypi, github, gitlab"
              },
              "target": {
                "type": "string",
                "description": "Package name or owner/repo"
              },
              "from": {
                "type": "string",
                "description": "Source version"
              },
              "to": {
                "type": "string",
                "description": "Target version"
              }
            },
            "required": [
              "source",
              "target",
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "changelog",
          "description": "Fetch release notes aggregated between two versions (from GitHub Releases API).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "repo": {
                "type": "string",
                "description": "GitHub repo owner/name"
              },
              "from": {
                "type": "string",
                "description": "Start version (tag)"
              },
              "to": {
                "type": "string",
                "description": "End version (tag). Default: latest."
              },
              "limit": {
                "type": "number",
                "description": "Max releases to return (default 20)"
              }
            },
            "required": [
              "repo"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "check",
          "description": "Check if a currently installed version is outdated. Returns staleness analysis with bump type and days behind.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string",
                "description": "Source: npm, pypi, github, gitlab"
              },
              "target": {
                "type": "string",
                "description": "Package name or owner/repo"
              },
              "current": {
                "type": "string",
                "description": "Currently installed version"
              }
            },
            "required": [
              "source",
              "target",
              "current"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "audit",
          "description": "Fetch security advisories for a package version (GitHub Advisory DB via OSV.dev). Returns top 10 entries by severity DESC.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string",
                "description": "Source: npm, pypi, github, cargo, gomod"
              },
              "target": {
                "type": "string",
                "description": "Package name"
              },
              "version": {
                "type": "string",
                "description": "Specific version to check (optional)"
              }
            },
            "required": [
              "source",
              "target"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-lastversion"
      },
      "license": "MIT"
    },
    {
      "name": "memory",
      "version": "1.1.2",
      "description": "Persistent key-value memory — store and recall information across sessions as JSON files.",
      "tags": [
        "memory",
        "storage",
        "persistence",
        "key-value"
      ],
      "keywords": [
        "memory",
        "key-value",
        "persistence",
        "store",
        "recall",
        "sessions"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "multi-agent",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "store",
          "description": "Save a key-value pair to persistent memory.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "description": "Memory key"
              },
              "value": {
                "type": "string",
                "description": "Value to store"
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Optional tags for categorization"
              }
            },
            "required": [
              "key",
              "value"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "recall",
          "description": "Get a value by key from persistent memory.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "description": "Memory key"
              }
            },
            "required": [
              "key"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "search",
          "description": "Search memories by query (substring match on key, value, and tags).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 10)"
              }
            },
            "required": [
              "query"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "forget",
          "description": "Delete a memory entry by key.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "description": "Memory key to delete"
              }
            },
            "required": [
              "key"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "list",
          "description": "List all memory keys, optionally filtered by tag. Returns up to 100 entries by default; set limit=0 for unlimited.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "tag": {
                "type": "string",
                "description": "Filter by tag (optional)"
              },
              "limit": {
                "type": "number",
                "description": "Max entries to return (default 100, set 0 for unlimited)"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-memory"
      },
      "license": "MIT"
    },
    {
      "name": "metrics",
      "version": "1.2.1",
      "description": "Session metrics tracking — token usage, costs, duration, and per-tool statistics.",
      "tags": [
        "metrics",
        "tokens",
        "costs",
        "duration",
        "session",
        "observability"
      ],
      "keywords": [
        "metrics",
        "token-usage",
        "cost-tracking",
        "duration",
        "session-stats",
        "observability"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "performance"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "session",
          "description": "Get or reset session metrics summary.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "reset": {
                "type": "boolean",
                "description": "If true, reset all session metrics and return empty summary."
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "tokens",
          "description": "Track token usage — record input/output tokens per tool call.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "tool": {
                "type": "string",
                "description": "Name of the tool call being recorded."
              },
              "inputTokens": {
                "type": "number",
                "description": "Number of input tokens consumed."
              },
              "outputTokens": {
                "type": "number",
                "description": "Number of output tokens produced."
              }
            },
            "required": [
              "tool",
              "inputTokens",
              "outputTokens"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "costs",
          "description": "Calculate estimated costs based on token usage and model pricing.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "inputPricePer1k": {
                "type": "number",
                "description": "Cost per 1 000 input tokens in USD. Default: 0.003."
              },
              "outputPricePer1k": {
                "type": "number",
                "description": "Cost per 1 000 output tokens in USD. Default: 0.015."
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "duration",
          "description": "Track and report tool call durations.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "tool": {
                "type": "string",
                "description": "Filter duration stats to a specific tool name."
              },
              "last": {
                "type": "number",
                "description": "Return stats for the last N tool calls."
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-metrics"
      },
      "license": "MIT"
    },
    {
      "name": "multiread",
      "version": "1.1.1",
      "description": "Batch file reading — multiple files in one call, deduplication.",
      "tags": [
        "file",
        "read",
        "batch",
        "tokens"
      ],
      "keywords": [
        "multi-read",
        "batch-read",
        "deduplication",
        "merge",
        "file-io",
        "token-saving"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "batch",
          "description": "Read multiple files in one call",
          "inputSchema": {
            "type": "object",
            "properties": {
              "paths": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths to read"
              }
            },
            "required": [
              "paths"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "dedup",
          "description": "Read multiple files, deduplicate shared imports/headers",
          "inputSchema": {
            "type": "object",
            "properties": {
              "paths": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "paths"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "merge",
          "description": "Read and concatenate files with separators",
          "inputSchema": {
            "type": "object",
            "properties": {
              "paths": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "separator": {
                "type": "string",
                "description": "Separator between files (default: filename header)"
              }
            },
            "required": [
              "paths"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-multiread"
      },
      "license": "MIT"
    },
    {
      "name": "onboarding",
      "version": "1.1.1",
      "description": "Project onboarding workflow — auto-discover project structure, conventions, and key files for a new contributor or AI agent.",
      "tags": [
        "onboarding",
        "workflow",
        "project",
        "guide"
      ],
      "keywords": [
        "onboarding",
        "project-scan",
        "conventions",
        "contributor-guide",
        "discovery",
        "workflow"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "analysis",
        "documentation"
      ],
      "dependencies": [
        "codebase",
        "smartcontext",
        "overview"
      ],
      "tools": [
        {
          "name": "scan",
          "description": "Full project onboarding scan — detect framework, architecture, conventions, key files, and build a context summary.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Project root directory"
              },
              "budget": {
                "type": "number",
                "description": "Token budget for context (default 4000)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "guide",
          "description": "Generate a contributor guide based on scan results — what to read first, coding standards, key patterns.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Project root directory"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-onboarding"
      },
      "license": "MIT"
    },
    {
      "name": "outline",
      "version": "1.2.1",
      "description": "File and repo structure outline — list exported symbols and directory trees without reading full content.",
      "tags": [
        "outline",
        "symbols",
        "structure",
        "navigation"
      ],
      "keywords": [
        "outline",
        "structure",
        "ast",
        "navigation",
        "symbols",
        "file-structure",
        "repo-overview"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "file",
          "description": "Outline a single file: list exported symbols with line numbers, no body.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to file"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "repo",
          "description": "Outline entire repo: per-file symbol summary.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "maxFiles": {
                "type": "number",
                "description": "Max files to scan (default 100)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "structure",
          "description": "Directory structure with file counts per folder.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "maxDepth": {
                "type": "number",
                "description": "Max depth (default 3)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-outline"
      },
      "license": "MIT"
    },
    {
      "name": "overview",
      "version": "1.1.1",
      "description": "Project-level understanding without reading all files — detect framework, language, conventions, and architecture.",
      "tags": [
        "overview",
        "project",
        "architecture",
        "conventions"
      ],
      "keywords": [
        "project-overview",
        "framework-detection",
        "conventions",
        "architecture",
        "dependencies"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "analysis",
        "documentation"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "project",
          "description": "Scan root dir and detect project metadata: name, framework, language, type, scripts, packageManager.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "architecture",
          "description": "Scan directory structure, count files per folder, detect architectural patterns.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "maxDepth": {
                "type": "number",
                "description": "Max directory depth (default 3)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "conventions",
          "description": "Read sample files and detect coding conventions: indent, quotes, semicolons, import style.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "dependencies",
          "description": "Parse package.json and categorize dependencies: production, dev, framework, testRunner, linter, bundler.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory containing package.json"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-overview"
      },
      "license": "MIT"
    },
    {
      "name": "parallel",
      "version": "1.3.0",
      "description": "Parallel execution coordination — run tasks concurrently, collect results, merge outputs, handle timeouts.",
      "tags": [
        "parallel",
        "concurrent",
        "merge",
        "orchestration"
      ],
      "keywords": [
        "parallel",
        "concurrency",
        "collect",
        "merge",
        "timeout",
        "orchestration"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "devops"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "run",
          "description": "Run multiple shell commands in parallel with concurrency control.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "tasks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "command": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "command"
                  ]
                },
                "description": "Tasks to run"
              },
              "concurrency": {
                "type": "number",
                "description": "Max concurrent tasks (default: all)"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              }
            },
            "required": [
              "tasks"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "collect",
          "description": "Collect and aggregate results from a previous parallel run.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "runId": {
                "type": "string",
                "description": "Run ID from a previous par_run call"
              }
            },
            "required": [
              "runId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "merge",
          "description": "Merge multiple text outputs into one, with separators and optional dedup.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "outputs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "content": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "content"
                  ]
                },
                "description": "Outputs to merge"
              },
              "separator": {
                "type": "string",
                "description": "Separator between outputs (default: newline)"
              },
              "dedup": {
                "type": "boolean",
                "description": "Remove duplicate lines (default false)"
              }
            },
            "required": [
              "outputs"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "timeout",
          "description": "Set or check timeout configuration for parallel runs.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "defaultMs": {
                "type": "number",
                "description": "Default timeout per task in ms"
              },
              "runId": {
                "type": "string",
                "description": "Check timeout status of a run"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "run_inline",
          "description": "Run parallel tasks and return results inline in a single response (combines run + collect, avoids 2 round-trips). Use this when you need results immediately rather than polling collect later.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "tasks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "command": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "command"
                  ]
                },
                "description": "Tasks to run"
              },
              "concurrency": {
                "type": "number",
                "description": "Max concurrent tasks (default: all)"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              }
            },
            "required": [
              "tasks"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-parallel"
      },
      "license": "MIT"
    },
    {
      "name": "planning",
      "version": "1.1.0",
      "description": "Structured planning — create plans with steps, dependencies, and time estimates.",
      "tags": [
        "planning",
        "steps",
        "dependencies",
        "estimation",
        "workflow"
      ],
      "keywords": [
        "planning",
        "steps",
        "dependency-graph",
        "time-estimate",
        "project-management",
        "workflow"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "backend",
        "multi-agent"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "create",
          "description": "Create a new plan with a title and optional description.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "Plan title"
              },
              "description": {
                "type": "string",
                "description": "Plan description"
              }
            },
            "required": [
              "title"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "steps",
          "description": "Add or list steps in a plan. Each step has a title, optional estimate, and status.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "planId": {
                "type": "string",
                "description": "Plan ID"
              },
              "add": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "estimate": {
                      "type": "string",
                      "description": "Time estimate (e.g. '2h', '30m')"
                    }
                  },
                  "required": [
                    "title"
                  ]
                },
                "description": "Steps to add"
              },
              "complete": {
                "type": "number",
                "description": "Mark step at this index as done"
              }
            },
            "required": [
              "planId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "dependencies",
          "description": "Define dependencies between steps — step B depends on step A.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "planId": {
                "type": "string",
                "description": "Plan ID"
              },
              "from": {
                "type": "number",
                "description": "Step index that must complete first"
              },
              "to": {
                "type": "number",
                "description": "Step index that depends on 'from'"
              }
            },
            "required": [
              "planId",
              "from",
              "to"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "estimate",
          "description": "Get plan summary — total steps, completed, blocked, estimated time remaining.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "planId": {
                "type": "string",
                "description": "Plan ID"
              }
            },
            "required": [
              "planId"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-planning"
      },
      "license": "MIT"
    },
    {
      "name": "refs",
      "version": "1.2.1",
      "description": "Cross-references — find who imports or uses a symbol, locate declarations, and trace inheritance chains.",
      "tags": [
        "references",
        "cross-references",
        "symbols",
        "navigation"
      ],
      "keywords": [
        "code-navigation",
        "references",
        "symbols",
        "code-intel",
        "cross-references",
        "declarations",
        "inheritance"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust",
        "java"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "references",
          "description": "Find all files that import or reference a symbol name.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Symbol name to search for"
              },
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "implementations",
          "description": "Find implementations of an interface or type.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Interface or type name"
              },
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "declaration",
          "description": "Find where a symbol is declared or exported.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Symbol name"
              },
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "hierarchy",
          "description": "Class or interface inheritance chain.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Class or interface name"
              },
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-refs"
      },
      "license": "MIT"
    },
    {
      "name": "rename",
      "version": "1.1.1",
      "description": "Rename refactoring — rename symbols across files, rename files with import updates, bulk rename with preview.",
      "tags": [
        "rename",
        "refactoring",
        "symbol",
        "codemod"
      ],
      "keywords": [
        "rename",
        "symbol-rename",
        "bulk-rename",
        "import-update",
        "dry-run",
        "refactoring"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "refactoring",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "symbol",
          "description": "Rename a symbol (function, variable, class, type) across all files in a directory. Dry run by default.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to search"
              },
              "oldName": {
                "type": "string",
                "description": "Current symbol name"
              },
              "newName": {
                "type": "string",
                "description": "New symbol name"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false = dry run)"
              }
            },
            "required": [
              "dir",
              "oldName",
              "newName"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "file",
          "description": "Rename a file and update all imports referencing it across the project.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Current file path"
              },
              "newName": {
                "type": "string",
                "description": "New filename (just the name, not full path)"
              },
              "dir": {
                "type": "string",
                "description": "Project root to update imports in"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              }
            },
            "required": [
              "path",
              "newName"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "bulk",
          "description": "Rename multiple symbols at once. Useful for coordinated renames.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory"
              },
              "renames": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "oldName": {
                      "type": "string"
                    },
                    "newName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "oldName",
                    "newName"
                  ]
                },
                "description": "List of renames"
              },
              "apply": {
                "type": "boolean",
                "description": "Apply changes (default false)"
              }
            },
            "required": [
              "dir",
              "renames"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "preview",
          "description": "Preview what a symbol rename would change without any mutation. Shows affected files and line numbers.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory"
              },
              "oldName": {
                "type": "string",
                "description": "Symbol to search for"
              }
            },
            "required": [
              "dir",
              "oldName"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-rename"
      },
      "license": "MIT"
    },
    {
      "name": "repos",
      "version": "1.1.1",
      "description": "Multi-repo management — register, track, and get stats for multiple repositories.",
      "tags": [
        "repos",
        "multi-repo",
        "management",
        "stats"
      ],
      "keywords": [
        "multi-repo",
        "repository-management",
        "register",
        "stats",
        "monorepo",
        "workspace"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "devops",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "list",
          "description": "List all registered repositories.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "register",
          "description": "Register a repository path by name.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Repository name"
              },
              "path": {
                "type": "string",
                "description": "Absolute path to the repository"
              }
            },
            "required": [
              "name",
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "unregister",
          "description": "Remove a registered repository.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Repository name to remove"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "stats",
          "description": "Get file and line count statistics for a registered repository.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Repository name"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-repos"
      },
      "license": "MIT"
    },
    {
      "name": "research",
      "version": "1.1.1",
      "description": "Multi-source research — collect info from multiple files/sources, synthesize findings, validate consistency.",
      "tags": [
        "research",
        "multisource",
        "synthesize",
        "validate",
        "analysis"
      ],
      "keywords": [
        "research",
        "multi-source",
        "synthesize",
        "consistency-check",
        "cross-file",
        "analysis"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "refactoring"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "multisource",
          "description": "Read multiple files and extract key information (exports, types, patterns) from each.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "paths": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Absolute paths to the files to read and analyze"
              }
            },
            "required": [
              "paths"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "synthesize",
          "description": "Combine findings from multiple sources into a structured summary.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "sources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "path": {
                      "type": "string"
                    },
                    "exports": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "imports": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "types": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "functions": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "path",
                    "exports",
                    "imports",
                    "types",
                    "functions"
                  ],
                  "additionalProperties": false
                },
                "description": "Array of source analysis objects from multisource"
              }
            },
            "required": [
              "sources"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "validate",
          "description": "Cross-check findings for consistency — conflicting types, unused exports, missing dependencies.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "sources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "path": {
                      "type": "string"
                    },
                    "exports": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "imports": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "types": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "functions": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "path",
                    "exports",
                    "imports",
                    "types",
                    "functions"
                  ],
                  "additionalProperties": false
                },
                "description": "Array of source analysis objects from multisource"
              }
            },
            "required": [
              "sources"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-research"
      },
      "license": "MIT"
    },
    {
      "name": "review",
      "version": "1.1.0",
      "description": "Structured code review — analyze code quality, security, architecture patterns, compare versions.",
      "tags": [
        "review",
        "code-quality",
        "security",
        "architecture",
        "diff"
      ],
      "keywords": [
        "code-review",
        "security-scan",
        "architecture-review",
        "compare",
        "quality",
        "owasp"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "security",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "code",
          "description": "Review a file for code quality — complexity, naming, patterns. Returns findings.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to the file to review"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "security",
          "description": "Review a file for security issues — hardcoded secrets, eval, SQL injection patterns.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to the file to review"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "architecture",
          "description": "Review directory structure for architecture patterns (layers, modules, coupling).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Absolute path to the directory to review"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "compare",
          "description": "Compare two file versions and list what changed (additions, removals, modifications).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "pathA": {
                "type": "string",
                "description": "Absolute path to the first (original) file"
              },
              "pathB": {
                "type": "string",
                "description": "Absolute path to the second (modified) file"
              }
            },
            "required": [
              "pathA",
              "pathB"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-review"
      },
      "license": "MIT"
    },
    {
      "name": "routes",
      "version": "1.1.0",
      "description": "API route detection — scan projects for Express, Fastify, Next.js, SvelteKit route definitions.",
      "tags": [
        "routes",
        "api",
        "endpoints",
        "express",
        "web"
      ],
      "keywords": [
        "api-routes",
        "endpoints",
        "express",
        "fastify",
        "next.js",
        "sveltekit",
        "http"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "backend",
        "frontend",
        "next.js",
        "express"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "scan",
          "description": "Scan a project directory and detect all API routes/endpoints with HTTP methods.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "framework": {
                "type": "string",
                "description": "Force framework (express, fastify, nextjs, sveltekit). Auto-detects if omitted."
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "search",
          "description": "Search routes by path pattern or HTTP method.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory"
              },
              "pattern": {
                "type": "string",
                "description": "Path pattern to search (e.g. '/api/user')"
              },
              "method": {
                "type": "string",
                "description": "HTTP method filter (GET, POST, etc.)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "list",
          "description": "List all detected routes in a compact table format.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "frameworks",
          "description": "Detect which web frameworks are used in the project.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-routes"
      },
      "license": "MIT"
    },
    {
      "name": "sandbox",
      "version": "1.2.2",
      "description": "Sandboxed code execution — run JavaScript/TypeScript snippets in an isolated VM context.",
      "tags": [
        "sandbox",
        "execution",
        "vm",
        "javascript",
        "typescript",
        "devtools"
      ],
      "keywords": [
        "sandbox",
        "vm",
        "isolated-execution",
        "eval",
        "code-runner",
        "esbuild"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "testing",
        "devops",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "run",
          "description": "Execute a JavaScript or TypeScript snippet in a sandboxed VM context. TypeScript is auto-transpiled via esbuild. Returns the result of the last expression.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "description": "JavaScript or TypeScript code to execute"
              },
              "timeout": {
                "type": "number",
                "description": "Execution timeout in ms (default 5000)"
              }
            },
            "required": [
              "code"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "file",
          "description": "Read a file and execute it in the sandbox. Returns the module exports or last expression.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Path to JS/TS file to execute"
              },
              "timeout": {
                "type": "number",
                "description": "Execution timeout in ms (default 5000)"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "eval",
          "description": "Evaluate a JavaScript or TypeScript expression and return its value. Lighter than run — single expression only. TypeScript is auto-transpiled via esbuild.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "expression": {
                "type": "string",
                "description": "JavaScript or TypeScript expression to evaluate"
              },
              "timeout": {
                "type": "number",
                "description": "Timeout in ms (default 2000)"
              }
            },
            "required": [
              "expression"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "languages",
          "description": "List supported languages and their status.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "read",
          "description": "Read a file from the current working directory (bounded — no absolute paths, no ../ escapes). Returns the file contents as a string. Use this to load source files from the codebase before processing them in the sandbox.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Relative path to the file within the working directory (e.g. 'src/utils.ts'). Absolute paths and directory traversal are rejected."
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-sandbox"
      },
      "license": "MIT"
    },
    {
      "name": "savings",
      "version": "1.1.0",
      "description": "Track and report token savings — compare FocusMCP usage vs naive full-read, trend over time, ROI.",
      "tags": [
        "savings",
        "tokens",
        "roi",
        "metrics",
        "efficiency"
      ],
      "keywords": [
        "token-savings",
        "roi",
        "efficiency",
        "benchmark",
        "trend",
        "cost-comparison"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "analysis",
        "performance",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "report",
          "description": "Generate a savings report — tokens saved vs baseline for a session.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "baselineTokens": {
                "type": "number",
                "description": "Token count for naive full-read baseline"
              },
              "actualTokens": {
                "type": "number",
                "description": "Token count actually consumed by FocusMCP"
              },
              "duration": {
                "type": "number",
                "description": "Session duration in milliseconds (optional)"
              }
            },
            "required": [
              "baselineTokens",
              "actualTokens"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "compare",
          "description": "Compare two sessions' efficiency — which saved more tokens.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "sessionA": {
                "type": "string",
                "description": "ID of the first session to compare"
              },
              "sessionB": {
                "type": "string",
                "description": "ID of the second session to compare"
              }
            },
            "required": [
              "sessionA",
              "sessionB"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "trend",
          "description": "Show savings trend over multiple sessions — running average and direction.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "last": {
                "type": "number",
                "description": "Number of most recent sessions to include (default: all)"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "roi",
          "description": "Calculate return on investment — time/cost saved vs FocusMCP overhead.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "costPerToken": {
                "type": "number",
                "description": "Cost in USD per token (default: 0.000003)"
              },
              "overheadMs": {
                "type": "number",
                "description": "FocusMCP overhead in milliseconds (default: 0)"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-savings"
      },
      "license": "MIT"
    },
    {
      "name": "semanticsearch",
      "version": "1.1.0",
      "description": "Semantic search using TF-IDF vector space — cosine similarity, intent matching, document similarity.",
      "tags": [
        "search",
        "semantic",
        "similarity",
        "tfidf",
        "vector",
        "intent"
      ],
      "keywords": [
        "semantic-search",
        "cosine-similarity",
        "tfidf",
        "intent-classification",
        "vector-space",
        "nlp"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "backend",
        "documentation"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "search",
          "description": "Semantic search — find documents most similar to a query using cosine similarity on TF-IDF vectors.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "corpus": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "text": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "text"
                  ]
                },
                "description": "Documents to search"
              },
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 5)"
              }
            },
            "required": [
              "corpus",
              "query"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "similar",
          "description": "Find documents most similar to a given document (by ID or text).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "corpus": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "text": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "text"
                  ]
                },
                "description": "All documents"
              },
              "targetId": {
                "type": "string",
                "description": "ID of document to find similar ones to"
              },
              "limit": {
                "type": "number",
                "description": "Max results (default 5)"
              }
            },
            "required": [
              "corpus",
              "targetId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "intent",
          "description": "Classify a query against a set of intents (intent = label + example phrases). Returns best matching intent.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "User query to classify"
              },
              "intents": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": "string"
                    },
                    "examples": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "label",
                    "examples"
                  ]
                },
                "description": "Intent definitions"
              }
            },
            "required": [
              "query",
              "intents"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "embeddings",
          "description": "Generate TF-IDF vector representation of texts. Useful for debugging or external processing.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "texts": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Texts to vectorize"
              }
            },
            "required": [
              "texts"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-semanticsearch"
      },
      "license": "MIT"
    },
    {
      "name": "session",
      "version": "1.1.0",
      "description": "Session context save and restore — track loaded files and operations, persist sessions to disk.",
      "tags": [
        "session",
        "context",
        "persistence",
        "restore"
      ],
      "keywords": [
        "session",
        "context-save",
        "restore",
        "persistence",
        "history",
        "checkpoint"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "multi-agent",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "save",
          "description": "Save current session state to disk.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Session name"
              },
              "data": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "context": {
                    "type": "string"
                  },
                  "notes": {
                    "type": "string"
                  }
                },
                "additionalProperties": false,
                "description": "Session data to save"
              }
            },
            "required": [
              "name",
              "data"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "restore",
          "description": "Restore a saved session from disk.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Session name to restore"
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "context",
          "description": "Get current in-memory session summary.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "history",
          "description": "List all saved sessions.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-session"
      },
      "license": "MIT"
    },
    {
      "name": "share",
      "version": "1.1.0",
      "description": "Shared state for multi-agent — share context, files, results between agents, broadcast messages.",
      "tags": [
        "share",
        "context",
        "broadcast",
        "multi-agent",
        "state"
      ],
      "keywords": [
        "shared-state",
        "pub-sub",
        "broadcast",
        "multi-agent",
        "context-sharing",
        "coordination"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "multi-agent",
        "backend",
        "orchestration"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "context",
          "description": "Share or retrieve shared context (key-value store visible to all agents). If value is provided, sets the key. Always returns the current value.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "description": "Context key to get or set"
              },
              "value": {
                "type": "string",
                "description": "Value to store (JSON string). Omit to read."
              }
            },
            "required": [
              "key"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "files",
          "description": "Share file references between agents — register which agent owns or watches which files. If files are provided, registers them. Otherwise lists files for the agent.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "agentId": {
                "type": "string",
                "description": "Identifier of the agent registering or querying files"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths to register for this agent. Omit to read."
              }
            },
            "required": [
              "agentId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "results",
          "description": "Share task results — store and retrieve results by task ID. If result is provided, stores it. Otherwise retrieves the stored result.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "taskId": {
                "type": "string",
                "description": "Unique identifier of the task"
              },
              "result": {
                "type": "string",
                "description": "Result to store (JSON string). Omit to read."
              }
            },
            "required": [
              "taskId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "broadcast",
          "description": "Send a message to all registered listeners (in-memory pub/sub). The message is logged and delivered synchronously to all current listeners.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string",
                "description": "Message content to broadcast"
              },
              "from": {
                "type": "string",
                "description": "Identifier of the agent sending the message"
              }
            },
            "required": [
              "message",
              "from"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-share"
      },
      "license": "MIT"
    },
    {
      "name": "shell",
      "version": "1.1.1",
      "description": "Shell command execution — run commands, background processes, kill, and compress output.",
      "tags": [
        "shell",
        "exec",
        "command",
        "process",
        "devtools"
      ],
      "keywords": [
        "shell",
        "exec",
        "background-process",
        "kill",
        "command-line",
        "devtools"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "devops",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "exec",
          "description": "Execute a shell command and return stdout, stderr, and exit code. Timeout after 30s by default.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "command": {
                "type": "string",
                "description": "Shell command to execute"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory (default: process.cwd())"
              },
              "timeout": {
                "type": "number",
                "description": "Timeout in milliseconds (default 30000)"
              },
              "env": {
                "type": "object",
                "description": "Additional environment variables",
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "command"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "background",
          "description": "Start a command in the background. Returns a process ID to check or kill later.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "command": {
                "type": "string",
                "description": "Shell command to run in background"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              }
            },
            "required": [
              "command"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "kill",
          "description": "Kill a background process by its ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Process ID returned by background"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "compress",
          "description": "Execute a command and return compressed output — strips ANSI codes, collapses blank lines, truncates to maxLines.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "command": {
                "type": "string",
                "description": "Shell command to execute"
              },
              "cwd": {
                "type": "string",
                "description": "Working directory"
              },
              "maxLines": {
                "type": "number",
                "description": "Max output lines (default 100)"
              },
              "timeout": {
                "type": "number",
                "description": "Timeout in milliseconds (default 30000)"
              }
            },
            "required": [
              "command"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-shell"
      },
      "license": "MIT"
    },
    {
      "name": "smartcontext",
      "version": "1.1.0",
      "description": "Composite brick — orchestrates smartread, cache, compress, tokenbudget, and overview to deliver optimal context within a token budget.",
      "tags": [
        "context",
        "composite",
        "orchestration",
        "tokens"
      ],
      "keywords": [
        "smart-context",
        "token-budget",
        "auto-discover",
        "composite",
        "context-loading",
        "cache"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "analysis",
        "backend"
      ],
      "dependencies": [
        "smartread",
        "cache",
        "compress",
        "tokenbudget",
        "overview"
      ],
      "tools": [
        {
          "name": "load",
          "description": "Auto-discover relevant files for a task, choose read modes, and return optimal context within budget.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "task": {
                "type": "string",
                "description": "Task description to contextualize"
              },
              "dir": {
                "type": "string",
                "description": "Root directory to scan"
              },
              "budget": {
                "type": "number",
                "description": "Token budget (default: 2000)"
              }
            },
            "required": [
              "task",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "refresh",
          "description": "Re-check files for changes and update context using cache to detect stale entries.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Directory to refresh"
              },
              "budget": {
                "type": "number",
                "description": "Token budget (default: 2000)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "status",
          "description": "Show current context budget usage and cache statistics.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-smartcontext"
      },
      "license": "MIT"
    },
    {
      "name": "smartread",
      "version": "1.2.1",
      "description": "Intelligent file reading — multiple modes to minimize token usage.",
      "tags": [
        "file",
        "read",
        "smart",
        "tokens"
      ],
      "keywords": [
        "code-navigation",
        "ast",
        "smart-read",
        "code-intel",
        "token-efficient",
        "file-reading"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "full",
          "description": "Read entire file (fallback mode)",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "map",
          "description": "Read file structure only — function/class signatures, no bodies",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "signatures",
          "description": "Extract only exported function/class signatures",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "imports",
          "description": "Extract only import/require statements",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "summary",
          "description": "One-line summary per function/block (name + line count)",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-smartread"
      },
      "license": "MIT"
    },
    {
      "name": "symbol",
      "version": "1.2.1",
      "description": "Symbol lookup in source files — find, get, bulk, body. Multi-language via treesitter (PHP, Python, Go, Rust, Java, TS/JS, etc.).",
      "tags": [
        "symbols",
        "code-intel",
        "search"
      ],
      "keywords": [
        "symbols",
        "ast",
        "code-intel",
        "navigation",
        "lookup",
        "multi-language"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "rust",
        "php",
        "java"
      ],
      "dependencies": [
        "treesitter"
      ],
      "tools": [
        {
          "name": "find",
          "description": "Find symbols by name (substring match) in a directory.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Symbol name or substring"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "get",
          "description": "Get exact symbol match with signature.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Exact symbol name"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              }
            },
            "required": [
              "name",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "bulk",
          "description": "Look up multiple symbols in one call.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "names": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Symbol names to look up"
              },
              "dir": {
                "type": "string",
                "description": "Directory to search in"
              }
            },
            "required": [
              "names",
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "body",
          "description": "Read the body of a symbol (lines startLine to endLine).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "file": {
                "type": "string",
                "description": "Absolute file path"
              },
              "startLine": {
                "type": "number",
                "description": "Start line (1-based)"
              },
              "endLine": {
                "type": "number",
                "description": "End line (inclusive)"
              }
            },
            "required": [
              "file",
              "startLine",
              "endLine"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-symbol"
      },
      "license": "MIT"
    },
    {
      "name": "task",
      "version": "1.1.1",
      "description": "Task management for multi-agent workflows — create tasks, assign to agents, track status, mark complete.",
      "tags": [
        "task",
        "workflow",
        "agent",
        "orchestration",
        "multi-agent"
      ],
      "keywords": [
        "task-management",
        "assign",
        "priority",
        "multi-agent",
        "workflow",
        "tracking"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "multi-agent",
        "backend",
        "orchestration"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "create",
          "description": "Create a task with a title, description, and priority level.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "Short title of the task"
              },
              "description": {
                "type": "string",
                "description": "Detailed description of what the task entails"
              },
              "priority": {
                "type": "number",
                "description": "Priority level (1 = highest, higher numbers = lower priority)"
              }
            },
            "required": [
              "title",
              "description"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "assign",
          "description": "Assign a task to an agent by task ID and agent ID.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Task ID to assign"
              },
              "agentId": {
                "type": "string",
                "description": "ID of the agent to assign the task to"
              }
            },
            "required": [
              "id",
              "agentId"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "status",
          "description": "Get task status and details by ID, or list all tasks filtered by status.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Task ID to retrieve (returns single task)"
              },
              "status": {
                "type": "string",
                "enum": [
                  "pending",
                  "assigned",
                  "running",
                  "done",
                  "failed"
                ],
                "description": "Filter tasks by status (returns list)"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "complete",
          "description": "Mark a task as complete with an optional result payload.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Task ID to mark as complete"
              },
              "result": {
                "type": "string",
                "description": "Optional result data or summary from the task execution"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-task"
      },
      "license": "MIT"
    },
    {
      "name": "textsearch",
      "version": "1.1.1",
      "description": "Text search and replace across files — regex search, multi-file replace, grouped results.",
      "tags": [
        "search",
        "text",
        "regex",
        "replace",
        "refactoring"
      ],
      "keywords": [
        "text-search",
        "regex",
        "multi-file-replace",
        "grouped-results",
        "dry-run",
        "grep"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "go",
        "refactoring",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "search",
          "description": "Search for a text pattern across files in a directory. Returns matches with file, line number, and context.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to search in"
              },
              "pattern": {
                "type": "string",
                "description": "Text pattern to search for (plain text)"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter (e.g. *.ts). Default: all supported files"
              },
              "maxResults": {
                "type": "number",
                "description": "Max results to return (default 50)"
              }
            },
            "required": [
              "dir",
              "pattern"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "regex",
          "description": "Search for a regex pattern across files. Supports capture groups.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to search in"
              },
              "pattern": {
                "type": "string",
                "description": "JavaScript regex pattern (without flags)"
              },
              "flags": {
                "type": "string",
                "description": "Regex flags (default: 'i')"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter"
              },
              "maxResults": {
                "type": "number",
                "description": "Max results (default 50)"
              }
            },
            "required": [
              "dir",
              "pattern"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "replace",
          "description": "Search and replace text across multiple files. Returns preview of changes without applying by default.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to search in"
              },
              "pattern": {
                "type": "string",
                "description": "Search pattern (text or regex)"
              },
              "replacement": {
                "type": "string",
                "description": "Replacement string (supports $1, $2 for regex captures)"
              },
              "isRegex": {
                "type": "boolean",
                "description": "Treat pattern as regex (default false)"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter"
              },
              "apply": {
                "type": "boolean",
                "description": "Actually apply changes (default false = dry run)"
              }
            },
            "required": [
              "dir",
              "pattern",
              "replacement"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "grouped",
          "description": "Search and group results by file, showing match count per file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Root directory to search in"
              },
              "pattern": {
                "type": "string",
                "description": "Search pattern"
              },
              "isRegex": {
                "type": "boolean",
                "description": "Treat pattern as regex (default false)"
              },
              "glob": {
                "type": "string",
                "description": "File glob filter"
              }
            },
            "required": [
              "dir",
              "pattern"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-textsearch"
      },
      "license": "MIT"
    },
    {
      "name": "thinking",
      "version": "1.1.0",
      "description": "Structured reasoning chains — think step by step, branch alternatives, revise conclusions, summarize.",
      "tags": [
        "thinking",
        "reasoning",
        "chain-of-thought",
        "analysis"
      ],
      "keywords": [
        "reasoning-chain",
        "chain-of-thought",
        "branching",
        "revise",
        "summarize",
        "structured-thinking"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "multi-agent",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "think",
          "description": "Add a reasoning step to the current chain. Each step has a thought and optional confidence score.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "thought": {
                "type": "string",
                "description": "The reasoning step content"
              },
              "confidence": {
                "type": "number",
                "description": "Confidence level 0-1 (optional)"
              },
              "chainId": {
                "type": "string",
                "description": "Chain ID to append to (default: current chain)"
              }
            },
            "required": [
              "thought"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "branch",
          "description": "Create a reasoning branch — explore an alternative line of thinking from the current point.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string",
                "description": "Branch label (e.g. 'Option A', 'If we assume...')"
              },
              "thought": {
                "type": "string",
                "description": "First thought in this branch"
              },
              "chainId": {
                "type": "string",
                "description": "Chain to branch from"
              }
            },
            "required": [
              "label",
              "thought"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "revise",
          "description": "Revise a previous reasoning step with new information. Keeps the original for audit trail.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "stepIndex": {
                "type": "number",
                "description": "Index of step to revise (0-based)"
              },
              "revision": {
                "type": "string",
                "description": "Revised thought"
              },
              "reason": {
                "type": "string",
                "description": "Why this revision"
              },
              "chainId": {
                "type": "string",
                "description": "Chain ID"
              }
            },
            "required": [
              "stepIndex",
              "revision",
              "reason"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "summarize",
          "description": "Summarize the current reasoning chain into a structured conclusion.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "chainId": {
                "type": "string",
                "description": "Chain to summarize (default: current)"
              }
            },
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-thinking"
      },
      "license": "MIT"
    },
    {
      "name": "tokenbudget",
      "version": "1.1.0",
      "description": "Token budget management — estimate and optimize token usage for AI agents.",
      "tags": [
        "tokens",
        "budget",
        "optimize",
        "estimate"
      ],
      "keywords": [
        "token-budget",
        "estimate",
        "optimize",
        "fill",
        "context-window",
        "cost"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "analysis",
        "performance",
        "backend"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "estimate",
          "description": "Estimate token count for text (chars/4 heuristic, adjusted for code vs prose).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "Text to estimate"
              },
              "path": {
                "type": "string",
                "description": "File path to read and estimate"
              }
            },
            "additionalProperties": false
          }
        },
        {
          "name": "analyze",
          "description": "Analyze token cost of a directory recursively, per-file breakdown sorted by cost.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Directory to analyze"
              },
              "maxFiles": {
                "type": "number",
                "description": "Max files to analyze (default 50)"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "fill",
          "description": "Given a token budget and file list, select files that fit using compression levels to maximize info.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "budget": {
                "type": "number",
                "description": "Token budget"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "List of file paths"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "signatures",
                  "map",
                  "full"
                ],
                "description": "Read mode (default: signatures)"
              }
            },
            "required": [
              "budget",
              "files"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "optimize",
          "description": "Suggest how to read a set of files within a budget.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "budget": {
                "type": "number",
                "description": "Token budget"
              },
              "dir": {
                "type": "string",
                "description": "Directory to optimize"
              }
            },
            "required": [
              "budget",
              "dir"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-tokenbudget"
      },
      "license": "MIT"
    },
    {
      "name": "treesitter",
      "version": "1.3.3",
      "description": "Tree-sitter based multi-language code indexer — supports TS, JS, PHP, Python, Go, Rust, Java.",
      "tags": [
        "ast",
        "parser",
        "symbols",
        "typescript",
        "javascript",
        "php",
        "python",
        "go",
        "rust",
        "java",
        "multi-language"
      ],
      "keywords": [
        "typescript",
        "javascript",
        "ast",
        "parser",
        "code-intel",
        "php",
        "python",
        "go",
        "rust",
        "java",
        "multi-language"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "react",
        "vue",
        "next",
        "python",
        "rust",
        "go",
        "php",
        "java"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "index",
          "description": "Index a directory: parse all supported files (TS, JS, PHP, Python, Go, Rust, Java) and store symbols in memory.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "dir": {
                "type": "string",
                "description": "Absolute path to directory to index"
              }
            },
            "required": [
              "dir"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "reindex",
          "description": "Re-index a single file.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to file"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "status",
          "description": "Return index status: file count, symbol count, languages.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "cleanup",
          "description": "Clear the entire index.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        },
        {
          "name": "langs",
          "description": "List supported languages.",
          "inputSchema": {
            "type": "object",
            "properties": {},
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-treesitter"
      },
      "license": "MIT"
    },
    {
      "name": "validate",
      "version": "1.1.1",
      "description": "Validate data — JSON syntax, JSON Schema compliance, TypeScript type checking, lint rules.",
      "tags": [
        "validate",
        "json",
        "schema",
        "types",
        "lint"
      ],
      "keywords": [
        "validation",
        "json-schema",
        "type-check",
        "lint",
        "syntax",
        "compliance"
      ],
      "recommendedFor": [
        "typescript",
        "javascript",
        "python",
        "testing",
        "backend",
        "analysis"
      ],
      "dependencies": [],
      "tools": [
        {
          "name": "json",
          "description": "Validate JSON syntax — check if a string is valid JSON and report parse errors.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "The string to validate as JSON"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "schema",
          "description": "Validate data against a JSON Schema (subset: type, required, properties, items).",
          "inputSchema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "description": "JSON string of the data to validate"
              },
              "schema": {
                "type": "object",
                "description": "JSON Schema object (type, required, properties, items supported)"
              }
            },
            "required": [
              "data",
              "schema"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "types",
          "description": "Check TypeScript type annotations in a file — find `any`, missing return types, implicit any.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to the TypeScript file to analyse"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        },
        {
          "name": "lint",
          "description": "Apply simple lint rules to code — unused imports, console.log, TODO/FIXME count, debugger statements.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "Absolute path to the source file to lint"
              }
            },
            "required": [
              "path"
            ],
            "additionalProperties": false
          }
        }
      ],
      "source": {
        "type": "npm",
        "package": "@focus-mcp/brick-validate"
      },
      "license": "MIT"
    }
  ]
}
