diff --git a/geomagio/processing/copy_observatory.py b/geomagio/processing/copy_observatory.py
new file mode 100644
index 0000000000000000000000000000000000000000..c93e2827529d34c87f89b16fadcb16cc3a6554a9
--- /dev/null
+++ b/geomagio/processing/copy_observatory.py
@@ -0,0 +1,135 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Thu Jul  7 11:05:19 2022
+
+@author: awernle
+"""
+import os
+from typing import List
+
+import typer
+
+from geomagio.api.ws.Observatory import OBSERVATORIES
+from ..metadata import Metadata, MetadataFactory, MetadataCategory
+
+
+def copy_observatory(
+    observatory: str = typer.Option(..., help="Observatory code"),
+    metadata_token: str = typer.Option(
+        default=os.getenv("GITLAB_API_TOKEN"),
+        help="Token for metadata web service.",
+        metavar="TOKEN",
+        show_default="environment variable GITLAB_API_TOKEN",
+    ),
+    metadata_url: str = typer.Option(
+        default="https://staging-geomag.cr.usgs.gov/ws/secure/metadata",
+        help="URL to metadata web service",
+        metavar="URL",
+    ),
+):
+    """Copy observatory metadata into the metadata webservice."""
+
+    observatories = get_observatory_metadata(
+        observatory=observatory,
+    )
+
+    # confirm whether or not to copy observatory metadata
+    typer.confirm(f"Are you sure you want to copy observatory metadata?", abort=True)
+    print("Copying over observatory metadata")
+
+    # write observatory metadata to metadata service
+    metadata_factory = MetadataFactory(token=metadata_token, url=metadata_url)
+    with typer.progressbar(
+        iterable=observatories, label="Uploading to metadata service"
+    ) as progressbar:
+        for observatory in progressbar:
+            upload_observatory_metdata(
+                factory=metadata_factory, observatory=observatory
+            )
+
+
+def create_observatory_metadata(observatory) -> Metadata:
+    """Create observatory metadata object.
+
+    Parameters
+    ----------
+    observatory:
+        observatory to convert to metadata.
+
+    Returns
+    -------
+    metadata object for observatory
+    """
+    # define network based on observatory
+    network = "NT"
+    if observatory.agency == "USGS":
+        network = "NT"
+    # rest alphabetical by agency
+    elif observatory.agency == "BGS":
+        network = "GB"
+    elif observatory.agency == "GSC":
+        network = "C2"
+    elif observatory.agency == "JMA":
+        network = "JP"
+    elif observatory.agency == "SANSA":
+        network = "AF"
+
+    metadata = Metadata(
+        category=MetadataCategory.OBSERVATORY,
+        created_by="copy_observatory",
+        network=network,
+        station=observatory.id,
+        metadata=observatory.dict(),
+    )
+    return metadata
+
+
+def get_observatory_metadata(
+    observatory: str,
+):
+    """Get metadata from OBSERVATORIES list.
+
+    Parameters
+    ----------
+    observatory
+        search observatory
+
+    Returns
+    -------
+    observatory metadata
+    """
+    observatories = []
+    # add observatories
+    for observatory_ in OBSERVATORIES:
+        if observatory == observatory_.id:
+            observatories.append(observatory_)
+    print(observatories)
+    return observatories
+
+
+def main() -> None:
+    """Entrypoint for copy observatory method."""
+    # for one command, can use typer.run
+    typer.run(copy_observatory)
+
+
+def upload_observatory_metdata(factory: MetadataFactory, observatory) -> Metadata:
+    """Upload observatory to metadata service
+
+    Parameters
+    ----------
+    factory
+        factory configured for metadata service
+    observatory
+        observatory to upload
+
+    Returns
+    -------
+    created metadata object
+    """
+    metadata = create_observatory_metadata(observatory=observatory)
+    return factory.create_metadata(metadata=metadata)
+
+
+if __name__ == "__main__":
+    main()