mcp-ticketer 0.12.0__py3-none-any.whl → 2.0.1__py3-none-any.whl

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.

Potentially problematic release.


This version of mcp-ticketer might be problematic. Click here for more details.

Files changed (87) hide show
  1. mcp_ticketer/__init__.py +10 -10
  2. mcp_ticketer/__version__.py +1 -1
  3. mcp_ticketer/adapters/aitrackdown.py +385 -6
  4. mcp_ticketer/adapters/asana/adapter.py +108 -0
  5. mcp_ticketer/adapters/asana/mappers.py +14 -0
  6. mcp_ticketer/adapters/github.py +525 -11
  7. mcp_ticketer/adapters/hybrid.py +47 -5
  8. mcp_ticketer/adapters/jira.py +521 -0
  9. mcp_ticketer/adapters/linear/adapter.py +1784 -101
  10. mcp_ticketer/adapters/linear/client.py +85 -3
  11. mcp_ticketer/adapters/linear/mappers.py +96 -8
  12. mcp_ticketer/adapters/linear/queries.py +168 -1
  13. mcp_ticketer/adapters/linear/types.py +80 -4
  14. mcp_ticketer/analysis/__init__.py +56 -0
  15. mcp_ticketer/analysis/dependency_graph.py +255 -0
  16. mcp_ticketer/analysis/health_assessment.py +304 -0
  17. mcp_ticketer/analysis/orphaned.py +218 -0
  18. mcp_ticketer/analysis/project_status.py +594 -0
  19. mcp_ticketer/analysis/similarity.py +224 -0
  20. mcp_ticketer/analysis/staleness.py +266 -0
  21. mcp_ticketer/automation/__init__.py +11 -0
  22. mcp_ticketer/automation/project_updates.py +378 -0
  23. mcp_ticketer/cli/adapter_diagnostics.py +3 -1
  24. mcp_ticketer/cli/auggie_configure.py +17 -5
  25. mcp_ticketer/cli/codex_configure.py +97 -61
  26. mcp_ticketer/cli/configure.py +851 -103
  27. mcp_ticketer/cli/cursor_configure.py +314 -0
  28. mcp_ticketer/cli/diagnostics.py +13 -12
  29. mcp_ticketer/cli/discover.py +5 -0
  30. mcp_ticketer/cli/gemini_configure.py +17 -5
  31. mcp_ticketer/cli/init_command.py +880 -0
  32. mcp_ticketer/cli/instruction_commands.py +6 -0
  33. mcp_ticketer/cli/main.py +233 -3151
  34. mcp_ticketer/cli/mcp_configure.py +672 -98
  35. mcp_ticketer/cli/mcp_server_commands.py +415 -0
  36. mcp_ticketer/cli/platform_detection.py +77 -12
  37. mcp_ticketer/cli/platform_installer.py +536 -0
  38. mcp_ticketer/cli/project_update_commands.py +350 -0
  39. mcp_ticketer/cli/setup_command.py +639 -0
  40. mcp_ticketer/cli/simple_health.py +12 -10
  41. mcp_ticketer/cli/ticket_commands.py +264 -24
  42. mcp_ticketer/core/__init__.py +28 -6
  43. mcp_ticketer/core/adapter.py +166 -1
  44. mcp_ticketer/core/config.py +21 -21
  45. mcp_ticketer/core/exceptions.py +7 -1
  46. mcp_ticketer/core/label_manager.py +732 -0
  47. mcp_ticketer/core/mappers.py +31 -19
  48. mcp_ticketer/core/models.py +135 -0
  49. mcp_ticketer/core/onepassword_secrets.py +1 -1
  50. mcp_ticketer/core/priority_matcher.py +463 -0
  51. mcp_ticketer/core/project_config.py +132 -14
  52. mcp_ticketer/core/session_state.py +171 -0
  53. mcp_ticketer/core/state_matcher.py +592 -0
  54. mcp_ticketer/core/url_parser.py +425 -0
  55. mcp_ticketer/core/validators.py +69 -0
  56. mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
  57. mcp_ticketer/mcp/server/main.py +106 -25
  58. mcp_ticketer/mcp/server/routing.py +655 -0
  59. mcp_ticketer/mcp/server/server_sdk.py +58 -0
  60. mcp_ticketer/mcp/server/tools/__init__.py +31 -12
  61. mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
  62. mcp_ticketer/mcp/server/tools/attachment_tools.py +6 -8
  63. mcp_ticketer/mcp/server/tools/bulk_tools.py +259 -202
  64. mcp_ticketer/mcp/server/tools/comment_tools.py +74 -12
  65. mcp_ticketer/mcp/server/tools/config_tools.py +1184 -136
  66. mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
  67. mcp_ticketer/mcp/server/tools/hierarchy_tools.py +870 -460
  68. mcp_ticketer/mcp/server/tools/instruction_tools.py +7 -5
  69. mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
  70. mcp_ticketer/mcp/server/tools/pr_tools.py +3 -7
  71. mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
  72. mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
  73. mcp_ticketer/mcp/server/tools/search_tools.py +180 -97
  74. mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
  75. mcp_ticketer/mcp/server/tools/ticket_tools.py +1070 -123
  76. mcp_ticketer/mcp/server/tools/user_ticket_tools.py +218 -236
  77. mcp_ticketer/queue/worker.py +1 -1
  78. mcp_ticketer/utils/__init__.py +5 -0
  79. mcp_ticketer/utils/token_utils.py +246 -0
  80. mcp_ticketer-2.0.1.dist-info/METADATA +1366 -0
  81. mcp_ticketer-2.0.1.dist-info/RECORD +122 -0
  82. mcp_ticketer-0.12.0.dist-info/METADATA +0 -550
  83. mcp_ticketer-0.12.0.dist-info/RECORD +0 -91
  84. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.0.1.dist-info}/WHEEL +0 -0
  85. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.0.1.dist-info}/entry_points.txt +0 -0
  86. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.0.1.dist-info}/licenses/LICENSE +0 -0
  87. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1366 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-ticketer
