teams-transcripts 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/PKG-INFO +74 -10
  2. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/README.md +73 -9
  3. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/pyproject.toml +1 -1
  4. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/infrastructure/config.py +12 -4
  5. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/mcp_server.py +18 -1
  6. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_infrastructure_config.py +17 -0
  7. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_mcp_server.py +18 -0
  8. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/uv.lock +1 -1
  9. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/.gitignore +0 -0
  10. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/.gitlab-ci.yml +0 -0
  11. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/bin/teams-transcripts +0 -0
  12. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/bin/teams-transcripts-mcp +0 -0
  13. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/lefthook.yml +0 -0
  14. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/legacy/__init__.py +0 -0
  15. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/legacy/transcript_download.py +0 -0
  16. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/pyrightconfig.json +0 -0
  17. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/scripts/verify_distribution.py +0 -0
  18. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/__init__.py +0 -0
  19. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/__main__.py +0 -0
  20. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/__init__.py +0 -0
  21. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/cdp/__init__.py +0 -0
  22. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/cdp/browser.py +0 -0
  23. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/cdp/connection.py +0 -0
  24. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/cdp/helpers.py +0 -0
  25. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/cdp/teams.py +0 -0
  26. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/adapters/vertex.py +0 -0
  27. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/__init__.py +0 -0
  28. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/chat.py +0 -0
  29. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/html.py +0 -0
  30. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/mcps.py +0 -0
  31. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/models.py +0 -0
  32. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/participants.py +0 -0
  33. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/scoring.py +0 -0
  34. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/speakers.py +0 -0
  35. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/summary.py +0 -0
  36. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/timestamps.py +0 -0
  37. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/domain/vtt.py +0 -0
  38. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/infrastructure/__init__.py +0 -0
  39. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/infrastructure/errors.py +0 -0
  40. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/infrastructure/logging.py +0 -0
  41. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/infrastructure/signals.py +0 -0
  42. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/ports/__init__.py +0 -0
  43. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/ports/agent.py +0 -0
  44. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/ports/browser.py +0 -0
  45. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/__init__.py +0 -0
  46. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/downloader.py +0 -0
  47. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/extraction.py +0 -0
  48. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/listing.py +0 -0
  49. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/navigation.py +0 -0
  50. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/output.py +0 -0
  51. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/teams_transcripts/services/tenant.py +0 -0
  52. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/conftest.py +0 -0
  53. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/fakes/__init__.py +0 -0
  54. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/fakes/agent.py +0 -0
  55. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/fakes/browser.py +0 -0
  56. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_adapters_cdp_browser.py +0 -0
  57. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_adapters_cdp_connection.py +0 -0
  58. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_adapters_cdp_helpers.py +0 -0
  59. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_adapters_cdp_teams.py +0 -0
  60. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_adapters_vertex.py +0 -0
  61. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_append_chat.py +0 -0
  62. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_build_result_summary.py +0 -0
  63. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_cli_validation.py +0 -0
  64. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_component_flags.py +0 -0
  65. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_domain_mcps.py +0 -0
  66. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_domain_models.py +0 -0
  67. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_domain_participants.py +0 -0
  68. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_env_vars.py +0 -0
  69. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_error_json.py +0 -0
  70. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_force_restart_cli.py +0 -0
  71. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_infrastructure_errors.py +0 -0
  72. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_infrastructure_logging.py +0 -0
  73. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_infrastructure_signals.py +0 -0
  74. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_log_and_exit.py +0 -0
  75. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_merge_vtt_parts.py +0 -0
  76. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_occurrence_matching.py +0 -0
  77. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_parse_meeting_times.py +0 -0
  78. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_parse_vtt_cues.py +0 -0
  79. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_prepend_vtt_metadata.py +0 -0
  80. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_regression_iframe_timing.py +0 -0
  81. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_resolve_chat_author.py +0 -0
  82. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_resolve_config.py +0 -0
  83. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_safe_teams_restart.py +0 -0
  84. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_search_scoring.py +0 -0
  85. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_services_downloader.py +0 -0
  86. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_services_extraction.py +0 -0
  87. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_services_listing.py +0 -0
  88. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_services_navigation.py +0 -0
  89. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_services_tenant.py +0 -0
  90. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_signal_handling.py +0 -0
  91. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_speaker_mapping.py +0 -0
  92. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_strip_html.py +0 -0
  93. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_tenant_config.py +0 -0
  94. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_timestamp_fill_and_discontinuity.py +0 -0
  95. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_timestamp_utils.py +0 -0
  96. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_verbose_dead_code.py +0 -0
  97. {teams_transcripts-0.5.0 → teams_transcripts-0.5.1}/tests/test_verify_output.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: teams-transcripts
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Download Microsoft Teams transcripts, chat, and meeting metadata from the macOS desktop app
5
5
  Project-URL: Homepage, https://gitlab.com/jamiemills-choreograph/teams-transcripts
