awslabs.cloudwatch-appsignals-mcp-server 0.1.1__py3-none-any.whl → 0.1.2__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.
@@ -0,0 +1,340 @@
1
+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Retrieve service SLI status based on configured Application Signals SLOs."""
16
+
17
+ import boto3
18
+ import logging
19
+ from botocore.exceptions import ClientError
20
+ from dataclasses import dataclass, field
21
+ from datetime import datetime, timedelta, timezone
22
+ from typing import Any, Dict, List, Optional
23
+
24
+
25
+ # Initialize module logger
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ @dataclass
30
+ class AWSConfig:
31
+ """Configuration class for AWS settings and service parameters.
32
+
33
+ Attributes:
34
+ region (str): AWS region identifier (default: us-west-1)
35
+ period_in_hours (int): Time period for metrics collection (max 24 hours)
36
+ service_name (str): Name of the AWS service to monitor
37
+ key_attributes (Dict[str, str]): Key attributes to identify the service
38
+ """
39
+
40
+ region: str
41
+ period_in_hours: int
42
+ service_name: str
43
+ key_attributes: Dict[str, str] = field(default_factory=dict)
44
+
45
+ def __init__(
46
+ self,
47
+ region: str = 'us-east-1',
48
+ period_in_hours: int = 24,
49
+ service_name: str = 'UnknownService',
50
+ key_attributes: Optional[Dict[str, str]] = None,
51
+ ):
52
+ """Initialize AWSConfig with region, period, and service name.
53
+
54
+ Args:
55
+ region: AWS region identifier (default: us-east-1)
56
+ period_in_hours: Time period for metrics collection, max 24 hours (default: 24)
57
+ service_name: Name of the AWS service to monitor (default: UnknownService)
58
+ key_attributes: Optional key attributes to override defaults
59
+ """
60
+ self.region = region
61
+ self.period_in_hours = min(period_in_hours, 24) # Ensure period doesn't exceed 24 hours
62
+ self.service_name = service_name
63
+ if key_attributes is not None:
64
+ self.key_attributes = key_attributes
65
+ else:
66
+ self.key_attributes = {
67
+ 'Name': self.service_name,
68
+ 'Type': 'Service',
69
+ 'Environment': self.region,
70
+ }
71
+
72
+
73
+ @dataclass
74
+ class SLOSummary:
75
+ """Data class representing a Service Level Objective summary.
76
+
77
+ Attributes:
78
+ name (str): Name of the SLO
79
+ arn (str): Amazon Resource Name
80
+ key_attributes (Dict): Service identification attributes
81
+ operation_name (str): Name of the monitored operation
82
+ created_time (datetime): When the SLO was created
83
+ """
84
+
85
+ name: str
86
+ arn: str
87
+ key_attributes: Dict[str, str]
88
+ operation_name: str
89
+ created_time: datetime
90
+
91
+
92
+ @dataclass
93
+ class MetricDataResult:
94
+ """Data class holding CloudWatch metric data results.
95
+
96
+ Attributes:
97
+ timestamps (List[datetime]): Timestamps of metric data points
98
+ values (List[float]): Corresponding metric values
99
+ """
100
+
101
+ timestamps: List[datetime]
102
+ values: List[float]
103
+
104
+
105
+ class SLIReport:
106
+ """Class representing an SLI report with various metrics and status information.
107
+
108
+ Provides read-only access to report data including start/end times,
109
+ SLI status, and counts of total, successful, and breached SLOs.
110
+ """
111
+
112
+ def __init__(
113
+ self,
114
+ start_time: datetime,
115
+ end_time: datetime,
116
+ sli_status: str,
117
+ total_slo_count: int,
118
+ ok_slo_count: int,
119
+ breached_slo_count: int,
120
+ breached_slo_names: List[str],
121
+ ):
122
+ """Initialize SLIReport with metrics and status information.
123
+
124
+ Args:
125
+ start_time: Start time of the reporting period
126
+ end_time: End time of the reporting period
127
+ sli_status: Overall SLI status (OK/CRITICAL)
128
+ total_slo_count: Total number of SLOs monitored
129
+ ok_slo_count: Number of SLOs meeting their objectives
130
+ breached_slo_count: Number of SLOs failing to meet their objectives
131
+ breached_slo_names: Names of SLOs that failed to meet their objectives
132
+ """
133
+ self._start_time = start_time
134
+ self._end_time = end_time
135
+ self._sli_status = sli_status
136
+ self._total_slo_count = total_slo_count
137
+ self._ok_slo_count = ok_slo_count
138
+ self._breached_slo_count = breached_slo_count
139
+ self._breached_slo_names = breached_slo_names
140
+
141
+ # Property getters for all attributes
142
+ @property
143
+ def start_time(self) -> datetime:
144
+ """Start time of the reporting period."""
145
+ return self._start_time
146
+
147
+ @property
148
+ def end_time(self) -> datetime:
149
+ """End time of the reporting period."""
150
+ return self._end_time
151
+
152
+ @property
153
+ def sli_status(self) -> str:
154
+ """Overall SLI status (OK/CRITICAL)."""
155
+ return self._sli_status
156
+
157
+ @property
158
+ def total_slo_count(self) -> int:
159
+ """Total number of SLOs monitored."""
160
+ return self._total_slo_count
161
+
162
+ @property
163
+ def ok_slo_count(self) -> int:
164
+ """Number of SLOs meeting their objectives."""
165
+ return self._ok_slo_count
166
+
167
+ @property
168
+ def breached_slo_count(self) -> int:
169
+ """Number of SLOs failing to meet their objectives."""
170
+ return self._breached_slo_count
171
+
172
+ @property
173
+ def breached_slo_names(self) -> List[str]:
174
+ """Names of SLOs that failed to meet their objectives."""
175
+ return self._breached_slo_names.copy()
176
+
177
+
178
+ class SLIReportClient:
179
+ """Client for generating SLI reports using AWS Application Signals and CloudWatch.
180
+
181
+ Handles interaction with AWS services to collect and analyze SLO data.
182
+ """
183
+
184
+ def __init__(self, config: AWSConfig):
185
+ """Initialize SLIReportClient with AWS configuration.
186
+
187
+ Args:
188
+ config: AWSConfig instance containing region, period, and service settings
189
+
190
+ Raises:
191
+ Exception: If AWS clients fail to initialize
192
+ """
193
+ self.config = config
194
+ logger.info(
195
+ f'Initializing SLIReportClient for service: {config.service_name}, region: {config.region}'
196
+ )
197
+
198
+ try:
199
+ # Initialize AWS service clients
200
+ self.signals_client = boto3.client('application-signals', region_name=config.region)
201
+ self.cloudwatch_client = boto3.client('cloudwatch', region_name=config.region)
202
+ logger.debug('AWS clients initialized successfully')
203
+ except Exception as e:
204
+ logger.error(f'Failed to initialize AWS clients: {str(e)}', exc_info=True)
205
+ raise
206
+
207
+ def get_slo_summaries(self) -> List[SLOSummary]:
208
+ """Fetches SLO summaries from AWS Application Signals."""
209
+ logger.debug(f'Fetching SLO summaries for {self.config.service_name}')
210
+
211
+ try:
212
+ response = self.signals_client.list_service_level_objectives(
213
+ KeyAttributes=self.config.key_attributes,
214
+ MetricSourceTypes=['ServiceOperation'],
215
+ IncludeLinkedAccounts=True,
216
+ )
217
+ logger.info(f'Retrieved {len(response.get("SloSummaries", []))} SLO summaries')
218
+ except ClientError as e:
219
+ error_msg = e.response.get('Error', {}).get('Message', 'Unknown error')
220
+ error_code = e.response.get('Error', {}).get('Code', 'Unknown')
221
+ logger.error(f'AWS ClientError getting SLO summaries: {error_code} - {error_msg}')
222
+ raise
223
+ except Exception as e:
224
+ logger.error(f'Unexpected error getting SLO summaries: {str(e)}', exc_info=True)
225
+ raise
226
+
227
+ return [
228
+ SLOSummary(
229
+ name=slo['Name'],
230
+ arn=slo['Arn'],
231
+ key_attributes=slo.get('KeyAttributes', {}),
232
+ operation_name=slo.get('OperationName', 'N/A'),
233
+ created_time=slo.get('CreatedTime', datetime.now(timezone.utc)),
234
+ )
235
+ for slo in response['SloSummaries']
236
+ ]
237
+
238
+ def create_metric_queries(self, slo_summaries: List[SLOSummary]) -> List[Dict[str, Any]]:
239
+ """Creates CloudWatch metric queries for each SLO."""
240
+ return [
241
+ {
242
+ 'Id': f'slo{i}',
243
+ 'MetricStat': {
244
+ 'Metric': {
245
+ 'Namespace': 'AWS/ApplicationSignals',
246
+ 'MetricName': 'BreachedCount',
247
+ 'Dimensions': [{'Name': 'SloName', 'Value': slo.name}],
248
+ },
249
+ 'Period': self.config.period_in_hours * 60 * 60,
250
+ 'Stat': 'Maximum',
251
+ },
252
+ 'ReturnData': True,
253
+ }
254
+ for i, slo in enumerate(slo_summaries)
255
+ ]
256
+
257
+ def get_metric_data(
258
+ self, queries: List[Dict[str, Any]], start_time: datetime, end_time: datetime
259
+ ) -> List[MetricDataResult]:
260
+ """Retrieves metric data from CloudWatch using the specified queries."""
261
+ logger.debug(f'Fetching metric data with {len(queries)} queries')
262
+
263
+ try:
264
+ response = self.cloudwatch_client.get_metric_data(
265
+ MetricDataQueries=queries, # type: ignore
266
+ StartTime=start_time,
267
+ EndTime=end_time,
268
+ )
269
+ logger.debug(f'Retrieved {len(response.get("MetricDataResults", []))} metric results')
270
+ except ClientError as e:
271
+ error_msg = e.response.get('Error', {}).get('Message', 'Unknown error')
272
+ error_code = e.response.get('Error', {}).get('Code', 'Unknown')
273
+ logger.error(f'AWS ClientError getting metric data: {error_code} - {error_msg}')
274
+ raise
275
+ except Exception as e:
276
+ logger.error(f'Unexpected error getting metric data: {str(e)}', exc_info=True)
277
+ raise
278
+
279
+ return [
280
+ MetricDataResult(
281
+ timestamps=result.get('Timestamps', []), values=result.get('Values', [])
282
+ )
283
+ for result in response['MetricDataResults']
284
+ ]
285
+
286
+ def get_sli_status(self, num_breaching: int) -> str:
287
+ """Determines overall SLI status based on number of breaching SLOs."""
288
+ return 'CRITICAL' if num_breaching > 0 else 'OK'
289
+
290
+ def generate_sli_report(self) -> SLIReport:
291
+ """Generates a comprehensive SLI report.
292
+
293
+ Collects SLO data, analyzes metrics, and produces a report containing
294
+ the overall status and details about breaching/healthy SLOs.
295
+ """
296
+ logger.info(f'Generating SLI report for {self.config.service_name}')
297
+ end_time = datetime.now()
298
+ start_time = end_time - timedelta(hours=self.config.period_in_hours)
299
+ logger.debug(f'Report time range: {start_time} to {end_time}')
300
+
301
+ slo_summaries = self.get_slo_summaries()
302
+
303
+ # If no SLOs found, return empty report
304
+ if not slo_summaries:
305
+ logger.warning(f'No SLOs found for service {self.config.service_name}')
306
+ return SLIReport(
307
+ start_time=start_time,
308
+ end_time=end_time,
309
+ sli_status='OK', # No SLOs means nothing can be breached
310
+ total_slo_count=0,
311
+ ok_slo_count=0,
312
+ breached_slo_count=0,
313
+ breached_slo_names=[],
314
+ )
315
+
316
+ metric_queries = self.create_metric_queries(slo_summaries)
317
+ metric_results = self.get_metric_data(metric_queries, start_time, end_time)
318
+
319
+ healthy_slos = []
320
+ breaching_slos = []
321
+
322
+ for i, result in enumerate(metric_results):
323
+ # Check if we have any values and if the SLO is breached
324
+ if result.values and len(result.values) > 0 and result.values[0] > 0:
325
+ breaching_slos.append(slo_summaries[i].name)
326
+ else:
327
+ healthy_slos.append(slo_summaries[i].name)
328
+
329
+ logger.debug(
330
+ f'SLI report generated - Total SLOs: {len(slo_summaries)}, Breaching: {len(breaching_slos)}, Healthy: {len(healthy_slos)}'
331
+ )
332
+ return SLIReport(
333
+ start_time=start_time,
334
+ end_time=end_time,
335
+ sli_status=self.get_sli_status(len(breaching_slos)),
336
+ total_slo_count=len(slo_summaries),
337
+ ok_slo_count=len(healthy_slos),
338
+ breached_slo_count=len(breaching_slos),
339
+ breached_slo_names=breaching_slos,
340
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: awslabs.cloudwatch-appsignals-mcp-server
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: An AWS Labs Model Context Protocol (MCP) server for AWS Application Signals
5
5
  Project-URL: Homepage, https://awslabs.github.io/mcp/
6
6
  Project-URL: Documentation, https://awslabs.github.io/mcp/servers/cloudwatch-appsignals-mcp-server/
@@ -34,41 +34,88 @@ An MCP (Model Context Protocol) server that provides tools for monitoring and an
34
34
 
35
35
  This server enables AI assistants like Claude, GitHub Copilot, and Amazon Q to help you monitor service health, analyze performance metrics, track SLO compliance, and investigate issues using distributed tracing.
36
36
 
37
- ## Features
37
+ ## Key Features
38
+
39
+ 1. Monitor overall service health, diagnose root causes, and recommend actionable fixes with the built-in APM expertise.
40
+ 2. Generate business insights from telemetry data through natural language queries.
41
+
42
+ ## Prerequisites
43
+
44
+ 1. [Sign-Up for an AWS account](https://aws.amazon.com/free/?trk=78b916d7-7c94-4cab-98d9-0ce5e648dd5f&sc_channel=ps&ef_id=Cj0KCQjwxJvBBhDuARIsAGUgNfjOZq8r2bH2OfcYfYTht5v5I1Bn0lBKiI2Ii71A8Gk39ZU5cwMLPkcaAo_CEALw_wcB:G:s&s_kwcid=AL!4422!3!432339156162!e!!g!!aws%20sign%20up!9572385111!102212379327&gad_campaignid=9572385111&gbraid=0AAAAADjHtp99c5A9DUyUaUQVhVEoi8of3&gclid=Cj0KCQjwxJvBBhDuARIsAGUgNfjOZq8r2bH2OfcYfYTht5v5I1Bn0lBKiI2Ii71A8Gk39ZU5cwMLPkcaAo_CEALw_wcB)
45
+ 2. [Enable Application Signals](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Monitoring-Sections.html) for your applications
46
+ 3. Install `uv` from [Astral](https://docs.astral.sh/uv/getting-started/installation/) or the [GitHub README](https://github.com/astral-sh/uv#installation)
47
+ 4. Install Python using `uv python install 3.10`
38
48
 
39
49
  ### Available Tools
40
50
 
41
51
  1. **`list_monitored_services`** - List all services monitored by AWS Application Signals
42
52
  - Get an overview of all monitored services
43
53
  - See service names, types, and key attributes
44
- - Identify which services are being tracked
54
+ - Identify the services monitored by Application Signals
45
55
 
46
56
  2. **`get_service_detail`** - Get detailed information about a specific service
47
- - Understand service configuration and deployment
48
- - View available CloudWatch metrics
57
+ - Get Service key properties such as Hosting environment, list of APIs,etc
58
+ - Get the list of ApplicationSignals metrics available on service
49
59
  - Find associated log groups
50
60
 
51
- ## Installation
61
+ 3. **`list_slis`** - List all SLOs and SLIs status for all services
62
+ - List the configured SLOs and across all services
63
+ - Find out all breached SLIs and status
52
64
 
53
- ### Installing via Smithery
65
+ 4. **`get_slo`** - Gets the details configuration for a specific SLO
66
+ - Return the relevant metrics info, SLO threshold
54
67
 
55
- To install CloudWatch Application Signals MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/awslabs.cloudwatch-appsignals-mcp-server):
68
+ 5. **`search_transaction_spans`** - Queries OTel Spans data via Transaction Search
69
+ - Query OTel Spans to root cause the potential problems
70
+ - Generate business performance insights summaries
56
71
 
57
- ```bash
58
- npx @smithery/cli install awslabs.cloudwatch-appsignals-mcp-server --client claude
59
- ```
72
+ 6. **`query_sampled_traces`** - Queries AWS X-Ray traces to gain deeper insights
73
+ - Find the impact from the tracing dependency view
74
+ - Return the exact error stack for LLM to suggest the actionable fixes
75
+
76
+ 7. **`query_service_metrics`** - Queries Application Signals metrics for root causing service performance issues
77
+ - Query Application Signals RED metrics to correlate the relevant OTel Spans/Traces for troubleshooting
78
+
79
+ ## Installation
60
80
 
61
81
  ### Installing via Cursor
62
82
 
63
83
  To install CloudWatch Application Signals MCP Server for Cursor automatically:
64
84
 
65
- [![Install in Cursor](https://img.shields.io/badge/Install%20in%20Cursor-Install-blue?style=for-the-badge&logo=cursor&logoColor=white)](https://cursor.com/settings/extensions/install?server=awslabs.cloudwatch-appsignals-mcp-server)
85
+ [![Install MCP Server](https://cursor.com/deeplink/mcp-install-light.svg)](https://cursor.com/install-mcp?name=awslabs.cloudwatch-appsignals-mcp-server&config=eyJhdXRvQXBwcm92ZSI6W10sImRpc2FibGVkIjpmYWxzZSwidGltZW91dCI6NjAsImNvbW1hbmQiOiJ1dnggYXdzbGFicy5jbG91ZHdhdGNoLWFwcHNpZ25hbHMtbWNwLXNlcnZlckBsYXRlc3QiLCJlbnYiOnsiQVdTX1BST0ZJTEUiOiJbVGhlIEFXUyBQcm9maWxlIE5hbWUgdG8gdXNlIGZvciBBV1MgYWNjZXNzXSIsIkFXU19SRUdJT04iOiJbVGhlIEFXUyByZWdpb24gdG8gcnVuIGluXSIsIkZBU1RNQ1BfTE9HX0xFVkVMIjoiRVJST1IifSwidHJhbnNwb3J0VHlwZSI6InN0ZGlvIn0%3D)
66
86
 
67
87
  ### Installing via `uv`
68
88
 
69
89
  When using [`uv`](https://docs.astral.sh/uv/) no specific installation is needed. We will
70
90
  use [`uvx`](https://docs.astral.sh/uv/guides/tools/) to directly run *awslabs.cloudwatch-appsignals-mcp-server*.
71
91
 
92
+ ### Installing for Amazon Q (Preview)
93
+
94
+ - Start Amazon Q Developer CLI from [here](https://github.com/aws/amazon-q-developer-cli).
95
+ - Add the following configuration in `~/.aws/amazonq/mcp.json` file.
96
+ ```json
97
+ {
98
+ "mcpServers": {
99
+ "awslabs.cloudwatch-appsignals-mcp-server": {
100
+ "autoApprove": [],
101
+ "disabled": false,
102
+ "timeout": 60,
103
+ "command": "uvx",
104
+ "args": [
105
+ "awslabs.cloudwatch-appsignals-mcp-server@latest"
106
+ ],
107
+ "env": {
108
+ "AWS_ACCESS_KEY_ID": "[AWS Access Key ID]",
109
+ "AWS_SECRET_ACCESS_KEY": "[AWS Access Key]",
110
+ "AWS_REGION": "[AWS Region]",
111
+ "FASTMCP_LOG_LEVEL": "ERROR"
112
+ },
113
+ "transportType": "stdio"
114
+ }
115
+ }
116
+ }
117
+ ```
118
+
72
119
  ### Installing via Claude Desktop
73
120
 
74
121
  On MacOS: `~/Library/Application\ Support/Claude/claude_desktop_config.json`
@@ -98,19 +145,38 @@ On Windows: `%APPDATA%/Claude/claude_desktop_config.json`
98
145
  "mcpServers": {
99
146
  "awslabs.cloudwatch-appsignals-mcp-server": {
100
147
  "command": "uvx",
101
- "args": ["awslabs.cloudwatch-appsignals-mcp-server"]
148
+ "args": ["awslabs.cloudwatch-appsignals-mcp-server@latest"]
102
149
  }
103
150
  }
104
151
  }
105
152
  ```
106
153
  </details>
107
154
 
108
- ### Installing for Amazon Q (Preview)
155
+ ### Build and install docker image locally on the same host of your LLM client
156
+
157
+ 1. `git clone https://github.com/awslabs/mcp.git`
158
+ 2. Go to sub-directory 'src/cloudwatch-appsignals-mcp-server/'
159
+ 3. Run 'docker build -t awslabs/cloudwatch-appsignals-mcp-server:latest .'
109
160
 
110
- - Start Q Developer from [here](https://q.aws/chat).
111
- - Click on "Manage Connectors" and choose MCP Client.
112
- - Click "Add New Context Connector," enter a name like "CloudWatch AppSignals," and enter the command in the format: `uvx awslabs.cloudwatch-appsignals-mcp-server`.
113
- - Verify it shows "Connected" in green under the connector.
161
+ ### Add or update your LLM client's config with following:
162
+ ```json
163
+ {
164
+ "mcpServers": {
165
+ "awslabs.cloudwatch-appsignals-mcp-server": {
166
+ "command": "docker",
167
+ "args": [
168
+ "run",
169
+ "-i",
170
+ "--rm",
171
+ "-e", "AWS_ACCESS_KEY_ID=[your data]",
172
+ "-e", "AWS_SECRET_ACCESS_KEY=[your data]",
173
+ "-e", "AWS_REGION=[your data]",
174
+ "awslabs/cloudwatch-appsignals-mcp-server:latest"
175
+ ]
176
+ }
177
+ }
178
+ }
179
+ ```
114
180
 
115
181
  ### Debugging
116
182
 
@@ -0,0 +1,10 @@
1
+ awslabs/__init__.py,sha256=WuqxdDgUZylWNmVoPKiK7qGsTB_G4UmuXIrJ-VBwDew,731
2
+ awslabs/cloudwatch_appsignals_mcp_server/__init__.py,sha256=UDBzXsnaAPF0tJrYn7iFk3Kxcnpri-58PAoEZYjrNNE,681
3
+ awslabs/cloudwatch_appsignals_mcp_server/server.py,sha256=yVmgTqYHAIJCzWxopj3o15P8ntrgjmRN5rGzWTKgYF8,58146
4
+ awslabs/cloudwatch_appsignals_mcp_server/sli_report_client.py,sha256=t9ZtbD-yBv-HxGI0Bc_d9b4XtTDNEE59ekCMSh6j_Mo,12641
5
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/METADATA,sha256=U37D6kDzm7yxIeMrs0ZCzF_q04EYRFYq2TITJ4SibEY,11177
6
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
7
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/entry_points.txt,sha256=iGwIMLU6AsBawl2Fhqi9GoeWdMGIVtg86-McaaNQqAQ,114
8
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/licenses/LICENSE,sha256=zE1N4JILDTkSIDtdmqdnKKxKEQh_VdqeoAV2230eNOI,10141
9
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/licenses/NOTICE,sha256=Pfbul2Ga0IJU2RMZFHC8QwDvNk72WO2XMn9l3390VYs,108
10
+ awslabs_cloudwatch_appsignals_mcp_server-0.1.2.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- awslabs/__init__.py,sha256=WuqxdDgUZylWNmVoPKiK7qGsTB_G4UmuXIrJ-VBwDew,731
2
- awslabs/cloudwatch_appsignals_mcp_server/__init__.py,sha256=UDBzXsnaAPF0tJrYn7iFk3Kxcnpri-58PAoEZYjrNNE,681
3
- awslabs/cloudwatch_appsignals_mcp_server/server.py,sha256=QsNhMYIEnSuP1rW6Czhx6GHwVRc6w-QIoBNHUggpBIc,10383
4
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/METADATA,sha256=Aom2dgzauVXBfLxlBDhATy8FF3J--i-l1c9saNdew3I,8069
5
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
6
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/entry_points.txt,sha256=iGwIMLU6AsBawl2Fhqi9GoeWdMGIVtg86-McaaNQqAQ,114
7
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/licenses/LICENSE,sha256=zE1N4JILDTkSIDtdmqdnKKxKEQh_VdqeoAV2230eNOI,10141
8
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/licenses/NOTICE,sha256=Pfbul2Ga0IJU2RMZFHC8QwDvNk72WO2XMn9l3390VYs,108
9
- awslabs_cloudwatch_appsignals_mcp_server-0.1.1.dist-info/RECORD,,