diff --git a/utils/netboxcli.py b/utils/netboxcli.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1a754aa7804c6adedbd564c2804d8aece40406b
--- /dev/null
+++ b/utils/netboxcli.py
@@ -0,0 +1,157 @@
+"""
+Command line tool to communicate with
+the NetBox API
+"""
+import click
+import pandas as pd
+
+from gso.services import netbox_client as nc
+
+# Define url and token for netbox API
+# TODO move to config file
+token = "<Token>"
+api = 'http://127.0.0.1:8001'
+nbclient = nc.connect(api, token)
+
+
+def convert_to_table(data, fields):
+    df = pd.DataFrame(data)
+    df = df[fields]  # Selecting specific fields to display
+    return df
+
+
+@click.group()
+def cli():
+    pass
+
+
+@cli.group()
+def create():
+    pass
+
+
+@create.command()
+@click.option('--fqdn', prompt='Enter device name', help='Device name')
+@click.option('--model', default="vmx", help='Device model')
+@click.option('--role', default="router", help='Device role')
+@click.option('--site', default="Amsterdam", help='Device role')
+def device(fqdn: str, model: str, role: str, site: str):
+    click.echo(f"Creating device: fqdn={fqdn}, model={model}, role={role}")
+    new_device = nc.create_device(nbclient, fqdn, model, role, site)
+    print(new_device)
+
+
+@create.command()
+@click.option('--name', help='Interfacename')
+@click.option('--type', default='10gbase-t', help='Interface type, default is 10GBASE-T')
+@click.option('--fqdn', help='Device where to create interface')
+def interface(name: str, type: str, fqdn: str):
+    click.echo(f"Creating interface: name={name}, type={type}, fqdn={fqdn}")
+    new_interface = nc.create_interface(nbclient, name, type, fqdn)
+    print(new_interface)
+
+
+@create.command()
+@click.option('--name', help='Manufacturer name')
+@click.option('--slug', help='Short name for manufacturer')
+def manufacturer(name: str, slug: str):
+    click.echo(f"Creating manufacturer: name={name}")
+    manufacturer = nc.create_manufacturer(nbclient, name, slug)
+    print(manufacturer)
+
+
+@create.command()
+@click.option('--manufacturer', help='Manufacturer for device')
+@click.option('--model', help='Model for device')
+@click.option('--slug', help='Short name for manufacturer')
+def device_type(manufacturer: str, model: str, slug: str):
+    click.echo(f"Creating device type: manufacturer={manufacturer} model = {model}")
+    device_type = nc.create_device_type(nbclient, manufacturer, model, slug)
+    print(device_type)
+
+
+@create.command()
+@click.option('--name', help='Name for device role')
+@click.option('--slug', help='Short name for device role')
+def device_role(name: str, slug: str):
+    click.echo(f"Creating device role: name={name}")
+    device_role = nc.create_device_role(nbclient, name, slug)
+    print(device_role)
+
+
+@create.command()
+@click.option('--name', help='Name for device site')
+@click.option('--slug', help='Short name for device site')
+def device_site(name: str, slug: str):
+    click.echo(f"Creating device site: name={name}")
+    device_site = nc.create_device_site(nbclient, name, slug)
+    print(device_site)
+
+
+create.add_command(device)
+create.add_command(interface)
+create.add_command(manufacturer)
+create.add_command(device_type)
+create.add_command(device_role)
+create.add_command(device_site)
+
+
+# Define list commands here
+@cli.group()
+def list():
+    pass
+
+
+@list.command()
+@click.option('--fqdn', help='Device name to list interfaces')
+@click.option('--type', default="10gbase-t", help='Interface type to list interfaces')
+def interfaces(fqdn: str, type: str):
+    click.echo(f"Listing all interfaces for: device with fqdn={fqdn}, type={type}")
+    interface_list = nc.get_interfaces_by_device(nbclient, fqdn)
+    display_fields = ["name", "enabled", "type", "parent", "lag", "speed"]
+    iface_list = []
+    for iface in interface_list:
+        iface_list.append(dict(iface))
+
+    table = convert_to_table(iface_list, display_fields)
+    print(table)
+
+
+@list.command()
+def devices():
+    click.echo("Listing all devices:")
+    device_list = nc.get_all_devices(nbclient)
+    display_fields = ["name", "device_type"]
+    devices = []
+    for device in device_list:
+        devices.append(dict(device))
+
+    table = convert_to_table(devices, display_fields)
+    print(table)
+
+
+list.add_command(interfaces)
+list.add_command(devices)
+
+
+# Define here attach command
+@cli.group()
+def attach():
+    pass
+
+
+@attach.command()
+@click.option('--fqdn', help='Device name where to attach interface to lag')
+@click.option('--iface', help='Interface name to attach to lag')
+@click.option('--lag', help='LAG name to attach interface')
+def interface(fqdn: str, iface: str, lag: str):
+    click.echo(f"Attaching interface to lag: device ={fqdn}, interface name={iface} to lag={lag}")
+    new_iface = nc.attach_interface_to_lag(nbclient, fqdn, lag, iface)
+    print(new_iface)
+
+
+attach.add_command(interface)
+
+
+if __name__ == '__main__':
+    cli()