def METHOD_NAME(fn: Callable[P, T]) -> Callable[P, T]:
    assert not hasattr(fn, "_api_info")
    # Unlike req/rp that have an absolute path, `client_ctx` is only specified in the
    # signature by it name, hence we must hack `localns` so that it find something
    # (as we don't really care to find the right element !)
    types = get_type_hints(
        fn,
        localns={
            "AuthenticatedClientContext": "AuthenticatedClientContext",
            "InvitedClientContext": "InvitedClientContext",
            "AnonymousClientContext": "AnonymousClientContext",
        },
    )
    assert types.keys() == {"client_ctx", "req", "return"}
    cmd_mod = types["req"].__module__
    _, _, m_family, _, m_cmd = cmd_mod.split(".")
    assert types["return"].__module__ == cmd_mod
    assert cmd_mod.startswith("parsec._parsec.")
    assert types["req"].__name__ == "Req"
    assert types["return"].__name__ == "Rep"
    if m_family == "authenticated_cmds":
        expected_type_name = "AuthenticatedClientContext"
    elif m_family == "invited_cmds":
        expected_type_name = "InvitedClientContext"
    else:
        assert m_family == "anonymous_cmds"
        expected_type_name = "AnonymousClientContext"
    assert types["client_ctx"] == ForwardRef(
        expected_type_name
    ), f"Expect `client_ctx` to be an `{expected_type_name}`"
    fn._api_info = {  # type: ignore[attr-defined]
        "cmd": m_cmd,
        "req_type": types["req"],
        "cancel_on_client_sending_new_cmd": False,
    }
    return fn