diff --git a/mycampusscript.py b/mycampusscript.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e386f84762bc77609aaa1673e0656030c09a1fa
--- /dev/null
+++ b/mycampusscript.py
@@ -0,0 +1,78 @@
+import re
+import sys
+import typing as tg
+
+import bs4
+import yaml
+import requests
+
+import base as b
+
+
+usage = """mycampusscript create_multigroup_assgmt config.yaml
+  Creates an Sakai 'assignment' entry in a site with separate deadlines per section
+"""
+site_url_help = """site_url: URL of the MyCampus site's homepage"""
+cookies_help = """cookies: a dictionary of cookie names to cookie values
+  You need to obtain the following cookies: SAKAI2SESSIONID.  How to do that:
+  Log into MyCampus, 
+  visit the site where you want to create the multigroup assignment,
+  open the developer tools in your browser (in Firefox: F12),
+  open the 'network' tab in the developer tools,
+  visit the assignment creation form ('Assignments' -> 'Add'),
+  select the first requests in the network tab's request list,
+  in the panel on the right, select 'Headers' -> 'Request Headers', turn on 'raw' view,
+  copy the entire line that starts with "Cookie:" and paste into your config as the value
+    for the 'cookies' config parameter; you must enclose it in double quotes.
+"""
+
+ASSIGNMENTS_CREATION_FORM_PATH = 'tool/1f8f054a-4e58-4965-8d32-141b236e0023?panel=Main'
+
+
+StrAnyDict = dict[str, tg.Any]
+
+
+def main(scriptname: str, cmdname: str, configfile: str):
+    with open(configfile, 'rt') as f:
+        config = yaml.load(f, Loader=yaml.Loader)
+    site_url: str = find_value_or_help(config, 'site_url')
+    parse_cookies(config)
+    group_ids: str = find_value_or_help(config, 'group_ids')
+
+
+def find_value_or_help(config: StrAnyDict, key: str) -> tg.Any:
+    if key in config:
+        return config[key]
+    the_help = globals()[f"{key}_help"]
+    if callable(the_help):
+        !!!
+        the_help = ...
+    b.critical(the_help)
+
+
+def parse_cookies(config: StrAnyDict):
+    def perhaps_complain(mm):
+        if not mm:
+            b.critical("config param 'cookies' must have format 'Cookie: \"NAME1=value1; name2=value\"")
+
+    cookiesheader_re = r"Cookie: (.+)"
+    mm = re.fullmatch(cookiesheader_re, config['cookies'])
+    perhaps_complain(mm)
+    cookiepairs = mm.group(1).split("; ")
+    result = dict()
+    for pair in cookiepairs:
+        mm = re.fullmatch(r"(.+?)=(.+)", pair)  # split at the first equals sign
+        perhaps_complain(mm)
+        result[mm.group(1)] = mm.group(2)
+    print(result)
+    config['cookies'] = result
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2+1 or sys.argv[1] != 'create_multigroup_assgmt':
+        print(usage)
+    else:
+        try:
+            main(*sys.argv)
+        except b.CritialError:
+            pass  # just stop