6
6
  Project-URL: Repository, https://gitlab.com/jamiemills-choreograph/teams-transcripts
@@ -49,13 +49,20 @@ uvx teams-transcripts \
49
49
  --gcp-project your-project
50
50
  ```
51
51
 
52
- To run one of the package's differently named commands, specify the package:
52
+ The MCP server has a different executable name from the PyPI package, so use
53
+ `--from` to tell `uvx` which package provides it:
53
54
 
54
55
  ```sh
55
- uvx --from teams-transcripts teams-transcripts-mcp
56
+ uvx --from 'teams-transcripts==0.5.1' teams-transcripts-mcp
56
57
  uvx --from teams-transcripts transcript-download --help
57
58
  ```
58
59
 
60
+ Use `teams-transcripts==0.5.1` for a reproducible MCP configuration, or replace
61
+ it with `teams-transcripts` to follow the latest release. Do not run
62
+ `uvx teams-transcripts-mcp`: that asks PyPI for a package named
63
+ `teams-transcripts-mcp`, rather than running the executable supplied by this
64
+ package.
65
+
59
66
  `uvx` creates an isolated temporary environment. The Teams desktop app, CDP,
60
67
  and authentication prerequisites below still apply.
61
68
 
@@ -171,8 +178,12 @@ file.
171
178
 
172
179
  ### 3. Python dependencies
173
180
 
174
- The script requires Python 3.10+ and is managed with
175
- [uv](https://docs.astral.sh/uv/). To install all dependencies:
181
+ The package requires Python 3.10+ and is managed with
182
+ [uv](https://docs.astral.sh/uv/). When using `uvx`, dependencies are installed
183
+ automatically in an isolated environment; no project checkout or `uv sync` is
184
+ needed.
185
+
186
+ For development from a source checkout, install the locked dependencies:
176
187
 
177
188
  ```sh
178
189
  uv sync --locked
@@ -631,6 +642,22 @@ tools directly.
631
642
 
632
643
  ### Running the MCP server
633
644
 
645
+ From PyPI, with no repository checkout or persistent installation:
646
+
647
+ ```sh
648
+ # Pinned release (recommended for MCP client configuration)
649
+ uvx --from 'teams-transcripts==0.5.1' teams-transcripts-mcp
650
+
651
+ # Latest release
652
+ uvx --from teams-transcripts teams-transcripts-mcp
653
+ ```
654
+
655
+ STDIO is the default transport. When run manually, the command waits quietly
656
+ for MCP messages on standard input; normally an MCP client starts and manages
657
+ this process for you.
658
+
659
+ If the package is already installed, run the entry point directly:
660
+
634
661
  ```sh
635
662
  # STDIO transport (default, for subprocess spawning by MCP clients)
636
663
  teams-transcripts-mcp
@@ -658,8 +685,10 @@ MCP transport for local subprocess spawning). When `--port` is specified,
658
685
  the server runs as an SSE HTTP server on that port, accessible over the
659
686
  network.
660
687
 
661
- The server inherits environment variables for GCP configuration
662
- (see [Environment variables](#environment-variables)).
688
+ The server inherits environment variables for GCP configuration, including
689
+ `GOOGLE_CLOUD_PROJECT` and the optional `CLOUD_ML_REGION`, `MODEL_ID`,
690
+ `GOOGLE_ADC`, and `TEAMS_TENANT` settings (see
691
+ [Environment variables](#environment-variables)).
663
692
 
664
693
  ### Available tools
665
694
 
@@ -712,9 +741,43 @@ Or for a known meeting:
712
741
  1. download(meeting="Weekly Standup", date="2026-04-29")
713
742
  ```
714
743
 
