Skip to content

Pr

pr

GitPRTool — create GitHub pull requests via gh CLI.

GitPRTool

Bases: AXMTool

Create a GitHub pull request with optional auto-merge.

Registered as git_pr via axm.tools entry point.

Source code in packages/axm-git/src/axm_git/tools/pr.py
Python
class GitPRTool(AXMTool):
    """Create a GitHub pull request with optional auto-merge.

    Registered as ``git_pr`` via axm.tools entry point.
    """

    @property
    def name(self) -> str:
        """Tool name used for MCP registration."""
        return "git_pr"

    def execute(  # type: ignore[override]
        self,
        *,
        title: str,
        body: str | None = None,
        base: str | None = None,
        auto_merge: bool = False,
        path: str = ".",
        **kwargs: object,
    ) -> ToolResult:
        """Create a GitHub pull request.

        Args:
            title: PR title (required).
            body: PR body/description.
            base: Base branch (default: the repo's resolved default branch).
            auto_merge: Enable auto-merge with squash (default ``False``).
            path: Repository path.

        Returns:
            ToolResult with ``pr_url`` and ``pr_number`` on success.
        """
        resolved = Path(path).resolve()
        base = base or resolve_default_branch(resolved)

        try:
            precheck = _check_pr_preconditions(resolved)
            if precheck is not None:
                return precheck

            created = _create_pr(title, body, base, resolved)
            if isinstance(created, ToolResult):
                return created
            pr_url, pr_number = created

            auto_merge_ok = _maybe_auto_merge(pr_number, auto_merge, resolved)

            data: dict[str, object] = {
                "pr_url": pr_url,
                "pr_number": pr_number,
                "auto_merge": auto_merge_ok,
            }
            return ToolResult(success=True, data=data, text=render_text(data))
        except subprocess.TimeoutExpired as exc:
            return timeout_error_result(exc)
name property

Tool name used for MCP registration.

execute(*, title, body=None, base=None, auto_merge=False, path='.', **kwargs)

Create a GitHub pull request.

Parameters:

Name Type Description Default
title str

PR title (required).

required
body str | None

PR body/description.

None
base str | None

Base branch (default: the repo's resolved default branch).

None
auto_merge bool

Enable auto-merge with squash (default False).

False
path str

Repository path.

'.'

Returns:

Type Description
ToolResult

ToolResult with pr_url and pr_number on success.

Source code in packages/axm-git/src/axm_git/tools/pr.py
Python
def execute(  # type: ignore[override]
    self,
    *,
    title: str,
    body: str | None = None,
    base: str | None = None,
    auto_merge: bool = False,
    path: str = ".",
    **kwargs: object,
) -> ToolResult:
    """Create a GitHub pull request.

    Args:
        title: PR title (required).
        body: PR body/description.
        base: Base branch (default: the repo's resolved default branch).
        auto_merge: Enable auto-merge with squash (default ``False``).
        path: Repository path.

    Returns:
        ToolResult with ``pr_url`` and ``pr_number`` on success.
    """
    resolved = Path(path).resolve()
    base = base or resolve_default_branch(resolved)

    try:
        precheck = _check_pr_preconditions(resolved)
        if precheck is not None:
            return precheck

        created = _create_pr(title, body, base, resolved)
        if isinstance(created, ToolResult):
            return created
        pr_url, pr_number = created

        auto_merge_ok = _maybe_auto_merge(pr_number, auto_merge, resolved)

        data: dict[str, object] = {
            "pr_url": pr_url,
            "pr_number": pr_number,
            "auto_merge": auto_merge_ok,
        }
        return ToolResult(success=True, data=data, text=render_text(data))
    except subprocess.TimeoutExpired as exc:
        return timeout_error_result(exc)