mcp-ticketer 0.1.39__py3-none-any.whl → 0.2.0__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.
- mcp_ticketer/__version__.py +1 -1
- mcp_ticketer/adapters/linear/__init__.py +24 -0
- mcp_ticketer/adapters/linear/adapter.py +813 -0
- mcp_ticketer/adapters/linear/client.py +257 -0
- mcp_ticketer/adapters/linear/mappers.py +307 -0
- mcp_ticketer/adapters/linear/queries.py +366 -0
- mcp_ticketer/adapters/linear/types.py +277 -0
- mcp_ticketer/adapters/linear.py +10 -2384
- mcp_ticketer/core/exceptions.py +152 -0
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/METADATA +1 -1
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/RECORD +15 -8
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.1.39.dist-info → mcp_ticketer-0.2.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Exception classes for MCP Ticketer."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Optional
|
|
6
|
+
|
|
7
|
+
from .models import TicketState
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MCPTicketerError(Exception):
|
|
11
|
+
"""Base exception for MCP Ticketer."""
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AdapterError(MCPTicketerError):
|
|
16
|
+
"""Base adapter error."""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
message: str,
|
|
21
|
+
adapter_name: str,
|
|
22
|
+
original_error: Optional[Exception] = None
|
|
23
|
+
):
|
|
24
|
+
"""Initialize adapter error.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
message: Error message
|
|
28
|
+
adapter_name: Name of the adapter that raised the error
|
|
29
|
+
original_error: Original exception that caused this error
|
|
30
|
+
"""
|
|
31
|
+
super().__init__(message)
|
|
32
|
+
self.adapter_name = adapter_name
|
|
33
|
+
self.original_error = original_error
|
|
34
|
+
|
|
35
|
+
def __str__(self) -> str:
|
|
36
|
+
"""String representation of the error."""
|
|
37
|
+
base_msg = f"[{self.adapter_name}] {super().__str__()}"
|
|
38
|
+
if self.original_error:
|
|
39
|
+
base_msg += f" (caused by: {self.original_error})"
|
|
40
|
+
return base_msg
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class AuthenticationError(AdapterError):
|
|
44
|
+
"""Authentication failed with external service."""
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class RateLimitError(AdapterError):
|
|
49
|
+
"""Rate limit exceeded."""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
message: str,
|
|
54
|
+
adapter_name: str,
|
|
55
|
+
retry_after: Optional[int] = None,
|
|
56
|
+
original_error: Optional[Exception] = None
|
|
57
|
+
):
|
|
58
|
+
"""Initialize rate limit error.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
message: Error message
|
|
62
|
+
adapter_name: Name of the adapter
|
|
63
|
+
retry_after: Seconds to wait before retrying
|
|
64
|
+
original_error: Original exception
|
|
65
|
+
"""
|
|
66
|
+
super().__init__(message, adapter_name, original_error)
|
|
67
|
+
self.retry_after = retry_after
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ValidationError(MCPTicketerError):
|
|
71
|
+
"""Data validation error."""
|
|
72
|
+
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
message: str,
|
|
76
|
+
field: Optional[str] = None,
|
|
77
|
+
value: Any = None
|
|
78
|
+
):
|
|
79
|
+
"""Initialize validation error.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
message: Error message
|
|
83
|
+
field: Field that failed validation
|
|
84
|
+
value: Value that failed validation
|
|
85
|
+
"""
|
|
86
|
+
super().__init__(message)
|
|
87
|
+
self.field = field
|
|
88
|
+
self.value = value
|
|
89
|
+
|
|
90
|
+
def __str__(self) -> str:
|
|
91
|
+
"""String representation of the error."""
|
|
92
|
+
base_msg = super().__str__()
|
|
93
|
+
if self.field:
|
|
94
|
+
base_msg += f" (field: {self.field})"
|
|
95
|
+
if self.value is not None:
|
|
96
|
+
base_msg += f" (value: {self.value})"
|
|
97
|
+
return base_msg
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ConfigurationError(MCPTicketerError):
|
|
101
|
+
"""Configuration error."""
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class CacheError(MCPTicketerError):
|
|
106
|
+
"""Cache operation error."""
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class StateTransitionError(MCPTicketerError):
|
|
111
|
+
"""Invalid state transition."""
|
|
112
|
+
|
|
113
|
+
def __init__(
|
|
114
|
+
self,
|
|
115
|
+
message: str,
|
|
116
|
+
from_state: TicketState,
|
|
117
|
+
to_state: TicketState
|
|
118
|
+
):
|
|
119
|
+
"""Initialize state transition error.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
message: Error message
|
|
123
|
+
from_state: Current state
|
|
124
|
+
to_state: Target state
|
|
125
|
+
"""
|
|
126
|
+
super().__init__(message)
|
|
127
|
+
self.from_state = from_state
|
|
128
|
+
self.to_state = to_state
|
|
129
|
+
|
|
130
|
+
def __str__(self) -> str:
|
|
131
|
+
"""String representation of the error."""
|
|
132
|
+
return f"{super().__str__()} ({self.from_state} -> {self.to_state})"
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class NetworkError(AdapterError):
|
|
136
|
+
"""Network-related error."""
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class TimeoutError(AdapterError):
|
|
141
|
+
"""Request timeout error."""
|
|
142
|
+
pass
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class NotFoundError(AdapterError):
|
|
146
|
+
"""Resource not found error."""
|
|
147
|
+
pass
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class PermissionError(AdapterError):
|
|
151
|
+
"""Permission denied error."""
|
|
152
|
+
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
5
|
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
6
|
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
mcp_ticketer/__init__.py,sha256=Xx4WaprO5PXhVPbYi1L6tBmwmJMkYS-lMyG4ieN6QP0,717
|
|
2
|
-
mcp_ticketer/__version__.py,sha256=
|
|
2
|
+
mcp_ticketer/__version__.py,sha256=9j49fzPH9jSgtpm7Tgb5_MiRjdY95EWDMnBbiisOXqM,1117
|
|
3
3
|
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
mcp_ticketer/adapters/__init__.py,sha256=B5DFllWn23hkhmrLykNO5uMMSdcFuuPHXyLw_jyFzuE,358
|
|
5
5
|
mcp_ticketer/adapters/aitrackdown.py,sha256=stlbge8K6w-EyQkw_vEQNSXQgCOWN5tOlQUgGWZQNMQ,17936
|
|
6
6
|
mcp_ticketer/adapters/github.py,sha256=rhf8yaK9vOGMstvFwddguWnokVIfpasoYMBlyjNg_vY,47335
|
|
7
7
|
mcp_ticketer/adapters/hybrid.py,sha256=UADYZLc_UNw0xHPSbgguBNzvUCnuYn12Qi9ea-zdlMk,19086
|
|
8
8
|
mcp_ticketer/adapters/jira.py,sha256=IoyMaznYE7NliaNGv-I_q2UodUS6JhOllLP1gUEXThs,35375
|
|
9
|
-
mcp_ticketer/adapters/linear.py,sha256=
|
|
9
|
+
mcp_ticketer/adapters/linear.py,sha256=fcQ9s_V7IgP4z2K12lbWXYHUVs1avu1uzUzDCK2eEg4,552
|
|
10
|
+
mcp_ticketer/adapters/linear/__init__.py,sha256=dOPx6caymloIsdyjxS33E09gfPQS6kprisDWwOT2-bE,735
|
|
11
|
+
mcp_ticketer/adapters/linear/adapter.py,sha256=emvjHU-NSFVdxS7lxRjcTv6QNxn26-8RbZNg-x-z5xE,26641
|
|
12
|
+
mcp_ticketer/adapters/linear/client.py,sha256=6IKgYRNy0GF6MhXwxaEBeBE2FM-d1WfhOQ43Mhj0-3s,8871
|
|
13
|
+
mcp_ticketer/adapters/linear/mappers.py,sha256=96euA9TuOTEWEPDKvixjYHb82Ha1zD6gxuo9VsLT2wA,9636
|
|
14
|
+
mcp_ticketer/adapters/linear/queries.py,sha256=chcHCHqvyQbKHPp9wWHGo3HdUGV_6RHNdRadP2pZkVQ,7112
|
|
15
|
+
mcp_ticketer/adapters/linear/types.py,sha256=VuGPu1Z5jGHtbI2zkCyL5YFnwQNukGW-UV72k6zF0p4,8097
|
|
10
16
|
mcp_ticketer/cache/__init__.py,sha256=Xcd-cKnt-Cx7jBzvfzUUUPaGkmyXFi5XUFWw3Z4b7d4,138
|
|
11
17
|
mcp_ticketer/cache/memory.py,sha256=2yBqGi9i0SanlUhJoOC7nijWjoMa3_ntPe-V-AV-LfU,5042
|
|
12
18
|
mcp_ticketer/cli/__init__.py,sha256=l9Q8iKmfGkTu0cssHBVqNZTsL4eAtFzOB25AED_0G6g,89
|
|
@@ -28,6 +34,7 @@ mcp_ticketer/core/adapter.py,sha256=q64LxOInIno7EIbmuxItf8KEsd-g9grCs__Z4uwZHto,
|
|
|
28
34
|
mcp_ticketer/core/config.py,sha256=hvn8RoN2BSmYzESKqCvcpKleX0PrGiHVQ5v35nX12Mc,19241
|
|
29
35
|
mcp_ticketer/core/env_discovery.py,sha256=It62C97UBt96CgVbZCql5NQtONmCHMkX3c8W2kEl-Qk,18716
|
|
30
36
|
mcp_ticketer/core/env_loader.py,sha256=fX8EpHcAJxxhPJ-XY5BD8HlLs-Y9jdlQ24Qtt5ylBNo,12032
|
|
37
|
+
mcp_ticketer/core/exceptions.py,sha256=78tzV3Muc7E_UhEIByF0NtsPe1I0lFVrbpdDNX56kQg,3737
|
|
31
38
|
mcp_ticketer/core/http_client.py,sha256=s5ikMiwEJ8TJjNn73wu3gv3OdAtyBEpAqPnSroRMW2k,13971
|
|
32
39
|
mcp_ticketer/core/mappers.py,sha256=1aG1jFsHTCwmGRVgOlXW-VOSTGzc86gv7qjDfiR1ups,17462
|
|
33
40
|
mcp_ticketer/core/models.py,sha256=a_2AbL3NlN0pfdZad-hXus_zb4bSi9zISHcsNYl0sng,12486
|
|
@@ -43,9 +50,9 @@ mcp_ticketer/queue/queue.py,sha256=jSAkYNEIbNH1cbYuF8s6eFuZmXqn8WHXx3mbfMU2Ud8,1
|
|
|
43
50
|
mcp_ticketer/queue/run_worker.py,sha256=F7anuhdkgZF9lXZntHuJ7rEzuEkAfAZO1qvGh3R57bw,1033
|
|
44
51
|
mcp_ticketer/queue/ticket_registry.py,sha256=k8FYg2cFYsI4POb94-o-fTrIVr-ttfi60r0O5YhJYck,15321
|
|
45
52
|
mcp_ticketer/queue/worker.py,sha256=zXJpyhRJ99be0VLaez3YPtC9OU17vVNu5qhr1dCGaLg,19992
|
|
46
|
-
mcp_ticketer-0.
|
|
47
|
-
mcp_ticketer-0.
|
|
48
|
-
mcp_ticketer-0.
|
|
49
|
-
mcp_ticketer-0.
|
|
50
|
-
mcp_ticketer-0.
|
|
51
|
-
mcp_ticketer-0.
|
|
53
|
+
mcp_ticketer-0.2.0.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
54
|
+
mcp_ticketer-0.2.0.dist-info/METADATA,sha256=bvHYuQNE5HYIEgM2BlrpPwCesfgm3jWiax7lwTNGGB0,13219
|
|
55
|
+
mcp_ticketer-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
56
|
+
mcp_ticketer-0.2.0.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
57
|
+
mcp_ticketer-0.2.0.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
58
|
+
mcp_ticketer-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|