diff --git a/CHANGELOG.md b/CHANGELOG.md
index ac97f7e..1ec6555 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@
 ### Fixed
 
 - Track path and user IP on Django < 1.10
+- The undocumented `core-agent-manager` CLI command works again
 
 ## [2.1.0] 2019-06-25
 
diff --git a/README.md b/README.md
index b9c3955..c1c5ba7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,10 @@
 # Scout Python APM Agent
 
+[![travis](https://img.shields.io/travis/scoutapp/scout_apm_python/master.svg)](https://travis-ci.org/scoutapp/scout_apm_python)
+[![pypi](https://img.shields.io/pypi/v/scout-apm.svg)](https://pypi.python.org/pypi/scout-apm)
+[![docs](https://img.shields.io/badge/docs-read%20online-green.svg)](https://docs.scoutapm.com/#python-agent)
+[![black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)
+
 Monitor the performance of Python Django apps, Flask apps, and Celery workers with Scout's [Python APM Agent](https://www.scoutapm.com). Detailed performance metrics and transaction traces are collected once the `scout-apm` package is installed and configured.
 
 ![screenshot](https://s3-us-west-1.amazonaws.com/scout-blog/python_monitoring_release/python_monitoring_screenshot.png)
diff --git a/setup.cfg b/setup.cfg
index 1fee903..eaec295 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -11,9 +11,7 @@ ignore =
 
 [coverage:run]
 branch = True
-omit =
-    src/scout_apm/core/cli/core_agent_manager.py
-    src/scout_apm/core/monkey.py
+omit = src/scout_apm/core/monkey.py
 
 [flake8]
 # core
diff --git a/src/scout_apm/core/cli/core_agent_manager.py b/src/scout_apm/core/cli/core_agent_manager.py
index 98b9829..608ad1e 100755
--- a/src/scout_apm/core/cli/core_agent_manager.py
+++ b/src/scout_apm/core/cli/core_agent_manager.py
@@ -4,38 +4,31 @@ from __future__ import absolute_import, division, print_function, unicode_litera
 import argparse
 import logging
 
+from scout_apm.core import AgentContext, CoreAgentManager
 
-def download(**kwargs):
-    from scout_apm.core import CoreAgentManager
-
-    core_agent_manager = CoreAgentManager()
-    core_agent_manager.download()
-
-
-def launch(**kwargs):
-    from scout_apm.core import CoreAgentManager
-
-    core_agent_manager = CoreAgentManager()
-    core_agent_manager.launch()
+logger = logging.getLogger(__name__)
 
 
-def main(**kwargs):
+def main(argv=None):
     parser = argparse.ArgumentParser()
     parser.add_argument(
         "-v", "--verbose", help="increase output verbosity", action="count"
     )
 
-    subparsers = parser.add_subparsers(dest="subparser")
+    subparsers = parser.add_subparsers(
+        title="subcommands", description="valid subcommands", dest="subparser"
+    )
     subparsers.add_parser("download")
     subparsers.add_parser("launch")
 
-    args = parser.parse_args()
+    args = parser.parse_args(argv)
 
     if args.verbose is not None:
         if args.verbose >= 2:
-            logging.basicConfig(level=getattr(logging, "DEBUG", None))
-        elif args.verbose == 1:
-            logging.basicConfig(level=getattr(logging, "INFO", None))
+            logging.basicConfig(level=logging.DEBUG)
+        else:
+            logging.basicConfig(level=logging.INFO)
 
-    kwargs = vars(args)
-    globals()[kwargs.pop("subparser")](**kwargs)
+    AgentContext.build()
+    core_agent_manager = CoreAgentManager()
+    getattr(core_agent_manager, args.subparser)()

Support Queue timing in Python agent
Checking the request headers for officially supported frameworks like Django and Flask should be straight forward.

We should also have a generic API interface for recording Queue time in other cases.
diff --git a/tests/unit/core/cli/test_core_agent_manager.py b/tests/unit/core/cli/test_core_agent_manager.py
new file mode 100644
index 0000000..313d5fe
--- /dev/null
+++ b/tests/unit/core/cli/test_core_agent_manager.py
@@ -0,0 +1,39 @@
+# coding=utf-8
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import logging
+
+import pytest
+
+from scout_apm.core.cli.core_agent_manager import main
+from tests.compat import mock
+
+
+@pytest.fixture(autouse=True)
+def mock_CoreAgentManager():
+    # Always mock out the actual CoreAgentManager class for these tests, to
+    # keep them quick
+    path = "scout_apm.core.cli.core_agent_manager.CoreAgentManager"
+    with mock.patch(path) as mock_obj:
+        yield mock_obj
+
+
+@mock.patch("scout_apm.core.cli.core_agent_manager.logging.basicConfig")
+@pytest.mark.parametrize(
+    "args, expected_level", [(["-v"], logging.INFO), (["-v", "-v"], logging.DEBUG)]
+)
+def test_logging_verbose(mock_basicConfig, args, expected_level):
+    # Have to use a mock for basicConfig since logging is already configured
+    # during tests
+    main(args + ["download"])
+
+    mock_basicConfig.assert_called_with(level=expected_level)
+
+
+@pytest.mark.parametrize("command", ["download", "launch"])
+def test_command(mock_CoreAgentManager, command):
+    main([command])
+
+    instance = mock_CoreAgentManager.return_value
+    method = getattr(instance, command)
+    method.assert_called_with()

pip install -e .[dev]
parse_log_pytest
requirements.txt
black flake8 isort tox bottle celery Django elasticsearch flask flask-sqlalchemy jinja2 mock pymongo pyramid pytest pytest-travis-fold pytest-cov redis six sqlalchemy starlette urllib3 webtest
apt-get update apt-get install -y gcc
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
amqp==5.3.1
anyio==3.7.1
asgiref==3.7.2
async-timeout==4.0.3
beautifulsoup4==4.13.3
billiard==3.6.4.0
black==23.3.0
bottle==0.13.2
cached-property==1.5.2
celery==5.2.7
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
click==8.1.8
click-didyoumean==0.3.1
click-plugins==1.1.1
click-repl==0.3.0
coverage==7.2.7
distlib==0.3.9
Django==3.2.25
dnspython==2.3.0
elastic-transport==8.13.1
elasticsearch==8.14.0
exceptiongroup==1.2.2
filelock==3.12.2
flake8==5.0.4
Flask==2.2.5
Flask-SQLAlchemy==3.0.5
greenlet==3.1.1
hupper==1.12.1
idna==3.10
importlib-metadata==4.2.0
iniconfig==2.0.0
isort==5.11.5
itsdangerous==2.1.2
Jinja2==3.1.6
kombu==5.2.4
MarkupSafe==2.1.5
mccabe==0.7.0
mock==5.2.0
mypy-extensions==1.0.0
packaging==24.0
PasteDeploy==3.1.0
pathspec==0.11.2
plaster==1.1.2
plaster-pastedeploy==1.0.1
platformdirs==2.6.2
pluggy==1.2.0
prompt_toolkit==3.0.48
psutil==7.0.0
py==1.11.0
pycodestyle==2.9.1
pyflakes==2.5.0
pymongo==4.7.3
pyramid==2.0.2
pytest==7.4.4
pytest-cov==4.1.0
pytest-travis-fold==1.3.0
pytz==2025.2
redis==5.0.8
requests==2.31.0
-e git+https://github.com/scoutapp/scout_apm_python.git@7dba843aa33a09ad63aa7041241008d2251943b4#egg=scout_apm
six==1.17.0
sniffio==1.3.1
soupsieve==2.4.1
SQLAlchemy==2.0.40
sqlparse==0.4.4
starlette==0.29.0
tomli==2.0.1
tox==3.28.0
translationstring==1.4
typed-ast==1.5.5
typing_extensions==4.7.1
urllib3==2.0.7
venusian==3.1.1
vine==5.1.0
virtualenv==20.16.2
waitress==2.1.2
wcwidth==0.2.13
WebOb==1.8.9
WebTest==3.0.1
Werkzeug==2.2.3
zipp==3.15.0
zope.deprecation==5.0
zope.interface==6.4.post2

name: scout_apm_python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - amqp==5.3.1
      - anyio==3.7.1
      - asgiref==3.7.2
      - async-timeout==4.0.3
      - beautifulsoup4==4.13.3
      - billiard==3.6.4.0
      - black==23.3.0
      - bottle==0.13.2
      - cached-property==1.5.2
      - celery==5.2.7
      - charset-normalizer==3.4.1
      - click==8.1.8
      - click-didyoumean==0.3.1
      - click-plugins==1.1.1
      - click-repl==0.3.0
      - coverage==7.2.7
      - distlib==0.3.9
      - django==3.2.25
      - dnspython==2.3.0
      - elastic-transport==8.13.1
      - elasticsearch==8.14.0
      - exceptiongroup==1.2.2
      - filelock==3.12.2
      - flake8==5.0.4
      - flask==2.2.5
      - flask-sqlalchemy==3.0.5
      - greenlet==3.1.1
      - hupper==1.12.1
      - idna==3.10
      - importlib-metadata==4.2.0
      - iniconfig==2.0.0
      - isort==5.11.5
      - itsdangerous==2.1.2
      - jinja2==3.1.6
      - kombu==5.2.4
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - mock==5.2.0
      - mypy-extensions==1.0.0
      - packaging==24.0
      - pastedeploy==3.1.0
      - pathspec==0.11.2
      - plaster==1.1.2
      - plaster-pastedeploy==1.0.1
      - platformdirs==2.6.2
      - pluggy==1.2.0
      - prompt-toolkit==3.0.48
      - psutil==7.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pymongo==4.7.3
      - pyramid==2.0.2
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - pytest-travis-fold==1.3.0
      - pytz==2025.2
      - redis==5.0.8
      - requests==2.31.0
      - six==1.17.0
      - sniffio==1.3.1
      - soupsieve==2.4.1
      - sqlalchemy==2.0.40
      - sqlparse==0.4.4
      - starlette==0.29.0
      - tomli==2.0.1
      - tox==3.28.0
      - translationstring==1.4
      - typed-ast==1.5.5
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - venusian==3.1.1
      - vine==5.1.0
      - virtualenv==20.16.2
      - waitress==2.1.2
      - wcwidth==0.2.13
      - webob==1.8.9
      - webtest==3.0.1
      - werkzeug==2.2.3
      - zipp==3.15.0
      - zope-deprecation==5.0
      - zope-interface==6.4.post2
prefix: /opt/conda/envs/scout_apm_python

tests/unit/core/cli/test_core_agent_manager.py::test_logging_verbose[args0-20] tests/unit/core/cli/test_core_agent_manager.py::test_logging_verbose[args1-10] tests/unit/core/cli/test_core_agent_manager.py::test_command[download] tests/unit/core/cli/test_core_agent_manager.py::test_command[launch]
src/scout_apm/core/cli/core_agent_manager.py README.md setup.cfg CHANGELOG.md
src/scout_apm/core/cli/core_agent_manager.py README.md setup.cfg CHANGELOG.md