715
- ### Configuration for Claude Desktop
744
+ ### MCP client configuration with uvx
745
+
746
+ Use `uvx` as the MCP command and pass the package plus its MCP executable as
747
+ arguments. This works with clients that accept the standard JSON MCP server
748
+ configuration format, including Claude Desktop:
749
+
750
+ ```json
751
+ {
752
+ "mcpServers": {
753
+ "teams-transcripts": {
754
+ "command": "uvx",
755
+ "args": [
756
+ "--from",
757
+ "teams-transcripts==0.5.1",
758
+ "teams-transcripts-mcp"
759
+ ],
760
+ "env": {
761
+ "GOOGLE_CLOUD_PROJECT": "your-gcp-project"
762
+ }
763
+ }
764
+ }
765
+ }
766
+ ```
767
+
768
+ For Claude Desktop, add that entry to `claude_desktop_config.json` and restart
769
+ Claude Desktop. Other MCP clients use the same command and arguments in their
770
+ local-server configuration. Add any optional environment variables your setup
771
+ needs to the `env` object. The MCP process must run as the same macOS user as
772
+ Teams so it can connect to the desktop app and use that user's credentials.
773
+
774
+ To track the newest PyPI release instead of pinning one, change the package
775
+ argument from `teams-transcripts==0.5.1` to `teams-transcripts`.
776
+
777
+ ### Configuration from an installed checkout
716
778
 
717
- Add to your `claude_desktop_config.json`:
779
+ If the project is already installed in a virtual environment, point the MCP
780
+ client at its entry point:
718
781
 
719
782
  ```json
720
783
  {
@@ -729,7 +792,8 @@ Add to your `claude_desktop_config.json`:
729
792
  }
730
793
  ```
731
794
 
732
- Or using `uv run`:
795
+ For a source checkout managed by `uv`, configure the client to run in the
796
+ repository directory:
733
797
 
734
798
  ```json
735
799
  {
@@ -20,13 +20,20 @@ uvx teams-transcripts \
20
20
  --gcp-project your-project
21
21
  ```
22
22
 
23
- To run one of the package's differently named commands, specify the package:
23
+ The MCP server has a different executable name from the PyPI package, so use
24
+ `--from` to tell `uvx` which package provides it:
24
25
 
25
26
  ```sh
26
- uvx --from teams-transcripts teams-transcripts-mcp
27
+ uvx --from 'teams-transcripts==0.5.1' teams-transcripts-mcp
27
28
  uvx --from teams-transcripts transcript-download --help
28
29
  ```
29
30
 
31
+ Use `teams-transcripts==0.5.1` for a reproducible MCP configuration, or replace
32
+ it with `teams-transcripts` to follow the latest release. Do not run
33
+ `uvx teams-transcripts-mcp`: that asks PyPI for a package named
34
+ `teams-transcripts-mcp`, rather than running the executable supplied by this
35
+ package.
36
+
30
37
  `uvx` creates an isolated temporary environment. The Teams desktop app, CDP,
31
38
  and authentication prerequisites below still apply.
32
39
 
@@ -142,8 +149,12 @@ file.
142
149
 
143
150
  ### 3. Python dependencies
144
151
 