3
+ Version: 2.0.1
4
+ Summary: Universal ticket management interface for AI agents with MCP support
5
+ Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
6
+ Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/mcp-ticketer/mcp-ticketer
9
+ Project-URL: Documentation, https://mcp-ticketer.readthedocs.io
10
+ Project-URL: Repository, https://github.com/mcp-ticketer/mcp-ticketer
11
+ Project-URL: Issues, https://github.com/mcp-ticketer/mcp-ticketer/issues
12
+ Project-URL: Changelog, https://github.com/mcp-ticketer/mcp-ticketer/blob/main/CHANGELOG.md
13
+ Keywords: mcp,tickets,jira,linear,github,issue-tracking,project-management,ai,automation,agent,ticketing
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: System Administrators
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: Implementation :: CPython
26
+ Classifier: Topic :: Software Development :: Libraries
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Classifier: Topic :: Software Development :: Bug Tracking
29
+ Classifier: Topic :: System :: Monitoring
30
+ Classifier: Topic :: Internet :: WWW/HTTP
31
+ Classifier: Typing :: Typed
32
+ Requires-Python: >=3.10
33
+ Description-Content-Type: text/markdown
34
+ License-File: LICENSE
35
+ Requires-Dist: gql[httpx]>=3.0.0
36
+ Requires-Dist: httpx>=0.25.0
37
+ Requires-Dist: mcp>=1.2.0
38
+ Requires-Dist: psutil>=5.9.0
39
+ Requires-Dist: pydantic>=2.0
40
+ Requires-Dist: python-dotenv>=1.0.0
41
+ Requires-Dist: pyyaml>=6.0.0
42
+ Requires-Dist: rich>=13.0.0
43
+ Requires-Dist: tomli>=2.0.0; python_version < "3.11"
44
+ Requires-Dist: tomli-w>=1.0.0
45
+ Requires-Dist: typer>=0.9.0
46
+ Requires-Dist: typing-extensions>=4.8.0
47
+ Provides-Extra: all
48
+ Requires-Dist: mcp-ticketer[analysis,github,jira,linear,mcp]; extra == "all"
49
+ Provides-Extra: dev
50
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
51
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
52
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
53
+ Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
54
+ Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
55
+ Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
56
+ Requires-Dist: black>=23.0.0; extra == "dev"
57
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
58
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
59
+ Requires-Dist: tox>=4.11.0; extra == "dev"
60
+ Requires-Dist: pre-commit>=3.5.0; extra == "dev"
61
+ Requires-Dist: bump2version>=1.0.1; extra == "dev"
62
+ Provides-Extra: docs
63
+ Requires-Dist: sphinx>=7.2.0; extra == "docs"
64
+ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
65
+ Requires-Dist: sphinx-autodoc-typehints>=1.25.0; extra == "docs"
66
+ Requires-Dist: sphinx-click>=5.1.0; extra == "docs"
67
+ Requires-Dist: myst-parser>=2.0.0; extra == "docs"
68
+ Provides-Extra: mcp
69
+ Requires-Dist: mcp>=1.2.0; extra == "mcp"
70
+ Provides-Extra: jira
71
+ Requires-Dist: jira>=3.5.0; extra == "jira"
72
+ Requires-Dist: ai-trackdown-pytools>=1.5.0; extra == "jira"
73
+ Provides-Extra: linear
74
+ Requires-Dist: gql[httpx]>=3.0.0; extra == "linear"
75
+ Provides-Extra: github
76
+ Requires-Dist: PyGithub>=2.1.0; extra == "github"
77
+ Provides-Extra: analysis
78
+ Requires-Dist: scikit-learn>=1.3.0; extra == "analysis"
79
+ Requires-Dist: rapidfuzz>=3.0.0; extra == "analysis"
80
+ Requires-Dist: numpy>=1.24.0; extra == "analysis"
81
+ Provides-Extra: test
82
+ Requires-Dist: pytest>=7.4.0; extra == "test"
83
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
84
+ Requires-Dist: pytest-cov>=4.1.0; extra == "test"
85
+ Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
86
+ Requires-Dist: pytest-mock>=3.12.0; extra == "test"
87
+ Requires-Dist: pytest-xdist>=3.0.0; extra == "test"
88
+ Requires-Dist: responses>=0.24.0; extra == "test"
89
+ Dynamic: license-file
90
+
91
+ # MCP Ticketer
92
+
93
+ [![PyPI - Version](https://img.shields.io/pypi/v/mcp-ticketer.svg)](https://pypi.org/project/mcp-ticketer)
94
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mcp-ticketer.svg)](https://pypi.org/project/mcp-ticketer)
95
+ [![Documentation Status](https://readthedocs.org/projects/mcp-ticketer/badge/?version=latest)](https://mcp-ticketer.readthedocs.io/en/latest/?badge=latest)
96
+ [![Tests](https://github.com/mcp-ticketer/mcp-ticketer/workflows/Tests/badge.svg)](https://github.com/mcp-ticketer/mcp-ticketer/actions)
97
+ [![Coverage Status](https://codecov.io/gh/mcp-ticketer/mcp-ticketer/branch/main/graph/badge.svg)](https://codecov.io/gh/mcp-ticketer/mcp-ticketer)
98
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
99
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
100
+
101
+ Universal ticket management interface for AI agents with MCP (Model Context Protocol) support.
102
+
103
+ ## 🚀 Features
104
+
105
+ - **🎯 Universal Ticket Model**: Simplified to Epic, Task, and Comment types
106
+ - **🔌 Multiple Adapters**: Support for JIRA, Linear, GitHub Issues, and AI-Trackdown
107
+ - **🤖 MCP Integration**: Native support for AI agent interactions
108
+ - **⚡ High Performance**: Smart caching and async operations
109
+ - **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
110
+ - **📊 State Machine**: Built-in state transitions with validation
111
+ - **🔍 Advanced Search**: Full-text search with multiple filters
112
+ - **🔗 Hierarchy Navigation**: Parent issue lookup and filtered sub-issue retrieval
113
+ - **👤 Smart Assignment**: Dedicated assignment tool with URL support and audit trails
114
+ - **🏷️ Label Management**: Intelligent label organization, deduplication, and cleanup with fuzzy matching
115
+ - **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
116
+ - **📝 Custom Instructions**: Customize ticket writing guidelines for your team
117
+ - **🔬 PM Monitoring Tools**: Detect duplicate tickets, identify stale work, and find orphaned tickets
118
+ - **📦 Easy Installation**: Available on PyPI with simple pip install
119
+ - **🚀 Auto-Dependency Install**: Automatic adapter dependency detection and installation
120
+ - **💾 Compact Mode**: 70% token reduction for AI agent ticket list queries (v0.15.0+)
121
+
122
+ ## ⚡ Token Efficiency
123
+
124
+ MCP Ticketer is optimized for AI agent usage with built-in token management:
125
+
126
+ - **20k Token Limit**: All tool responses stay under 20,000 tokens
127
+ - **Automatic Pagination**: Tools that could exceed limits support pagination
128
+ - **Compact Mode**: Minimal responses (15 tokens vs 185 per ticket)
129
+ - **Progressive Disclosure**: Summary first, details on demand
130
+
131
+ See [📄 Token Pagination](#-token-pagination-v131) section below for quick start, or [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) for detailed technical guide.
132
+
133
+ ## 📦 Installation
134
+
135
+ ### From PyPI (Recommended)
136
+
137
+ ```bash
138
+ pip install mcp-ticketer
139
+
140
+ # Install with specific adapters
141
+ pip install mcp-ticketer[jira] # JIRA support
142
+ pip install mcp-ticketer[linear] # Linear support
143
+ pip install mcp-ticketer[github] # GitHub Issues support
144
+ pip install mcp-ticketer[analysis] # PM monitoring tools
145
+ pip install mcp-ticketer[all] # All adapters and features
146
+ ```
147
+
148
+ **Note (v0.15.0+)**: The `setup` command now automatically detects and installs adapter dependencies! When you run `mcp-ticketer setup`, it will prompt you to install any missing adapter-specific dependencies, eliminating the need for manual `pip install mcp-ticketer[adapter]` after setup.
149
+
150
+ ### From Source
151
+
152
+ ```bash
153
+ git clone https://github.com/mcp-ticketer/mcp-ticketer.git
154
+ cd mcp-ticketer
155
+ pip install -e .
156
+ ```
157
+
158
+ ### Requirements
159
+
160
+ - Python 3.9+
161
+ - Virtual environment (recommended)
162
+
163
+ ## 🤖 Supported AI Clients
164
+
165
+ MCP Ticketer integrates with multiple AI clients via the Model Context Protocol (MCP):
166
+
167
+ | AI Client | Support | Config Type | Project-Level | Setup Command |
168
+ |-----------|---------|-------------|---------------|---------------|
169
+ | **Claude Code** | ✅ Native | JSON | ✅ Yes | `mcp-ticketer install claude-code` |
170
+ | **Claude Desktop** | ✅ Full | JSON | ❌ Global only | `mcp-ticketer install claude-desktop` |
171
+ | **Gemini CLI** | ✅ Full | JSON | ✅ Yes | `mcp-ticketer install gemini` |
172
+ | **Codex CLI** | ✅ Full | TOML | ❌ Global only | `mcp-ticketer install codex` |
173
+ | **Auggie** | ✅ Full | JSON | ❌ Global only | `mcp-ticketer install auggie` |
174
+
175
+ ### Quick MCP Setup
176
+
177
+ ```bash
178
+ # Initialize adapter first (required)
179
+ mcp-ticketer init --adapter aitrackdown
180
+
181
+ # Auto-detection (Recommended) - Interactive platform selection
182
+ mcp-ticketer install # Auto-detect and prompt for platform
183
+
184
+ # See all detected platforms
185
+ mcp-ticketer install --auto-detect # Show what's installed on your system
186
+
187
+ # Install for all detected platforms at once
188
+ mcp-ticketer install --all # Configure all detected code editors
189
+
190
+ # Or install for specific platform
191
+ mcp-ticketer install claude-code # Claude Code (project-level)
192
+ mcp-ticketer install claude-desktop # Claude Desktop (global)
193
+ mcp-ticketer install gemini # Gemini CLI
194
+ mcp-ticketer install codex # Codex CLI
195
+ mcp-ticketer install auggie # Auggie
196
+ ```
197
+
198
+ #### Installation Scope (v1.4+)
199
+
200
+ By default, `mcp-ticketer install` focuses on **code editors only**:
201
+ - ✅ Claude Code
202
+ - ✅ Cursor
203
+ - ✅ Auggie
204
+ - ✅ Codex
205
+ - ✅ Gemini
206
+
207
+ **Why code editors only?** Code editors are project-scoped tools designed for working with codebases. Claude Desktop is a general-purpose AI assistant. This separation ensures mcp-ticketer is configured where it provides the most value.
208
+
209
+ **Including Claude Desktop**:
210
+
211
+ To also install for Claude Desktop (AI assistant), use the `--include-desktop` flag:
212
+
213
+ ```bash
214
+ # Install for all platforms including Claude Desktop
215
+ mcp-ticketer install --all --include-desktop
216
+
217
+ # Auto-detect including Claude Desktop
218
+ mcp-ticketer install --auto-detect --include-desktop
219
+
220
+ # Install ONLY Claude Desktop
221
+ mcp-ticketer install claude-desktop
222
+ ```
223
+
224
+ **See [AI Client Integration Guide](docs/integrations/AI_CLIENT_INTEGRATION.md) for detailed setup instructions.**
225
+
226
+ ## 🚀 Quick Start
227
+
228
+ ### 1. Initialize Configuration
229
+
230
+ ```bash
231
+ # For AI-Trackdown (local file-based)
232
+ mcp-ticketer init --adapter aitrackdown
233
+
234
+ # For Linear (requires API key)
235
+ # Option 1: Using team URL (easiest - paste your Linear team issues URL)
236
+ mcp-ticketer init --adapter linear --team-url https://linear.app/your-org/team/ENG/active
237
+
238
+ # Option 2: Using team key
239
+ mcp-ticketer init --adapter linear --team-key ENG
240
+
241
+ # Option 3: Using team ID
242
+ mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
243
+
244
+ # For JIRA (requires server and credentials)
245
+ mcp-ticketer init --adapter jira \
246
+ --jira-server https://company.atlassian.net \
247
+ --jira-email your.email@company.com
248
+
249
+ # For GitHub Issues
250
+ mcp-ticketer init --adapter github --repo owner/repo
251
+ ```
252
+
253
+ **Note:** The following commands are synonymous and can be used interchangeably:
254
+ - `mcp-ticketer init` - Initialize configuration
255
+ - `mcp-ticketer install` - Install and configure (same as init)
256
+ - `mcp-ticketer setup` - Setup (same as init)
257
+
258
+ #### Automatic Validation
259
+
260
+ The init command now automatically validates your configuration after setup:
261
+ - Valid credentials → Setup completes immediately
262
+ - Invalid credentials → You'll be prompted to:
263
+ 1. Re-enter configuration (up to 3 retries)
264
+ 2. Continue anyway (skip validation)
265
+ 3. Exit and fix manually
266
+
267
+ You can always re-validate later with: `mcp-ticketer doctor`
268
+
269
+ ### 2. Create Your First Ticket
270
+
271
+ ```bash
272
+ mcp-ticketer create "Fix login bug" \
273
+ --description "Users cannot login with OAuth" \
274
+ --priority high \
275
+ --assignee "john.doe"
276
+ ```
277
+
278
+ ### 3. Manage Tickets
279
+
280
+ ```bash
281
+ # List open tickets
282
+ mcp-ticketer list --state open
283
+
284
+ # Show ticket details
285
+ mcp-ticketer show TICKET-123 --comments
286
+
287
+ # Update ticket
288
+ mcp-ticketer update TICKET-123 --priority critical
289
+
290
+ # Transition state
291
+ mcp-ticketer transition TICKET-123 in_progress
292
+
293
+ # Search tickets
294
+ mcp-ticketer search "login bug" --state open
295
+ ```
296
+
297
+ ### 4. Working with Attachments (AITrackdown)
298
+
299
+ ```bash
300
+ # Working with attachments through MCP
301
+ # (Requires MCP server running - see MCP Server Integration section)
302
+
303
+ # Attachments are managed through your AI client when using MCP
304
+ # Ask your AI assistant: "Add the document.pdf as an attachment to task-123"
305
+ ```
306
+
307
+ For programmatic access, see the [Attachments Guide](docs/integrations/ATTACHMENTS.md).
308
+
309
+ ### 5. Customize Ticket Writing Instructions
310
+
311
+ Customize ticket guidelines to match your team's conventions:
312
+
313
+ ```bash
314
+ # View current instructions
315
+ mcp-ticketer instructions show
316
+
317
+ # Add custom instructions from file
318
+ mcp-ticketer instructions add team_guidelines.md
319
+
320
+ # Edit instructions interactively
321
+ mcp-ticketer instructions edit
322
+
323
+ # Reset to defaults
324
+ mcp-ticketer instructions delete --yes
325
+ ```
326
+
327
+ **Example custom instructions:**
328
+ ```markdown
329
+ # Our Team's Ticket Guidelines
330
+
331
+ ## Title Format
332
+ [TEAM-ID] [Type] Brief description
333
+
334
+ ## Required Sections
335
+ 1. Problem Statement
336
+ 2. Acceptance Criteria (minimum 3)
337
+ 3. Testing Notes
338
+ ```
339
+
340
+ For details, see the [Ticket Instructions Guide](docs/user-docs/features/ticket_instructions.md).
341
+
342
+ ### 6. PM Monitoring Tools
343
+
344
+ Maintain ticket health with automated analysis and cleanup tools:
345
+
346
+ ```bash
347
+ # Install analysis dependencies first
348
+ pip install "mcp-ticketer[analysis]"
349
+
350
+ # Find duplicate or similar tickets
351
+ mcp-ticketer analyze similar --threshold 0.8
352
+
353
+ # Identify stale tickets that may need closing
354
+ mcp-ticketer analyze stale --age-days 90 --inactive-days 30
355
+
356
+ # Find orphaned tickets without parent epic/project
357
+ mcp-ticketer analyze orphaned
358
+
359
+ # Generate comprehensive cleanup report
360
+ mcp-ticketer analyze cleanup --format markdown
361
+ ```
362
+
363
+ **Available MCP tools:**
364
+ - `ticket_find_similar` - Detect duplicate tickets using TF-IDF and cosine similarity
365
+ - `ticket_find_stale` - Identify inactive tickets that may need closing
366
+ - `ticket_find_orphaned` - Find tickets without proper hierarchy
367
+ - `ticket_cleanup_report` - Generate comprehensive analysis report
368
+
369
+ **Key features:**
370
+ - **Similarity Detection**: TF-IDF vectorization with fuzzy matching and tag overlap
371
+ - **Staleness Scoring**: Multi-factor analysis (age, inactivity, priority, state)
372
+ - **Orphan Detection**: Identify tickets missing parent epics or projects
373
+ - **Actionable Insights**: Automated suggestions for merge, link, close, or assign actions
374
+
375
+ For complete documentation, see the [PM Monitoring Tools Guide](docs/PM_MONITORING_TOOLS.md).
376
+
377
+ ### 7. Linear Practical Workflow CLI
378
+
379
+ Streamline your daily Linear workflow with command-line shortcuts for common operations:
380
+
381
+ ```bash
382
+ # Quick ticket creation with auto-tagging
383
+ ./ops/scripts/linear/practical-workflow.sh create-bug "Login fails" "Error 500" --priority high
384
+ ./ops/scripts/linear/practical-workflow.sh create-feature "Dark mode" "Add theme toggle"
385
+ ./ops/scripts/linear/practical-workflow.sh create-task "Update docs" "Refresh API docs"
386
+
387
+ # Workflow shortcuts
388
+ ./ops/scripts/linear/practical-workflow.sh start-work BTA-123
389
+ ./ops/scripts/linear/practical-workflow.sh ready-review BTA-123
390
+ ./ops/scripts/linear/practical-workflow.sh deployed BTA-123
391
+
392
+ # Comments
393
+ ./ops/scripts/linear/practical-workflow.sh add-comment BTA-123 "Working on this now"
394
+ ./ops/scripts/linear/practical-workflow.sh list-comments BTA-123
395
+ ```
396
+
397
+ **Key features:**
398
+ - **Auto-Tagging**: Automatically applies `bug`, `feature`, or `task` labels
399
+ - **Quick Commands**: Common workflow actions as single commands
400
+ - **Comment Tracking**: Add and list comments directly from CLI
401
+ - **Environment Validation**: Built-in configuration checks
402
+
403
+ **Setup:**
404
+ ```bash
405
+ # Copy configuration template
406
+ cp ops/scripts/linear/.env.example .env
407
+
408
+ # Edit with your Linear API key and team key
409
+ # LINEAR_API_KEY=lin_api_...
410
+ # LINEAR_TEAM_KEY=BTA
411
+
412
+ # Test configuration
413
+ ./ops/scripts/linear/practical-workflow.sh --help
414
+ ```
415
+
416
+ For complete documentation, see [Linear Workflow CLI Guide](ops/scripts/linear/README.md).
417
+
418
+ ### 8. Project Status Updates
419
+
420
+ Track project progress with status updates across Linear, GitHub V2, and Asana:
421
+
422
+ ```bash
423
+ # Create update with health indicator
424
+ mcp-ticketer project-update create "mcp-ticketer-eac28953c267" \
425
+ "Completed MCP tools implementation. CLI commands in progress." \
426
+ --health on_track
427
+
428
+ # Create update using full URL
429
+ mcp-ticketer project-update create \
430
+ "https://linear.app/1m-hyperdev/project/mcp-ticketer-eac28953c267/updates" \
431
+ "Sprint review completed successfully" \
432
+ --health on_track
433
+
434
+ # List recent updates
435
+ mcp-ticketer project-update list "mcp-ticketer-eac28953c267" --limit 10
436
+
437
+ # Get detailed update
438
+ mcp-ticketer project-update get "update-uuid-here"
439
+ ```
440
+
441
+ **Key features:**
442
+ - **Health Indicators**: 5 status levels (on_track, at_risk, off_track, complete, inactive)
443
+ - **Flexible Project ID**: Supports UUID, slug ID, short ID, or full URLs
444
+ - **Rich Formatting**: Color-coded health indicators and formatted tables
445
+ - **MCP Tools**: Programmatic access via `project_update_create`, `project_update_list`, `project_update_get`
446
+ - **Cross-Platform**: Linear (native), GitHub V2, Asana, Jira (workaround)
447
+
448
+ For complete documentation, see [Linear Setup Guide](docs/integrations/setup/LINEAR_SETUP.md#project-status-updates).
449
+
450
+ ## 📄 Token Pagination (v1.3.1)
451
+
452
+ ### Overview
453
+
454
+ mcp-ticketer implements intelligent token pagination to prevent context overflow when working with large datasets. The MCP server automatically paginates responses that exceed 20,000 tokens, ensuring Claude conversations remain responsive and efficient.
455
+
456
+ ### Why Pagination Matters
457
+
458
+ Working with large ticket systems can quickly consume your AI context window:
459
+
460
+ - **Context Protection**: Large ticket lists can consume 50k+ tokens, leaving little room for conversation
461
+ - **Performance**: Prevents timeout errors when fetching 100+ tickets
462
+ - **Reliability**: Guarantees predictable response sizes regardless of dataset size
463
+ - **Efficiency**: Enables working with projects containing 500+ tickets without context overflow
464
+
465
+ ### Quick Start
466
+
467
+ Pagination is **automatic** - you don't need to configure anything. Tools intelligently paginate when responses approach 20k tokens:
468
+
469
+ ```python
470
+ # Compact mode (default) - Minimal token usage
471
+ tickets = await ticket_list(limit=20, compact=True) # ~300 tokens
472
+
473
+ # Full mode - When you need all details
474
+ tickets = await ticket_list(limit=20, compact=False) # ~3,700 tokens
475
+
476
+ # Large datasets - Automatic pagination kicks in
477
+ labels = await label_list(limit=100) # ~1,500 tokens (safe)
478
+ ```
479
+
480
+ ### Paginated MCP Tools
481
+
482
+ The following tools support automatic token pagination with intelligent limits:
483
+
484
+ | Tool | Description | Default Limit | Max Safe Limit | Token Estimate |
485
+ |------|-------------|---------------|----------------|----------------|
486
+ | `ticket_list` | List tickets with filters | 20 tickets | 100 (compact) | 15-185 tokens/ticket |
487
+ | `ticket_search` | Search tickets by query | 10 tickets | 50 | 200-500 tokens/result |
488
+ | `label_list` | List all labels | 100 labels | 500 | 10-15 tokens/label |
489
+ | `ticket_find_similar` | Find duplicate tickets | 10 results | 50 results | 200-500 tokens/result |
490
+ | `ticket_cleanup_report` | Generate cleanup report | Summary mode | Full report | 1k-8k tokens |
491
+
492
+ **Note**: All tools stay under the 20,000 token limit per response.
493
+
494
+ ### Usage Examples
495
+
496
+ #### Example 1: Basic Ticket Listing (Optimal)
497
+
498
+ ```python
499
+ # Default settings optimized for AI agents
500
+ result = await ticket_list() # Uses limit=20, compact=True
501
+ # Returns ~300 tokens - perfect for conversations
502
+
503
+ # Response includes:
504
+ {
505
+ "items": [...], # Tickets with id, title, state, priority, assignee
506
+ "count": 20, # Items in this response
507
+ "total": 150, # Total tickets available
508
+ "has_more": True, # More pages exist
509
+ "estimated_tokens": 300 # Approximate token usage
510
+ }
511
+ ```
512
+
513
+ #### Example 2: Fetching More Data (Continuation)
514
+
515
+ ```python
516
+ # Get first page
517
+ page1 = await ticket_list(limit=50, offset=0, compact=True)
518
+ print(f"Showing {page1['count']} of {page1['total']} tickets")
519
+ # ~750 tokens (safe)
520
+
521
+ # Check if more pages exist
522
+ if page1['has_more']:
523
+ # Get next page
524
+ page2 = await ticket_list(limit=50, offset=50, compact=True)
525
+ # Continue paginating as needed...
526
+ ```
527
+
528
+ #### Example 3: Handling Large Projects (500+ Tickets)
529
+
530
+ ```python
531
+ # Progressive disclosure pattern for large projects
532
+ # 1. Start with summary (minimal tokens)
533
+ summary = await ticket_cleanup_report(summary_only=True) # ~1k tokens
534
+ print(f"Project has {summary['total_issues']} potential issues")
535
+
536
+ # 2. Get compact list to filter
537
+ tickets = await ticket_list(
538
+ state="in_progress",
539
+ priority="high",
540
+ limit=20,
541
+ compact=True # Only 300 tokens
542
+ )
543
+
544
+ # 3. Fetch full details only for selected tickets
545
+ for ticket_summary in tickets['items'][:5]: # Top 5 only
546
+ full_ticket = await ticket_read(ticket_summary['id']) # ~200 tokens each
547
+ # Process full ticket details...
548
+ ```
549
+
550
+ #### Example 4: Search with Pagination
551
+
552
+ ```python
553
+ # Search returns paginated results automatically
554
+ results = await ticket_search(
555
+ query="authentication bug",
556
+ state="open",
557
+ limit=10 # Safe limit for search results
558
+ )
559
+ # ~3k-5k tokens (includes relevance scoring)
560
+
561
+ # Access results
562
+ for ticket in results['items']:
563
+ print(f"{ticket['id']}: {ticket['title']} (score: {ticket['relevance_score']})")
564
+ ```
565
+
566
+ ### Token Optimization Tips
567
+
568
+ **Use compact mode by default** (70% token reduction):
569
+ ```python
570
+ # ✅ Good: Compact mode for browsing
571
+ tickets = await ticket_list(limit=50, compact=True) # ~750 tokens
572
+
573
+ # ❌ Avoid: Full mode with large limits
574
+ tickets = await ticket_list(limit=100, compact=False) # ~18,500 tokens (too close to limit!)
575
+ ```
576
+
577
+ **Progressive disclosure** (fetch details on demand):
578
+ ```python
579
+ # ✅ Good: Summary first, details on demand
580
+ summary = await ticket_list(limit=50, compact=True)
581
+ # Then fetch full details only for tickets you need
582
+ for ticket in important_tickets:
583
+ details = await ticket_read(ticket['id'])
584
+ ```
585
+
586
+ **Paginate large datasets**:
587
+ ```python
588
+ # ✅ Good: Process in batches
589
+ all_labels = []
590
+ offset = 0
591
+ while True:
592
+ batch = await label_list(limit=100, offset=offset)
593
+ all_labels.extend(batch['labels'])
594
+ if not batch['has_more']:
595
+ break
596
+ offset += 100
597
+ ```
598
+
599
+ ### Configuration
600
+
601
+ Pagination is automatic and requires no configuration. However, you can control response size through parameters:
602
+
603
+ ```python
604
+ # Adjust limit per tool (within safe maximums)
605
+ tickets = await ticket_list(limit=50) # Increase from default 20
606
+
607
+ # Use compact mode to maximize items per response
608
+ tickets = await ticket_list(limit=100, compact=True) # Safe with compact mode
609
+
610
+ # Use summary_only for analysis tools
611
+ report = await ticket_cleanup_report(summary_only=True) # Minimal tokens
612
+ ```
613
+
614
+ ### Response Fields
615
+
616
+ All paginated tools return these metadata fields:
617
+
618
+ ```python
619
+ {
620
+ "status": "completed",
621
+ "items": [...], # Results (tickets, labels, etc.)
622
+ "count": 20, # Items in this response
623
+ "total": 150, # Total items available (if known)
624
+ "offset": 0, # Offset used for this page
625
+ "limit": 20, # Limit used for this page
626
+ "has_more": true, # Whether more pages exist
627
+ "truncated_by_tokens": false, # Whether token limit was hit before item limit
628
+ "estimated_tokens": 2500 # Approximate tokens in response
629
+ }
630
+ ```
631
+
632
+ ### Learn More
633
+
634
+ - **Comprehensive Guide**: [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) - Detailed technical documentation
635
+ - Token estimation algorithms
636
+ - Per-tool optimization strategies
637
+ - Advanced pagination patterns
638
+ - Troubleshooting guide
639
+ - **Code Examples**: [examples/token_pagination_examples.py](examples/token_pagination_examples.py) - Runnable examples
640
+ - **Migration from v1.2.x**: No breaking changes - existing code works with automatic pagination
641
+
642
+ ---
643
+
644
+ ## 🎯 Project Status Analysis (NEW in v1.3.0)
645
+
646
+ Get intelligent project health assessments and actionable work plans with automated dependency analysis, blocker detection, and smart recommendations.
647
+
648
+ ### Overview
649
+
650
+ The Project Status Analysis feature provides PM agents with comprehensive project insights:
651
+
652
+ - **Health Assessment**: Automated scoring (on_track, at_risk, off_track)
653
+ - **Dependency Analysis**: Critical path detection and blocker identification
654
+ - **Smart Recommendations**: Top 3 tickets to start next with reasoning
655
+ - **Work Distribution**: Team workload analysis and balance checking
656
+ - **Progress Tracking**: Completion rates and timeline risk assessment
657
+
658
+ ### Quick Start
659
+
660
+ ```python
661
+ # Get project status analysis (uses default_project from config)
662
+ result = await project_status()
663
+
664
+ # Analyze specific project
665
+ result = await project_status(project_id="eac28953c267")
666
+ ```
667
+
668
+ **Example response:**
669
+ ```json
670
+ {
671
+ "status": "success",
672
+ "project_id": "eac28953c267",
673
+ "project_name": "MCP Ticketer",
674
+ "health": "at_risk",
675
+ "summary": {
676
+ "total": 12,
677
+ "open": 5,
678
+ "in_progress": 4,
679
+ "done": 3
680
+ },
681
+ "recommended_next": [
682
+ {
683
+ "ticket_id": "1M-317",
684
+ "title": "Fix critical bug",
685
+ "priority": "critical",
686
+ "reason": "Critical priority, Unblocks 2 tickets",
687
+ "blocks": ["1M-315", "1M-316"]
688
+ }
689
+ ],
690
+ "recommendations": [
691
+ "🔓 Resolve 1M-317 first (critical) - Unblocks 2 tickets",
692
+ "⚡ Project is AT RISK - Monitor closely"
693
+ ]
694
+ }
695
+ ```
696
+
697
+ ### Features
698
+
699
+ #### 🏥 Health Assessment
700
+ Automated project health scoring based on:
701
+ - **Completion Rate**: % of tickets done
702
+ - **Progress Rate**: % of tickets actively worked
703
+ - **Blocker Rate**: % of tickets blocked (negative factor)
704
+ - **Priority Balance**: Critical/high priority completion
705
+
706
+ **Health Levels:**
707
+ - `on_track`: Project progressing well (health score ≥ 0.7)
708
+ - `at_risk`: Some concerns, needs monitoring (0.4-0.7)
709
+ - `off_track`: Serious issues, intervention needed (< 0.4)
710
+
711
+ #### 🔗 Dependency Analysis
712
+ Automatic dependency graph construction from ticket descriptions:
713
+
714
+ **Supported patterns:**
715
+ - "Depends on TICKET-123"
716
+ - "Blocks #456"
717
+ - "Related to PROJ-789"
718
+ - "1M-316: Feature name" (inline references)
719
+
720
+ **Insights:**
721
+ - **Critical Path**: Longest dependency chain
722
+ - **High-Impact Tickets**: Tickets blocking the most work
723
+ - **Blockers**: Active blockers preventing progress
724
+
725
+ #### 🎯 Smart Recommendations
726
+ Intelligent ticket prioritization based on:
727
+ 1. **Priority** (critical > high > medium > low)
728
+ 2. **Impact** (tickets blocking others score higher)
729
+ 3. **Critical Path** (tickets on longest chain prioritized)
730
+ 4. **Blockers** (unblocked tickets preferred)
731
+ 5. **State** (open/ready tickets ranked higher)
732
+
733
+ Returns top 3 tickets to start next with clear reasoning.
734
+
735
+ #### 👥 Work Distribution Analysis
736
+ Team workload analysis showing:
737
+ - Tickets per assignee
738
+ - State breakdown per assignee
739
+ - Workload imbalance detection
740
+
741
+ ### Usage Examples
742
+
743
+ #### Basic Project Health Check
744
+ ```python
745
+ # Get health of default project
746
+ status = await project_status()
747
+
748
+ print(f"Health: {status['health']}")
749
+ print(f"Total tickets: {status['summary']['total']}")
750
+ print(f"Completion: {status['health_metrics']['completion_rate']:.1%}")
751
+ ```
752
+
753
+ #### Analyze Specific Project
754
+ ```python
755
+ # Analyze by project ID
756
+ status = await project_status(project_id="eac28953c267")
757
+
758
+ # Check for critical issues
759
+ if status['health'] == 'off_track':
760
+ print("⚠️ Project needs immediate attention!")
761
+ for rec in status['recommendations']:
762
+ print(f" • {rec}")
763
+ ```
764
+
765
+ #### Get Next Actions
766
+ ```python
767
+ # Get recommended tickets to work on
768
+ status = await project_status()
769
+
770
+ print("Top priorities:")
771
+ for ticket in status['recommended_next']:
772
+ print(f" {ticket['ticket_id']}: {ticket['title']}")
773
+ print(f" Priority: {ticket['priority']}")
774
+ print(f" Reason: {ticket['reason']}")
775
+ if ticket['blocks']:
776
+ print(f" Unblocks: {', '.join(ticket['blocks'])}")
777
+ ```
778
+
779
+ #### Identify Blockers
780
+ ```python
781
+ # Find what's blocking progress
782
+ status = await project_status()
783
+
784
+ if status['blockers']:
785
+ print("🚧 Active blockers:")
786
+ for blocker in status['blockers']:
787
+ print(f" {blocker['ticket_id']}: {blocker['title']}")
788
+ print(f" Blocking {blocker['blocks_count']} tickets")
789
+ print(f" State: {blocker['state']}, Priority: {blocker['priority']}")
790
+ ```
791
+
792
+ #### PM Daily Standup Workflow
793
+ ```python
794
+ # Complete PM workflow for daily standup
795
+ async def daily_standup():
796
+ status = await project_status()
797
+
798
+ # 1. Overall health
799
+ print(f"📊 Project Health: {status['health'].upper()}")
800
+ print(f" Completion: {status['health_metrics']['completion_rate']:.0%}")
801
+ print(f" In Progress: {status['summary'].get('in_progress', 0)} tickets")
802
+
803
+ # 2. Blockers
804
+ if status['blockers']:
805
+ print(f"\n🚧 {len(status['blockers'])} Active Blockers:")
806
+ for blocker in status['blockers'][:3]:
807
+ print(f" • {blocker['ticket_id']}: {blocker['title']}")
808
+
809
+ # 3. Next actions
810
+ print(f"\n🎯 Top Priorities:")
811
+ for ticket in status['recommended_next']:
812
+ print(f" • {ticket['ticket_id']}: {ticket['reason']}")
813
+
814
+ # 4. Recommendations
815
+ print(f"\n💡 Recommendations:")
816
+ for rec in status['recommendations']:
817
+ print(f" • {rec}")
818
+ ```
819
+
820
+ ### Configuration
821
+
822
+ Set default project for automatic analysis:
823
+
824
+ ```bash
825
+ # Via CLI
826
+ mcp-ticketer config set-project eac28953c267
827
+
828
+ # Via MCP tool
829
+ result = await config_set_default_project(project_id="eac28953c267")
830
+ ```
831
+
832
+ ### Advanced Usage
833
+
834
+ #### Health Metrics Deep Dive
835
+ ```python
836
+ status = await project_status()
837
+ metrics = status['health_metrics']
838
+
839
+ print(f"Health Score: {metrics['health_score']:.2f}/1.00")
840
+ print(f"Completion Rate: {metrics['completion_rate']:.1%}")
841
+ print(f"Progress Rate: {metrics['progress_rate']:.1%}")
842
+ print(f"Blocked Rate: {metrics['blocked_rate']:.1%}")
843
+ print(f"Critical Tickets: {metrics['critical_count']}")
844
+ print(f"High Priority: {metrics['high_count']}")
845
+ ```
846
+
847
+ #### Critical Path Analysis
848
+ ```python
849
+ status = await project_status()
850
+
851
+ if status['critical_path']:
852
+ print("🛣️ Critical Path (longest dependency chain):")
853
+ for ticket_id in status['critical_path']:
854
+ print(f" → {ticket_id}")
855
+ print(f"\nLength: {len(status['critical_path'])} tickets")
856
+ ```
857
+
858
+ #### Work Distribution
859
+ ```python
860
+ status = await project_status()
861
+
862
+ print("👥 Work Distribution:")
863
+ for assignee, workload in status['work_distribution'].items():
864
+ print(f"\n{assignee}:")
865
+ print(f" Total: {workload['total']}")
866
+ for state, count in workload.items():
867
+ if state != 'total':
868
+ print(f" {state}: {count}")
869
+ ```
870
+
871
+ ### Integration with Other Features
872
+
873
+ #### Combine with Project Updates
874
+ ```python
875
+ # 1. Analyze project status
876
+ status = await project_status(project_id="proj-123")
877
+
878
+ # 2. Create status update with health indicator
879
+ update = await project_update_create(
880
+ project_id="proj-123",
881
+ body=f"Sprint review: {status['summary']['done']} tickets completed",
882
+ health=status['health'] # Use analyzed health
883
+ )
884
+ ```
885
+
886
+ #### Combine with Ticket Management
887
+ ```python
888
+ # 1. Get recommendations
889
+ status = await project_status()
890
+
891
+ # 2. Auto-assign top priority ticket
892
+ if status['recommended_next']:
893
+ top_ticket = status['recommended_next'][0]
894
+ await ticket_assign(
895
+ ticket_id=top_ticket['ticket_id'],
896
+ assignee="john.doe@example.com",
897
+ comment=f"Priority: {top_ticket['reason']}"
898
+ )
899
+ ```
900
+
901
+ ### Learn More
902
+
903
+ - **Comprehensive Guide**: [docs/meta/PROJECT_STATUS.md](docs/meta/PROJECT_STATUS.md) - Full documentation
904
+ - **Runnable Examples**: [examples/project_status_examples.py](examples/project_status_examples.py) - Copy-paste code
905
+ - **PM Monitoring Tools**: [docs/PM_MONITORING_TOOLS.md](docs/PM_MONITORING_TOOLS.md) - Ticket cleanup features
906
+ - **Linear Setup**: [docs/integrations/setup/LINEAR_SETUP.md](docs/integrations/setup/LINEAR_SETUP.md) - Platform-specific guides
907
+
908
+ ## 🤖 MCP Server Integration
909
+
910
+ MCP Ticketer provides seamless integration with AI clients through automatic configuration and platform detection:
911
+
912
+ ```bash
913
+ # Auto-detection (Recommended)
914
+ mcp-ticketer install # Interactive: detect and prompt for platform
915
+ mcp-ticketer install --auto-detect # Show all detected AI platforms
916
+ mcp-ticketer install --all # Install for all detected platforms
917
+ mcp-ticketer install --all --dry-run # Preview what would be installed
918
+
919
+ # Platform-specific installation
920
+ mcp-ticketer install claude-code # For Claude Code (project-level)
921
+ mcp-ticketer install claude-desktop # For Claude Desktop (global)
922
+ mcp-ticketer install gemini # For Gemini CLI
923
+ mcp-ticketer install codex # For Codex CLI
924
+ mcp-ticketer install auggie # For Auggie
925
+
926
+ # Manual MCP server control (advanced)
927
+ mcp-ticketer mcp # Start MCP server in current directory
928
+ mcp-ticketer mcp --path /path/to/project # Start in specific directory
929
+
930
+ # Remove MCP configuration when needed
931
+ mcp-ticketer remove claude-code # Remove from Claude Code
932
+ mcp-ticketer uninstall auggie # Alias for remove
933
+ ```
934
+
935
+ **Configuration is automatic** - the commands above will:
936
+ 1. Detect your mcp-ticketer installation
937
+ 2. Read your adapter configuration
938
+ 3. Generate the appropriate MCP server config
939
+ 4. Save it to the correct location for your AI client
940
+
941
+ #### Claude Code Installation
942
+
943
+ **Automatic (Recommended)**:
944
+ ```bash
945
+ mcp-ticketer install --platform claude-code
946
+ ```
947
+
948
+ The installer automatically detects if you have Claude CLI installed:
949
+ - **With Claude CLI**: Uses native `claude mcp add` command (recommended)
950
+ - **Without Claude CLI**: Falls back to JSON configuration
951
+
952
+ **Manual Installation** (if needed):
953
+ ```bash
954
+ # If you have Claude CLI installed
955
+ claude mcp add --scope local --transport stdio mcp-ticketer \
956
+ -- mcp-ticketer mcp --path $(pwd)
957
+
958
+ # Or configure manually via JSON (legacy method)
959
+ # See manual configuration example below for details
960
+ ```
961
+
962
+ **Note**: Claude CLI provides better validation and error handling.
963
+ Install it from: https://docs.claude.ai/cli
964
+
965
+ For comprehensive details on native CLI support, see [Claude Code Native CLI Feature Documentation](docs/features/claude-code-native-cli.md).
966
+
967
+ **Manual Configuration Example** (Claude Code):
968
+
969
+ Claude Code supports two configuration file locations with automatic detection:
970
+
971
+ **Option 1: Global Configuration** (`~/.config/claude/mcp.json`) - **Recommended**
972
+
973
+ ```json
974
+ {
975
+ "mcpServers": {
976
+ "mcp-ticketer": {
977
+ "command": "/path/to/venv/bin/python",
978
+ "args": ["-m", "mcp_ticketer.mcp.server"],
979
+ "env": {
980
+ "MCP_TICKETER_ADAPTER": "linear",
981
+ "LINEAR_API_KEY": "your_key_here"
982
+ }
983
+ }
984
+ }
985
+ }
986
+ ```
987
+
988
+ **Option 2: Project-Specific Configuration** (`~/.claude.json`)
989
+
990
+ ```json
991
+ {
992
+ "projects": {
993
+ "/absolute/path/to/project": {
994
+ "mcpServers": {
995
+ "mcp-ticketer": {
996
+ "command": "/path/to/venv/bin/python",
997
+ "args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
998
+ "env": {
999
+ "PYTHONPATH": "/absolute/path/to/project",
1000
+ "MCP_TICKETER_ADAPTER": "aitrackdown"
1001
+ }
1002
+ }
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ ```
1008
+
1009
+ **Configuration Priority:**
1010
+ - New location (`~/.config/claude/mcp.json`) checked first
1011
+ - Falls back to old location (`~/.claude.json`) if new location not found
1012
+ - Maintains full backward compatibility with existing configurations
1013
+ - Both locations fully supported
1014
+
1015
+ **Why this pattern?**
1016
+ - **More Reliable**: Uses venv Python directly instead of binary wrapper
1017
+ - **Consistent**: Matches proven mcp-vector-search pattern
1018
+ - **Universal**: Works across pipx, pip, and uv installations
1019
+ - **Better Errors**: Python module invocation provides clearer error messages
1020
+
1021
+ **Automatic Detection**: The `mcp-ticketer install` commands automatically detect your venv Python, configuration location, and generate the correct configuration format.
1022
+
1023
+ **See [AI Client Integration Guide](docs/integrations/AI_CLIENT_INTEGRATION.md) for client-specific details.**
1024
+
1025
+ ## 💾 Compact Mode for AI Agents (v0.15.0+)
1026
+
1027
+ The `ticket_list` MCP tool supports compact mode, reducing token usage by **70%** when listing tickets - perfect for AI agents working with large ticket sets. Compact mode is part of the broader [Token Pagination](#-token-pagination-v131) system introduced in v1.3.1.
1028
+
1029
+ ### Quick Reference
1030
+
1031
+ | Mode | Tokens (100 tickets) | Use Case |
1032
+ |------|---------------------|----------|
1033
+ | **Standard** | ~18,500 tokens | Detailed ticket views, individual ticket processing |
1034
+ | **Compact** | ~5,500 tokens | Dashboards, bulk operations, filtering |
1035
+ | **Savings** | **70% reduction** | Query 3x more tickets in same context window |
1036
+
1037
+ ### Basic Usage
1038
+
1039
+ ```python
1040
+ # Compact mode (recommended default)
1041
+ result = await ticket_list(limit=100, compact=True) # ~5,500 tokens
1042
+
1043
+ # Full mode (when you need all details)
1044
+ result = await ticket_list(limit=20, compact=False) # ~3,700 tokens
1045
+ ```
1046
+
1047
+ ### Fields Returned
1048
+
1049
+ **Compact Mode (7 fields):**
1050
+ - `id`, `title`, `state`, `priority`, `assignee`, `tags`, `parent_epic`
1051
+
1052
+ **Standard Mode (16 fields):**
1053
+ - All compact fields plus: `description`, `created_at`, `updated_at`, `metadata`, `ticket_type`, `estimated_hours`, `actual_hours`, `children`, `parent_issue`
1054
+
1055
+ ### Learn More
1056
+
1057
+ - **Token Pagination**: See [📄 Token Pagination](#-token-pagination-v131) section for comprehensive guide on pagination, token optimization, and best practices
1058
+ - **Technical Details**: [docs/user-docs/features/TOKEN_PAGINATION.md](docs/user-docs/features/TOKEN_PAGINATION.md) - Per-tool token estimates and optimization strategies
1059
+ - **Quick Summary**: [COMPACT_MODE_SUMMARY.md](COMPACT_MODE_SUMMARY.md) - Compact mode reference
1060
+
1061
+ ## ⚙️ Configuration
1062
+
1063
+ ### Quick Setup with MCP Tools (New in v1.x)
1064
+
1065
+ **Simplified Configuration**: New MCP tools reduce adapter setup time from 15-30 minutes to < 3 minutes.
1066
+
1067
+ ```python
1068
+ # 1. List available adapters with configuration status
1069
+ result = await config_list_adapters()
1070
+ # Shows: linear, github, jira, aitrackdown - which are configured
1071
+
1072
+ # 2. Get requirements for your adapter
1073
+ requirements = await config_get_adapter_requirements("linear")
1074
+ # Shows: api_key (required), team_id (optional)
1075
+
1076
+ # 3. Configure adapter with one-call setup wizard
1077
+ result = await config_setup_wizard(
1078
+ adapter_type="linear",
1079
+ credentials={
1080
+ "api_key": "lin_api_...",
1081
+ "team_id": "ENG" # or team UUID
1082
+ }
1083
+ )
1084
+ # Validates, tests connection, and saves configuration
1085
+ ```
1086
+
1087
+ **Benefits:**
1088
+ - ✅ Automatic validation and connection testing
1089
+ - ✅ Clear error messages with actionable guidance
1090
+ - ✅ One-call setup (no chaining multiple commands)
1091
+ - ✅ < 3 minutes total setup time
1092
+
1093
+ For complete documentation, see [Configuration Guide](docs/user-docs/getting-started/CONFIGURATION.md#quick-setup-with-mcp-tools).
1094
+
1095
+ ### Linear Configuration
1096
+
1097
+ Configure Linear using a team **URL** (easiest), team **key**, or team **ID**:
1098
+
1099
+ **Option 1: Team URL** (Easiest)
1100
+ ```bash
1101
+ # Paste your Linear team issues URL during setup
1102
+ mcp-ticketer init --adapter linear --team-url https://linear.app/your-org/team/ENG/active
1103
+
1104
+ # The system automatically extracts the team key and resolves it to the team ID
1105
+ ```
1106
+
1107
+ **Option 2: Team Key**
1108
+ ```bash
1109
+ # In .env or environment
1110
+ LINEAR_API_KEY=lin_api_...
1111
+ LINEAR_TEAM_KEY=ENG
1112
+ ```
1113
+
1114
+ **Option 3: Team ID**
1115
+ ```bash
1116
+ # In .env or environment
1117
+ LINEAR_API_KEY=lin_api_...
1118
+ LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
1119
+ ```
1120
+
1121
+ **Supported URL formats:**
1122
+ - `https://linear.app/your-org/team/ABC/active` (full issues page)
1123
+ - `https://linear.app/your-org/team/ABC/` (team page)
1124
+ - `https://linear.app/your-org/team/ABC` (short form)
1125
+
1126
+ **Understanding Linear URLs:**
1127
+ Linear project and issue URLs work with any path suffix (`/issues`, `/overview`, `/updates`). The adapter automatically extracts the identifier and uses Linear's GraphQL API. See [Linear URL Handling Guide](docs/developer-docs/adapters/LINEAR_URL_HANDLING.md) for details.
1128
+
1129
+ **Finding your team information:**
1130
+ 1. **Easiest**: Copy the URL from your Linear team's issues page
1131
+ 2. **Alternative**: Go to Linear Settings → Teams → Your Team → "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
1132
+
1133
+ ### Environment Variables
1134
+
1135
+ See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
1136
+
1137
+ ## 📚 Documentation
1138
+
1139
+ Full documentation is available at [https://mcp-ticketer.readthedocs.io](https://mcp-ticketer.readthedocs.io)
1140
+
1141
+ - [Getting Started Guide](https://mcp-ticketer.readthedocs.io/en/latest/getting-started/)
1142
+ - [API Reference](https://mcp-ticketer.readthedocs.io/en/latest/api/)
1143
+ - [Adapter Development](https://mcp-ticketer.readthedocs.io/en/latest/adapters/)
1144
+ - [MCP Integration](https://mcp-ticketer.readthedocs.io/en/latest/mcp/)
1145
+
1146
+ ## 🏗️ Architecture
1147
+
1148
+ ```
1149
+ mcp-ticketer/
1150
+ ├── adapters/ # Ticket system adapters
1151
+ │ ├── jira/ # JIRA integration
1152
+ │ ├── linear/ # Linear integration
1153
+ │ ├── github/ # GitHub Issues
1154
+ │ └── aitrackdown/ # Local file storage
1155
+ ├── core/ # Core models and interfaces
1156
+ ├── cli/ # Command-line interface
1157
+ ├── mcp/ # MCP server implementation
1158
+ ├── cache/ # Caching layer
1159
+ └── queue/ # Queue system for async operations
1160
+ ```
1161
+
1162
+ ### State Machine
1163
+
1164
+ ```mermaid
1165
+ graph LR
1166
+ OPEN --> IN_PROGRESS
1167
+ IN_PROGRESS --> READY
1168
+ IN_PROGRESS --> WAITING
1169
+ IN_PROGRESS --> BLOCKED
1170
+ WAITING --> IN_PROGRESS
1171
+ BLOCKED --> IN_PROGRESS
1172
+ READY --> TESTED
1173
+ TESTED --> DONE
1174
+ DONE --> CLOSED
1175
+ ```
1176
+
1177
+ ## 🧪 Development
1178
+
1179
+ ### Setup Development Environment
1180
+
1181
+ ```bash
1182
+ # Clone repository
1183
+ git clone https://github.com/mcp-ticketer/mcp-ticketer.git
1184
+ cd mcp-ticketer
1185
+
1186
+ # Activate existing virtual environment
1187
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
1188
+
1189
+ # Install in development mode with all dependencies
1190
+ pip install -e ".[dev,test,docs]"
1191
+
1192
+ # Install pre-commit hooks
1193
+ pre-commit install
1194
+ ```
1195
+
1196
+ **Note**: The project includes a pre-configured `.venv` with all dependencies. Just activate it to get started.
1197
+
1198
+ **Troubleshooting pytest issues?** See [Development Environment Guide](docs/DEVELOPMENT_ENVIRONMENT.md) for detailed setup instructions and common issue resolution.
1199
+
1200
+ ### Modular Build System
1201
+
1202
+ mcp-ticketer uses a **modular Makefile architecture** for streamlined development workflows. The build system is organized into specialized modules for quality, testing, releases, documentation, and MCP-specific operations.
1203
+
1204
+ **Quick Start**:
1205
+ ```bash
1206
+ # Show all available commands
1207
+ make help
1208
+
1209
+ # Complete development setup
1210
+ make setup
1211
+
1212
+ # Run tests in parallel (3-4x faster)
1213
+ make test-parallel
1214
+
1215
+ # Run all quality checks
1216
+ make quality
1217
+
1218
+ # View project information
1219
+ make info
1220
+ ```
1221
+
1222
+ **Key Features**:
1223
+ - ⚡ **Parallel Testing**: 3-4x faster with `make test-parallel`
1224
+ - 📊 **Enhanced Help**: Categorized targets with descriptions
1225
+ - 🎯 **70+ Targets**: Organized by module (testing, quality, release, docs, MCP)
1226
+ - 🔧 **Build Metadata**: Generate build information with `make build-metadata`
1227
+ - 📋 **Module Introspection**: View loaded modules with `make modules`
1228
+
1229
+ **Common Commands**:
1230
+ ```bash
1231
+ # Testing
1232
+ make test # Run all tests (serial)
1233
+ make test-parallel # Run tests in parallel (3-4x faster)
1234
+ make test-fast # Parallel tests with fail-fast
1235
+ make test-coverage # Tests with HTML coverage report
1236
+
1237
+ # Code Quality
1238
+ make lint # Run linters (Ruff + MyPy)
1239
+ make lint-fix # Auto-fix linting issues
1240
+ make format # Format code (Black + isort)
1241
+ make typecheck # Run MyPy type checking
1242
+ make quality # Run all quality checks
1243
+
1244
+ # Release
1245
+ make check-release # Validate release readiness
1246
+ make release-patch # Bump patch version and publish
1247
+ make release-minor # Bump minor version and publish
1248
+
1249
+ # Documentation
1250
+ make docs # Build documentation
1251
+ make docs-serve # Serve docs at localhost:8000
1252
+ make docs-open # Build and open in browser
1253
+ ```
1254
+
1255
+ **Build System Details**:
1256
+ - See [.makefiles/README.md](.makefiles/README.md) for complete module documentation
1257
+ - See [.makefiles/QUICK_REFERENCE.md](.makefiles/QUICK_REFERENCE.md) for quick command reference
1258
+ - See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for comprehensive development guide
1259
+
1260
+ ### Running Tests
1261
+
1262
+ ```bash
1263
+ # Quick testing (recommended for development)
1264
+ make test-parallel # Parallel execution (3-4x faster)
1265
+ make test-fast # Parallel with fail-fast
1266
+
1267
+ # Standard pytest commands (still supported)
1268
+ pytest # Run all tests
1269
+ pytest --cov=mcp_ticketer --cov-report=html # With coverage
1270
+ pytest tests/test_adapters.py # Specific test file
1271
+ pytest -n auto # Manual parallel execution
1272
+ ```
1273
+
1274
+ **Performance Comparison**:
1275
+ - Serial execution: ~30-60 seconds
1276
+ - Parallel (4 cores): ~8-15 seconds (**3-4x faster**)
1277
+
1278
+ ### Code Quality
1279
+
1280
+ ```bash
1281
+ # Using Makefile (recommended)
1282
+ make lint # Run Ruff and MyPy
1283
+ make lint-fix # Auto-fix issues
1284
+ make format # Format with Black and isort
1285
+ make typecheck # Type checking with MyPy
1286
+ make quality # All quality checks
1287
+
1288
+ # Direct commands (still supported)
1289
+ black src tests # Format code
1290
+ ruff check src tests # Lint code
1291
+ mypy src # Type checking
1292
+ tox # Run all checks
1293
+ ```
1294
+
1295
+ ### Building Documentation
1296
+
1297
+ ```bash
1298
+ # Using Makefile (recommended)
1299
+ make docs # Build documentation
1300
+ make docs-serve # Serve at localhost:8000
1301
+ make docs-open # Build and open in browser
1302
+
1303
+ # Direct command (still supported)
1304
+ cd docs && make html # View at docs/_build/html/index.html
1305
+ ```
1306
+
1307
+ ## 📋 Roadmap
1308
+
1309
+ ### ✅ v0.1.0 (Current)
1310
+ - Core ticket model and state machine
1311
+ - JIRA, Linear, GitHub, AITrackdown adapters
1312
+ - Rich CLI interface
1313
+ - MCP server for AI integration
1314
+ - Smart caching system
1315
+ - Comprehensive test suite
1316
+
1317
+ ### 🚧 v0.2.0 (In Development)
1318
+ - [ ] Web UI Dashboard
1319
+ - [ ] Webhook Support
1320
+ - [ ] Advanced Search
1321
+ - [ ] Team Collaboration
1322
+ - [ ] Bulk Operations
1323
+ - [ ] API Rate Limiting
1324
+
1325
+ ### 🔮 v0.3.0+ (Future)
1326
+ - [ ] GitLab Issues Adapter
1327
+ - [ ] Slack/Teams Integration
1328
+ - [ ] Custom Adapters SDK
1329
+ - [ ] Analytics Dashboard
1330
+ - [ ] Mobile Applications
1331
+ - [ ] Enterprise SSO
1332
+
1333
+ ## 🤝 Contributing
1334
+
1335
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
1336
+
1337
+ 1. Fork the repository
1338
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
1339
+ 3. Commit your changes (`git commit -m 'Add amazing feature'`)
1340
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
1341
+ 5. Open a Pull Request
1342
+
1343
+ ## 📄 License
1344
+
1345
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
1346
+
1347
+ ## 🙏 Acknowledgments
1348
+
1349
+ - Built with [Pydantic](https://pydantic-docs.helpmanual.io/) for data validation
1350
+ - CLI powered by [Typer](https://typer.tiangolo.com/) and [Rich](https://rich.readthedocs.io/)
1351
+ - MCP integration using the [Model Context Protocol](https://github.com/anthropics/model-context-protocol)
1352
+
1353
+ ## 📞 Support
1354
+
1355
+ - 📧 Email: support@mcp-ticketer.io
1356
+ - 💬 Discord: [Join our community](https://discord.gg/mcp-ticketer)
1357
+ - 🐛 Issues: [GitHub Issues](https://github.com/mcp-ticketer/mcp-ticketer/issues)
1358
+ - 📖 Docs: [Read the Docs](https://mcp-ticketer.readthedocs.io)
1359
+
1360
+ ## ⭐ Star History
1361
+
1362
+ [![Star History Chart](https://api.star-history.com/svg?repos=mcp-ticketer/mcp-ticketer&type=Date)](https://star-history.com/#mcp-ticketer/mcp-ticketer&Date)
1363
+
1364
+ ---
1365
+
1366
+ Made with ❤️ by the MCP Ticketer Team