← WebMCP Directory

Tool tree

jjhub.erisera.com

Developer ToolsTools verified
Website
JJHub
Explore capabilities
    list_tool_groupsAnswer

    JJHub registers its WebMCP tools progressively: a small core set is always available and the rest are grouped by workflow. Lists every group with its description, tool names and whether it is currently loaded, plus the page limits (how many tools may be registered at once) and how many slots remain. Call load_tool_group to make a group's tools callable.

    View tool JSON
    {
      "name": "list_tool_groups",
      "kind": "answer",
      "impl": "imperative",
      "description": "JJHub registers its WebMCP tools progressively: a small core set is always available and the rest are grouped by workflow. Lists every group with its description, tool names and whether it is currently loaded, plus the page limits (how many tools may be registered at once) and how many slots remain. Call load_tool_group to make a group's tools callable.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    load_tool_groupAction

    Registers one workflow group's tools on this page so they become callable. If that would exceed the page budget, the least recently used loaded group is evicted first (evict defaults to true) and the response names the evicted group and tools — their schemas leave your working set and must be re-loaded before use. With evict: false the load is refused instead, listing the groups you could unload. Loading an already-loaded group is a no-op. Group names come from list_tool_groups.

    View tool JSON
    {
      "name": "load_tool_group",
      "kind": "act",
      "impl": "imperative",
      "description": "Registers one workflow group's tools on this page so they become callable. If that would exceed the page budget, the least recently used loaded group is evicted first (evict defaults to true) and the response names the evicted group and tools — their schemas leave your working set and must be re-loaded before use. With evict: false the load is refused instead, listing the groups you could unload. Loading an already-loaded group is a no-op. Group names come from list_tool_groups.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "group": {
            "type": "string",
            "enum": [
              "core",
              "changes",
              "review",
              "stacks",
              "conflicts",
              "landing",
              "content",
              "evidence",
              "history",
              "workspaces",
              "bookmarks",
              "repositories",
              "projects",
              "ai",
              "admin"
            ],
            "description": "Group name from list_tool_groups."
          },
          "evict": {
            "type": "boolean",
            "description": "Evict the least recently used group if needed (default true); false refuses instead."
          }
        },
        "required": [
          "group"
        ],
        "additionalProperties": false
      }
    }
    search_toolsAnswer

    Keyword search over every JJHub WebMCP tool's name and description (loaded or not). Returns matching tool names with their group and whether each is currently loaded, so you can discover a tool and then load_tool_group its group.

    View tool JSON
    {
      "name": "search_tools",
      "kind": "answer",
      "impl": "imperative",
      "description": "Keyword search over every JJHub WebMCP tool's name and description (loaded or not). Returns matching tool names with their group and whether each is currently loaded, so you can discover a tool and then load_tool_group its group.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Words to look for, e.g. 'land stack' or 'conflict'."
          },
          "limit": {
            "type": "number",
            "description": "Max matches (default 15)."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    }
    list_repositoriesAnswer

    List every repository JJHub manages, with GitHub connection and daemon status.

    View tool JSON
    {
      "name": "list_repositories",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every repository JJHub manages, with GitHub connection and daemon status.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    get_repositoryAnswer

    Get one repository's details (GitHub connection, App coverage, daemon heartbeat).

    View tool JSON
    {
      "name": "get_repository",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get one repository's details (GitHub connection, App coverage, daemon heartbeat).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          }
        },
        "required": [
          "repositoryId"
        ],
        "additionalProperties": false
      }
    }
    list_changesAnswer

    List every jj-style change in a repository.

    View tool JSON
    {
      "name": "list_changes",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every jj-style change in a repository.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          }
        },
        "required": [
          "repositoryId"
        ],
        "additionalProperties": false
      }
    }
    get_changeAnswer

    Get one change's full detail (status, commit history, restack flag, etc.).

    View tool JSON
    {
      "name": "get_change",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get one change's full detail (status, commit history, restack flag, etc.).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    get_change_diffAnswer

    Per-file unified diffs of a change's projected branch against its base; landed changes return the merged PR audit diff.

    View tool JSON
    {
      "name": "get_change_diff",
      "kind": "answer",
      "impl": "imperative",
      "description": "Per-file unified diffs of a change's projected branch against its base; landed changes return the merged PR audit diff.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    create_changeAction

    Create a change (projects a branch + draft PR on GitHub when connected); parentChangeId stacks it on an existing change.

    View tool JSON
    {
      "name": "create_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a change (projects a branch + draft PR on GitHub when connected); parentChangeId stacks it on an existing change.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "title": {
            "type": "string",
            "description": "Short title for the change."
          },
          "description": {
            "type": "string",
            "description": "Longer description/body."
          },
          "parentChangeId": {
            "type": "string",
            "description": "Parent change id, if stacking on another change."
          },
          "parentChangeIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ordered parent change ids for a multi-parent jj graph change."
          },
          "base": {
            "type": "string",
            "description": "Base ref, e.g. 'main', if not stacking on a change."
          },
          "stackId": {
            "type": "string",
            "description": "Stack to add this change to, if any."
          },
          "projectionRoute": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "same_repo",
                  "user_fork",
                  "unprojected"
                ]
              },
              "headRepoFullName": {
                "type": "string"
              },
              "baseRepoFullName": {
                "type": "string"
              },
              "baseBranch": {
                "type": "string"
              }
            },
            "required": [
              "kind"
            ],
            "additionalProperties": false
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "title"
        ],
        "additionalProperties": false
      }
    }
    describe_changeAction

    Edit a change's title and/or description (like 'jj describe').

    View tool JSON
    {
      "name": "describe_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Edit a change's title and/or description (like 'jj describe').",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "title": {
            "type": "string",
            "description": "New title, if changing it."
          },
          "description": {
            "type": "string",
            "description": "New description, if changing it."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    amend_changeAction

    Amend (rewrite) a change in place — descendants will need a restack.

    View tool JSON
    {
      "name": "amend_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Amend (rewrite) a change in place — descendants will need a restack.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    split_changeAction

    Split a change: a new change with the given title stacks on top of it.

    View tool JSON
    {
      "name": "split_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Split a change: a new change with the given title stacks on top of it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "title": {
            "type": "string",
            "description": "Title for the newly split-off change."
          },
          "description": {
            "type": "string",
            "description": "Description for the newly split-off change."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId",
          "title"
        ],
        "additionalProperties": false
      }
    }
    squash_changeAction

    Squash a change into its parent.

    View tool JSON
    {
      "name": "squash_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Squash a change into its parent.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    abandon_changeAction

    Abandon a change outright (closes its projected PR on GitHub).

    View tool JSON
    {
      "name": "abandon_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Abandon a change outright (closes its projected PR on GitHub).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    restore_changeAction

    Re-materialize an abandoned OR squashed-away change as a live draft with its original changeId, from the op log's pre-deletion snapshot. Former children stay reparented where abandon/squash left them (returned as formerChildren, not automatically reclaimed); a former parent that has since landed or vanished re-roots the restored change onto its base instead (reported as rerootedOnBase).

    View tool JSON
    {
      "name": "restore_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Re-materialize an abandoned OR squashed-away change as a live draft with its original changeId, from the op log's pre-deletion snapshot. Former children stay reparented where abandon/squash left them (returned as formerChildren, not automatically reclaimed); a former parent that has since landed or vanished re-roots the restored change onto its base instead (reported as rerootedOnBase).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    duplicate_changeAction

    Create an independent copy of a change with the same title/description/content (like 'jj duplicate'). The source is never touched — it can be duplicated even if landed, queued, or abandoned.

    View tool JSON
    {
      "name": "duplicate_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Create an independent copy of a change with the same title/description/content (like 'jj duplicate'). The source is never touched — it can be duplicated even if landed, queued, or abandoned.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "destinationChangeId": {
            "type": "string",
            "description": "New primary (first) parent for the duplicate — mirrors jj's 'duplicate -d/--onto'. Replaces ONLY the source's first parent; every other parent (a join's non-primary edges) carries over unchanged. Omit to keep every one of the source's parents exactly as-is."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }
    reparent_changeAction

    Repoint a change's parent edges directly (graph-level reparent, not a content rebase). Reuses create_change's cycle detection. Marks the change and its descendants needsRestack rather than performing the rebase itself — call restack_change afterward to materialize it.

    View tool JSON
    {
      "name": "reparent_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Repoint a change's parent edges directly (graph-level reparent, not a content rebase). Reuses create_change's cycle detection. Marks the change and its descendants needsRestack rather than performing the rebase itself — call restack_change afterward to materialize it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "parentChangeIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "New ordered parent edges, replacing the change's current ones outright. The first element becomes the new primary parent (PR base once restacked); any additional elements are a join's non-primary parents, recorded but never projected to GitHub (Change.unprojectedParentIds). An empty array re-roots the change with no parent."
          }
        },
        "required": [
          "repositoryId",
          "changeId",
          "parentChangeIds"
        ],
        "additionalProperties": false
      }
    }
    restack_changeAction

    Rebase a needs-restack change onto its rewritten ancestor and clear its needsRestack flag.

    View tool JSON
    {
      "name": "restack_change",
      "kind": "act",
      "impl": "imperative",
      "description": "Rebase a needs-restack change onto its rewritten ancestor and clear its needsRestack flag.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "repositoryId": {
            "type": "string",
            "description": "JJHub repository id — see list_repositories for available ids."
          },
          "changeId": {
            "type": "string",
            "description": "jj change id, e.g. 'CHG-1' — see list_changes."
          },
          "workspaceId": {
            "type": "string",
            "description": "Issue #268: explicitly target this workspace for local-write routing. Never inferred — omitting it always yields localApply:'not_requested', even if the repository has a configured write route."
          },
          "expectedWorkspaceWorkingCopyChangeId": {
            "type": "string",
            "description": "Only meaningful with workspaceId: the working-copy change id this call expects the target workspace to currently be on. A mismatch yields localApply:'skipped_diverged' instead of proceeding against a workspace that has moved."
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."
          }
        },
        "required": [
          "repositoryId",
          "changeId"
        ],
        "additionalProperties": false
      }
    }