145
- The script requires Python 3.10+ and is managed with
146
- [uv](https://docs.astral.sh/uv/). To install all dependencies:
152
+ The package requires Python 3.10+ and is managed with
153
+ [uv](https://docs.astral.sh/uv/). When using `uvx`, dependencies are installed
154
+ automatically in an isolated environment; no project checkout or `uv sync` is
155
+ needed.
156
+
157
+ For development from a source checkout, install the locked dependencies:
147
158
 
148
159
  ```sh
149
160
  uv sync --locked
@@ -602,6 +613,22 @@ tools directly.
602
613
 
603
614
  ### Running the MCP server
604
615
 
616
+ From PyPI, with no repository checkout or persistent installation:
617
+
618
+ ```sh
619
+ # Pinned release (recommended for MCP client configuration)
620
+ uvx --from 'teams-transcripts==0.5.1' teams-transcripts-mcp
621
+
622
+ # Latest release
623
+ uvx --from teams-transcripts teams-transcripts-mcp
624
+ ```
625
+
626
+ STDIO is the default transport. When run manually, the command waits quietly
627
+ for MCP messages on standard input; normally an MCP client starts and manages
628
+ this process for you.
629
+
630
+ If the package is already installed, run the entry point directly:
631
+
605
632
  ```sh
606
633
  # STDIO transport (default, for subprocess spawning by MCP clients)
607
634
  teams-transcripts-mcp
@@ -629,8 +656,10 @@ MCP transport for local subprocess spawning). When `--port` is specified,
629
656
  the server runs as an SSE HTTP server on that port, accessible over the
630
657
  network.
631
658
 
632
- The server inherits environment variables for GCP configuration
633
- (see [Environment variables](#environment-variables)).
659
+ The server inherits environment variables for GCP configuration, including
660
+ `GOOGLE_CLOUD_PROJECT` and the optional `CLOUD_ML_REGION`, `MODEL_ID`,
661
+ `GOOGLE_ADC`, and `TEAMS_TENANT` settings (see
662
+ [Environment variables](#environment-variables)).
634
663
 
635
664
  ### Available tools
636
665
 
@@ -683,9 +712,43 @@ Or for a known meeting:
683
712
  1. download(meeting="Weekly Standup", date="2026-04-29")
684
713
  ```
685
714
 
686
- ### Configuration for Claude Desktop
715
+ ### MCP client configuration with uvx
716
+
717
+ Use `uvx` as the MCP command and pass the package plus its MCP executable as
718
+ arguments. This works with clients that accept the standard JSON MCP server
719
+ configuration format, including Claude Desktop:
720
+
721
+ ```json
722
+ {
723
+ "mcpServers": {
724
+ "teams-transcripts": {
725
+ "command": "uvx",
726
+ "args": [
727
+ "--from",
728
+ "teams-transcripts==0.5.1",
729
+ "teams-transcripts-mcp"
730
+ ],
731
+ "env": {
732
+ "GOOGLE_CLOUD_PROJECT": "your-gcp-project"
733
+ }
734
+ }
735
+ }
736
+ }
737
+ ```
738
+
739
+ For Claude Desktop, add that entry to `claude_desktop_config.json` and restart
740
+ Claude Desktop. Other MCP clients use the same command and arguments in their
741
+ local-server configuration. Add any optional environment variables your setup
742
+ needs to the `env` object. The MCP process must run as the same macOS user as
743
+ Teams so it can connect to the desktop app and use that user's credentials.
744
+
745
+ To track the newest PyPI release instead of pinning one, change the package
746
+ argument from `teams-transcripts==0.5.1` to `teams-transcripts`.
747
+
748
+ ### Configuration from an installed checkout
687
749
 
688
- Add to your `claude_desktop_config.json`:
750
+ If the project is already installed in a virtual environment, point the MCP
751
+ client at its entry point:
689
752
 
690
753
  ```json
691
754
  {
@@ -700,7 +763,8 @@ Add to your `claude_desktop_config.json`:
700
763
  }
701
764
  ```
702
765
 
703
- Or using `uv run`:
766
+ For a source checkout managed by `uv`, configure the client to run in the
767
+ repository directory:
704
768
 
705
769
  ```json
706
770
  {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "teams-transcripts"
3
- version = "0.5.0"
3
+ version = "0.5.1"
4
4
  description = "Download Microsoft Teams transcripts, chat, and meeting metadata from the macOS desktop app"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -94,9 +94,10 @@ def parse_args() -> argparse.Namespace:
94
94
  " gcloud auth application-default login\n"
95
95
  " Or point --adc / GOOGLE_ADC at a service account key file.\n"
96
96
  "\n"
97
- " 3. Python dependencies (websockets, anthropic[vertex], mcp) are managed\n"
98
- " by uv. Run 'uv sync' to install from the lockfile. After setup,\n"
99
- " use ./bin/teams-transcripts (or 'uv run teams-transcripts') to run.\n"
97
+ " 3. Python 3.10+ and uv are required. uvx installs dependencies in an\n"
98
+ " isolated environment automatically; no checkout or uv sync is needed.\n"
99
+ " For a source checkout, run 'uv sync --locked', then use\n"
100
+ " 'uv run teams-transcripts'.\n"
100
101
  "\n"
101
102
  "environment variables (used as fallbacks when CLI flags are omitted):\n"
102
103
  " GOOGLE_CLOUD_PROJECT GCP project ID for Vertex AI (required if\n"
@@ -425,7 +426,13 @@ def parse_args() -> argparse.Namespace:
425
426
  "\n"
426
427
  "mcp server:\n"
427
428
  " An MCP (Model Context Protocol) server is available for tool-use by\n"
428
- " AI agents. Start with: teams-transcripts-mcp\n"
429
+ " AI agents. Run from PyPI without installing:\n"
430
+ " uvx --from teams-transcripts teams-transcripts-mcp\n"
431
+ " For a reproducible client config, pin the package version:\n"
432
+ " uvx --from 'teams-transcripts==VERSION' teams-transcripts-mcp\n"
433
+ " MCP client command: uvx\n"
434
+ " MCP client args: --from teams-transcripts teams-transcripts-mcp\n"
435
+ " If installed locally, start with: teams-transcripts-mcp\n"
429
436
  " Or on a network port: teams-transcripts-mcp --port 8080\n"
430
437
  " Recommended tool: download(meeting_id=UUID) -- the unified entry point.\n"
431
438
  " Also available: restart_teams, list_tenants, list_transcripts,\n"
@@ -434,6 +441,7 @@ def parse_args() -> argparse.Namespace:
434
441
  " AI agents should prefer MCP tools over direct CLI invocation.\n"
435
442
  " STDIO transport (default) for subprocess spawning by MCP clients.\n"
436
443
  " SSE transport (--port) for network access.\n"
444
+ " The server inherits GOOGLE_CLOUD_PROJECT and other documented env vars.\n"
437
445
  ),
438
446
  )
439
447
  p.add_argument(
@@ -795,7 +795,24 @@ def main() -> None:
795
795
  import argparse
796
796
 
797
797
  p = argparse.ArgumentParser(
798
- description="Teams Transcripts MCP server",
798
+ description=(
799
+ "Teams Transcripts MCP server. Uses STDIO by default so an MCP "
800
+ "client can start and manage it as a local subprocess."
801
+ ),
802
+ formatter_class=argparse.RawDescriptionHelpFormatter,
803
+ epilog="""Run directly from PyPI without installing:
804
+ uvx --from teams-transcripts teams-transcripts-mcp
805
+
806
+ Pin a release for a reproducible MCP client configuration:
807
+ uvx --from 'teams-transcripts==VERSION' teams-transcripts-mcp
808
+
809
+ MCP client configuration:
810
+ command: uvx
811
+ args: --from teams-transcripts teams-transcripts-mcp
812
+
813
+ The server inherits GOOGLE_CLOUD_PROJECT and the other environment variables
814
+ documented in the project README. Do not use `uvx teams-transcripts-mcp`;
815
+ the PyPI package name is `teams-transcripts`.""",
799
816
  )
800
817
  p.add_argument(
801
818
  "--port",
@@ -18,6 +18,23 @@ from pydantic import ValidationError
18
18
  from teams_transcripts.domain.models import MeetingConfig
19
19
  from teams_transcripts.infrastructure.config import parse_args, resolve_config
20
20
 
21
+
22
+ def test_main_help_documents_uvx_mcp_configuration(
23
+ monkeypatch: pytest.MonkeyPatch,
24
+ capsys: pytest.CaptureFixture[str],
25
+ ) -> None:
26
+ monkeypatch.setattr("sys.argv", ["teams-transcripts", "--help"])
27
+
28
+ with pytest.raises(SystemExit) as exc_info:
29
+ parse_args()
30
+
31
+ assert exc_info.value.code == 0
32
+ help_text = capsys.readouterr().out
33
+ assert "uvx --from teams-transcripts teams-transcripts-mcp" in help_text
34
+ assert "MCP client command: uvx" in help_text
35
+ assert "teams-transcripts==VERSION" in help_text
36
+
37
+
21
38
  # ---------------------------------------------------------------------------
22
39
  # Helpers
23
40
  # ---------------------------------------------------------------------------
@@ -25,6 +25,7 @@ from teams_transcripts.mcp_server import (
25
25
  _run_cli,
26
26
  _run_cli_list,
27
27
  download,
28
+ main,
28
29
  mcp,
29
30
  )
30
31
 
@@ -33,6 +34,23 @@ from teams_transcripts.mcp_server import (
33
34
  # ---------------------------------------------------------------------------
34
35
 
35
36
 
37
+ def test_mcp_help_documents_uvx_configuration(
38
+ monkeypatch: pytest.MonkeyPatch,
39
+ capsys: pytest.CaptureFixture[str],
40
+ ) -> None:
41
+ monkeypatch.setattr("sys.argv", ["teams-transcripts-mcp", "--help"])
42
+
43
+ with pytest.raises(SystemExit) as exc_info:
44
+ main()
45
+
46
+ assert exc_info.value.code == 0
47
+ help_text = capsys.readouterr().out
48
+ assert "uvx --from teams-transcripts teams-transcripts-mcp" in help_text
49
+ assert "teams-transcripts==VERSION" in help_text
50
+ assert "GOOGLE_CLOUD_PROJECT" in help_text
51
+ assert "STDIO" in help_text
52
+
53
+
36
54
  class TestToolDiscovery:
37
55
  """Verify all MCP tools are registered with correct metadata."""
38
56
 
@@ -1156,7 +1156,7 @@ wheels = [
1156
1156
 
1157
1157
  [[package]]
1158
1158
  name = "teams-transcripts"
1159
- version = "0.5.0"
1159
+ version = "0.5.1"
1160
1160
  source = { editable = "." }
1161
1161
  dependencies = [
1162
1162
  { name = "anthropic", extra = ["vertex"] },