diff --git a/coffee_bot/run.py b/coffee_bot/run.py
new file mode 100755
index 0000000000000000000000000000000000000000..33f12bdbdfcff5ce11fb129e1c1d4da9f3de4830
--- /dev/null
+++ b/coffee_bot/run.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+
+import argparse
+
+import mattermost
+from coffee_bot.match_making import matching_in_channel
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Make matches between channel members")
+    parser.add_argument("--channel-id", required=True)
+    parser.add_argument("--minimum-members", type=int, default=4, required=False, help=(
+        "Don't start the matchmaking process if there is less than this many members of the channel. "
+        "Default value is 4."
+    ))
+    parser.add_argument("--group-size", type=int, default=2, required=False, help=(
+        "Size of the created groups. It can happen that there is a leftover group with less than "
+        "this many members, but there will be no group created with less than 2 members. "
+        "GROUP_SIZE has to be at least 2! Default value is 2"
+    ))
+    parser.add_argument("--too-few-message", type=str, default=None, required=False, help=(
+        "Message sent to the channel specified by CHANNEL_ID in case there is less than "
+        "MINIMUM_MEMBERS available members for matchmaking."
+    ))
+    parser.add_argument("--group-hail-message", type=str, default=None, required=False, help=(
+        "Message sent to the group after making a match"
+    ))
+    parser.add_argument("--left-out-message", type=str, default=None, required=False, help=(
+        "Message sent for the channel specified by CHANNEL_ID in case someone had to be left out. "
+        "It can be a python format string, the left out user's data is available in the variable user."
+    ))
+
+    parser.add_argument("--mattermost-url", type=str, default=None, required=False, help=(
+        "the URL for the mattermost API (including /api). Defaults to environment variable "
+        "MATTERMOST_URL"
+    ))
+    parser.add_argument("--mattermost-token", type=str, default=None, required=False, help=(
+        "the access token for the bot user. Defaults to environment variable MATTERMOST_TOKEN"
+    ))
+
+    args = parser.parse_args()
+
+    if args.group_size < 2:
+        parser.error("GROUP_SIZE has to be at least 2")
+
+    if args.mattermost_url is None:
+        from .config import MATTERMOST_URL
+        args.mattermost_url = MATTERMOST_URL
+
+    if args.mattermost_token is None:
+        from .config import MATTERMOST_TOKEN
+        args.mattermost_token = MATTERMOST_TOKEN
+
+    run(**args)
+
+
+#pylint: disable=too-many-arguments
+def run(mattermost_url, mattermost_token,
+        channel_id, minimum_members, group_size,
+        too_few_message, group_hail_message, left_out_message):
+
+    client = mattermost.MMApi(mattermost_url)
+    client.login(bearer=mattermost_token)
+
+    matching_in_channel(
+        client=client,
+        channel_id=channel_id,
+        group_size=group_size,
+        group_hail=group_hail_message,
+        left_out_message=left_out_message,
+        too_few_message=too_few_message,
+        minimum_members=minimum_members,
+    )