newrelic-mcp 1.1.2 → 2.1.0
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.
- package/README.md +117 -19
- package/dist/client/newrelic-client.d.ts.map +1 -1
- package/dist/client/newrelic-client.js +12 -1
- package/dist/client/newrelic-client.js.map +1 -1
- package/dist/client/rest-client.d.ts +38 -0
- package/dist/client/rest-client.d.ts.map +1 -0
- package/dist/client/rest-client.js +116 -0
- package/dist/client/rest-client.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +38 -7
- package/dist/server.js.map +1 -1
- package/dist/tools/rest/alerts.d.ts +24 -0
- package/dist/tools/rest/alerts.d.ts.map +1 -0
- package/dist/tools/rest/alerts.js +94 -0
- package/dist/tools/rest/alerts.js.map +1 -0
- package/dist/tools/rest/apm.d.ts +18 -0
- package/dist/tools/rest/apm.d.ts.map +1 -0
- package/dist/tools/rest/apm.js +63 -0
- package/dist/tools/rest/apm.js.map +1 -0
- package/dist/tools/rest/deployments.d.ts +33 -0
- package/dist/tools/rest/deployments.d.ts.map +1 -0
- package/dist/tools/rest/deployments.js +111 -0
- package/dist/tools/rest/deployments.js.map +1 -0
- package/dist/tools/rest/metrics.d.ts +42 -0
- package/dist/tools/rest/metrics.d.ts.map +1 -0
- package/dist/tools/rest/metrics.js +144 -0
- package/dist/tools/rest/metrics.js.map +1 -0
- package/package.json +12 -1
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# New Relic MCP Server
|
|
2
2
|
|
|
3
|
+
[](https://smithery.ai/server/@cloudbring/newrelic-mcp)
|
|
4
|
+
|
|
3
5
|
A Model Context Protocol (MCP) server that provides seamless integration with New Relic's observability platform. Query metrics, manage alerts, monitor applications, and interact with your entire observability stack through a simple, unified interface.
|
|
4
6
|
|
|
5
7
|
> **Disclaimer**: This is an unofficial community project and is not affiliated with, endorsed by, or supported by New Relic, Inc. All trademarks are the property of their respective owners.
|
|
@@ -12,17 +14,57 @@ A Model Context Protocol (MCP) server that provides seamless integration with Ne
|
|
|
12
14
|
- 🔍 **Entity Search** - Discover and inspect entities across your infrastructure
|
|
13
15
|
- 📈 **Synthetics Monitoring** - Manage synthetic monitors and checks
|
|
14
16
|
- 🔧 **NerdGraph API** - Direct access to New Relic's GraphQL API
|
|
17
|
+
- 🌐 **REST v2 Tools (2.0+)** - High‑value REST endpoints for deployments, APM apps, metrics, and alerts
|
|
15
18
|
|
|
16
19
|
## Installation
|
|
17
20
|
|
|
18
21
|
### Quick Install with Smithery
|
|
19
22
|
|
|
23
|
+
To install or deploy via Smithery, see the official docs: [Deployments](https://smithery.ai/docs/build/deployments), [Project Configuration](https://smithery.ai/docs/build/project-config), and [`smithery.yaml` Reference](https://smithery.ai/docs/build/project-config/smithery-yaml).
|
|
24
|
+
|
|
20
25
|
To install New Relic MCP for Claude Desktop automatically via [Smithery](https://smithery.ai/mcp/newrelic-mcp):
|
|
21
26
|
|
|
22
27
|
```bash
|
|
28
|
+
npx @smithery/cli install @cloudbring/newrelic-mcp --client claude
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Smithery CLI (recommended)
|
|
32
|
+
|
|
33
|
+
We recommend the Smithery CLI for local development, inspection, and deployment flows. Benefits:
|
|
34
|
+
|
|
35
|
+
- Unified dev/build/deploy workflow, client‑agnostic
|
|
36
|
+
- Dev server with hot‑reload and playground (optional tunnel)
|
|
37
|
+
- Build bundles for `stdio` or `shttp` transports
|
|
38
|
+
- Inspect a server interactively; run with supplied config
|
|
39
|
+
- Simple install per client
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Hot‑reload dev server
|
|
45
|
+
npx @smithery/cli dev src/server.ts --port 8181 --no-open
|
|
46
|
+
|
|
47
|
+
# Build production bundle (shttp transport)
|
|
48
|
+
npx @smithery/cli build src/server.ts --out .smithery/index.cjs --transport shttp
|
|
49
|
+
|
|
50
|
+
# Inspect a published server
|
|
51
|
+
npx @smithery/cli inspect @cloudbring/newrelic-mcp
|
|
52
|
+
|
|
53
|
+
# Run with config (env via JSON)
|
|
54
|
+
npx @smithery/cli run @cloudbring/newrelic-mcp --config '{"NEW_RELIC_API_KEY":"...","NEW_RELIC_ACCOUNT_ID":"...","NEW_RELIC_REGION":"US"}'
|
|
55
|
+
|
|
56
|
+
# Install into a specific client
|
|
23
57
|
npx @smithery/cli install newrelic-mcp --client claude
|
|
58
|
+
|
|
59
|
+
# Open playground
|
|
60
|
+
npx @smithery/cli playground --port 3001
|
|
24
61
|
```
|
|
25
62
|
|
|
63
|
+
Notes:
|
|
64
|
+
|
|
65
|
+
- This repo includes a minimal `smithery.yaml` with `runtime: "typescript"` to align with TypeScript‑first deployments.
|
|
66
|
+
- See the CLI reference for all commands and flags: [smithery-ai/cli](https://github.com/smithery-ai/cli).
|
|
67
|
+
|
|
26
68
|
### Manual Installation
|
|
27
69
|
|
|
28
70
|
<details>
|
|
@@ -44,7 +86,8 @@ Add to your Claude Desktop configuration file:
|
|
|
44
86
|
],
|
|
45
87
|
"env": {
|
|
46
88
|
"NEW_RELIC_API_KEY": "your-api-key-here",
|
|
47
|
-
"NEW_RELIC_ACCOUNT_ID": "your-account-id"
|
|
89
|
+
"NEW_RELIC_ACCOUNT_ID": "your-account-id",
|
|
90
|
+
"NEW_RELIC_REGION": "US"
|
|
48
91
|
}
|
|
49
92
|
}
|
|
50
93
|
}
|
|
@@ -67,7 +110,8 @@ Add to your Cline settings in VS Code:
|
|
|
67
110
|
"args": ["-y", "newrelic-mcp"],
|
|
68
111
|
"env": {
|
|
69
112
|
"NEW_RELIC_API_KEY": "your-api-key-here",
|
|
70
|
-
"NEW_RELIC_ACCOUNT_ID": "your-account-id"
|
|
113
|
+
"NEW_RELIC_ACCOUNT_ID": "your-account-id",
|
|
114
|
+
"NEW_RELIC_REGION": "US"
|
|
71
115
|
}
|
|
72
116
|
}
|
|
73
117
|
]
|
|
@@ -115,7 +159,8 @@ Add to your Windsurf Cascade configuration:
|
|
|
115
159
|
"args": ["-y", "newrelic-mcp"],
|
|
116
160
|
"env": {
|
|
117
161
|
"NEW_RELIC_API_KEY": "your-api-key-here",
|
|
118
|
-
"NEW_RELIC_ACCOUNT_ID": "your-account-id"
|
|
162
|
+
"NEW_RELIC_ACCOUNT_ID": "your-account-id",
|
|
163
|
+
"NEW_RELIC_REGION": "US"
|
|
119
164
|
}
|
|
120
165
|
}
|
|
121
166
|
}
|
|
@@ -151,7 +196,8 @@ npm run build
|
|
|
151
196
|
"args": ["/path/to/newrelic-mcp/dist/server.js"],
|
|
152
197
|
"env": {
|
|
153
198
|
"NEW_RELIC_API_KEY": "your-api-key-here",
|
|
154
|
-
"NEW_RELIC_ACCOUNT_ID": "your-account-id"
|
|
199
|
+
"NEW_RELIC_ACCOUNT_ID": "your-account-id",
|
|
200
|
+
"NEW_RELIC_REGION": "US"
|
|
155
201
|
}
|
|
156
202
|
}
|
|
157
203
|
}
|
|
@@ -166,6 +212,7 @@ npm run build
|
|
|
166
212
|
|
|
167
213
|
- `NEW_RELIC_API_KEY` - Your New Relic User API Key (required)
|
|
168
214
|
- `NEW_RELIC_ACCOUNT_ID` - Your New Relic Account ID (optional, can be provided per tool call)
|
|
215
|
+
- `NEW_RELIC_REGION` - New Relic data center region: `US` (default) or `EU` (optional)
|
|
169
216
|
|
|
170
217
|
### Getting Your New Relic Credentials
|
|
171
218
|
|
|
@@ -178,6 +225,11 @@ npm run build
|
|
|
178
225
|
- Find your Account ID in the URL when logged into New Relic
|
|
179
226
|
- Or navigate to **Administration** → **Access management** → **Accounts**
|
|
180
227
|
|
|
228
|
+
3. **Region**:
|
|
229
|
+
- Set `NEW_RELIC_REGION=US` for US data center (default)
|
|
230
|
+
- Set `NEW_RELIC_REGION=EU` for EU data center
|
|
231
|
+
- If not specified, defaults to `US`
|
|
232
|
+
|
|
181
233
|
For detailed setup instructions, see [docs/new-relic-setup.md](docs/new-relic-setup.md).
|
|
182
234
|
|
|
183
235
|
## Usage Examples
|
|
@@ -216,21 +268,42 @@ Once configured, you can interact with New Relic through your MCP client:
|
|
|
216
268
|
"List all synthetic monitors and their success rates"
|
|
217
269
|
```
|
|
218
270
|
|
|
219
|
-
##
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
|
226
|
-
|
|
227
|
-
| `
|
|
228
|
-
| `
|
|
229
|
-
| `
|
|
230
|
-
| `
|
|
231
|
-
| `
|
|
232
|
-
| `
|
|
233
|
-
| `
|
|
271
|
+
## Tool Reference
|
|
272
|
+
|
|
273
|
+
Below is a concise catalog of all MCP tools exposed by this server. See the docs folder for detailed stories/specs.
|
|
274
|
+
|
|
275
|
+
### NerdGraph/GraphQL tools
|
|
276
|
+
|
|
277
|
+
| Tool | Summary |
|
|
278
|
+
|------|---------|
|
|
279
|
+
| `run_nrql_query` | Execute NRQL queries (requires `target_account_id`) |
|
|
280
|
+
| `run_nerdgraph_query` | Execute raw NerdGraph GraphQL queries |
|
|
281
|
+
| `list_apm_applications` | List APM applications via NerdGraph |
|
|
282
|
+
| `search_entities` | Search entities (name, type, tags) |
|
|
283
|
+
| `get_entity_details` | Fetch details for a GUID |
|
|
284
|
+
| `list_alert_policies` | List alert policies via NerdGraph |
|
|
285
|
+
| `list_open_incidents` | List open incidents via NerdGraph |
|
|
286
|
+
| `acknowledge_incident` | Acknowledge an incident (NerdGraph only) |
|
|
287
|
+
| `list_synthetics_monitors` | List Synthetics monitors |
|
|
288
|
+
| `create_browser_monitor` | Create a browser monitor |
|
|
289
|
+
| `get_account_details` | Fetch account metadata |
|
|
290
|
+
|
|
291
|
+
### REST v2 tools (added in v2.0)
|
|
292
|
+
|
|
293
|
+
| Tool | Summary | Notes |
|
|
294
|
+
|------|---------|-------|
|
|
295
|
+
| `create_deployment` | Create deployment marker for an APM application | Inputs: `application_id`, `revision`; optional `changelog`, `description`, `user`; supports `region` |
|
|
296
|
+
| `list_deployments_rest` | List deployments for an app | Supports `page`, `auto_paginate`, `region` |
|
|
297
|
+
| `delete_deployment` | Delete deployment marker | Requires `confirm: true`; User API key must have admin role permissions |
|
|
298
|
+
| `list_apm_applications_rest` | List APM apps via REST | Filters: `filter[name]`, `filter[host]`, `filter[ids]`, `filter[language]`; auto‑paginate |
|
|
299
|
+
| `list_metric_names_for_host` | List metric names/values for host | Inputs: `application_id`, `host_id`, optional `name`; auto‑paginate |
|
|
300
|
+
| `get_metric_data_for_host` | Get timeslice metric data for host | Inputs: `application_id`, `host_id`, `names[]`; optional `values[]`, `from`, `to`, `period`, `summarize`; auto‑paginate |
|
|
301
|
+
| `list_application_hosts` | List hosts for an APM app | Filters: `filter[hostname]`, `filter[ids]`; auto‑paginate |
|
|
302
|
+
| `list_alert_policies_rest` | List alert policies via REST | Optional `filter_name`; supports pagination |
|
|
303
|
+
| `list_open_incidents_rest` | List incidents via REST | Server has no `only_open`/`priority` filters; these are applied client‑side; auto‑paginate |
|
|
304
|
+
|
|
305
|
+
References:
|
|
306
|
+
- Detailed specs and schemas: `docs/REST_ENDPOINT_TOOL.md` and `docs/rest-tools-stories/*`
|
|
234
307
|
|
|
235
308
|
## Troubleshooting
|
|
236
309
|
|
|
@@ -241,6 +314,7 @@ If you're having trouble connecting:
|
|
|
241
314
|
|
|
242
315
|
1. Verify your API key is valid:
|
|
243
316
|
|
|
317
|
+
For US region:
|
|
244
318
|
```bash
|
|
245
319
|
curl -X POST https://api.newrelic.com/graphql \
|
|
246
320
|
-H 'Content-Type: application/json' \
|
|
@@ -248,6 +322,14 @@ If you're having trouble connecting:
|
|
|
248
322
|
-d '{"query":"{ actor { user { email } } }"}'
|
|
249
323
|
```
|
|
250
324
|
|
|
325
|
+
For EU region:
|
|
326
|
+
```bash
|
|
327
|
+
curl -X POST https://api.eu.newrelic.com/graphql \
|
|
328
|
+
-H 'Content-Type: application/json' \
|
|
329
|
+
-H 'API-Key: YOUR_API_KEY' \
|
|
330
|
+
-d '{"query":"{ actor { user { email } } }"}'
|
|
331
|
+
```
|
|
332
|
+
|
|
251
333
|
2. Check that your Account ID is correct
|
|
252
334
|
3. Ensure your API key has the necessary permissions
|
|
253
335
|
4. Check the MCP client logs for detailed error messages
|
|
@@ -306,6 +388,7 @@ npm install
|
|
|
306
388
|
```bash
|
|
307
389
|
NEW_RELIC_API_KEY=your-api-key-here
|
|
308
390
|
NEW_RELIC_ACCOUNT_ID=your-account-id
|
|
391
|
+
NEW_RELIC_REGION=US
|
|
309
392
|
```
|
|
310
393
|
|
|
311
394
|
4. Build the project:
|
|
@@ -426,6 +509,21 @@ This project uses:
|
|
|
426
509
|
- [MCP Inspector Setup](docs/mcp-inspector-setup.md) - Testing and debugging
|
|
427
510
|
- [Logging & Telemetry](docs/logging-telemetry.md) - Test monitoring
|
|
428
511
|
- [Implementation Details](docs/implementation.md) - Architecture deep dive
|
|
512
|
+
- [REST tools overview](docs/REST_ENDPOINT_TOOL.md) - High‑level design for REST v2 tools
|
|
513
|
+
- [REST tool stories](docs/rest-tools-stories/README.md) - Per‑tool specs, schemas, and test plans
|
|
514
|
+
|
|
515
|
+
## Comparisons
|
|
516
|
+
|
|
517
|
+
We researched other public New Relic MCP servers and did not find any actively maintained, feature‑complete alternatives at the time of writing. If you know of one, please open an issue to add it here.
|
|
518
|
+
|
|
519
|
+
| Project | Status | Transport(s) | Deployments | APM Apps | Metrics | Alerts | Synthetics | Notes |
|
|
520
|
+
|---------|--------|---------------|-------------|----------|---------|--------|-----------|-------|
|
|
521
|
+
| This project (newrelic-mcp) | Active | NerdGraph + REST v2 | Create/List/Delete | List (NerdGraph + REST) | Host names + timeslices (REST) | Policies + Incidents (NG + REST) | List/Create (browser) | Comprehensive tests and docs |
|
|
522
|
+
|
|
523
|
+
Planned enhancements (based on REST v2 catalog and user demand):
|
|
524
|
+
- Alerts: violations and conditions management via REST where available
|
|
525
|
+
- Metrics: broader app‑level metrics endpoints (names/data) beyond per‑host
|
|
526
|
+
- Additional REST coverage: labels, key transactions, mobile apps (prioritized by feedback)
|
|
429
527
|
|
|
430
528
|
## Support
|
|
431
529
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"newrelic-client.d.ts","sourceRoot":"","sources":["../../src/client/newrelic-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"newrelic-client.d.ts","sourceRoot":"","sources":["../../src/client/newrelic-client.ts"],"names":[],"mappings":"AAsBA,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAChE,KAAK,eAAe,CAAC,CAAC,IAAI;IAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,QAAQ,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,UAAU,CAAC,EAAE;YACX,KAAK,EAAE,MAAM,CAAC;YACd,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAEtB,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAKhD,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAqBvC,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA8B9D,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IA2EnF,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkExE,OAAO,CAAC,SAAS;IAaX,qBAAqB,CAAC,CAAC,GAAG,OAAO,EACrC,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAwB/B"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NewRelicClient = void 0;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Returns the appropriate NerdGraph API endpoint URL based on the specified region.
|
|
6
|
+
*
|
|
7
|
+
* @param region - The New Relic data center region ('US' or 'EU')
|
|
8
|
+
* @returns The NerdGraph GraphQL API endpoint URL for the specified region
|
|
9
|
+
*/
|
|
10
|
+
function getNerdGraphUrl(region) {
|
|
11
|
+
return region === 'EU'
|
|
12
|
+
? 'https://api.eu.newrelic.com/graphql'
|
|
13
|
+
: 'https://api.newrelic.com/graphql';
|
|
14
|
+
}
|
|
15
|
+
const NERDGRAPH_URL = getNerdGraphUrl(process.env.NEW_RELIC_REGION?.toUpperCase() || 'US');
|
|
5
16
|
class NewRelicClient {
|
|
6
17
|
apiKey;
|
|
7
18
|
defaultAccountId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"newrelic-client.js","sourceRoot":"","sources":["../../src/client/newrelic-client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"newrelic-client.js","sourceRoot":"","sources":["../../src/client/newrelic-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const RestClientOptions: z.ZodObject<{
|
|
3
|
+
apiKey: z.ZodString;
|
|
4
|
+
region: z.ZodDefault<z.ZodEnum<["US", "EU"]>>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
region: "US" | "EU";
|
|
7
|
+
apiKey: string;
|
|
8
|
+
}, {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
region?: "US" | "EU" | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type RestClientOptions = z.infer<typeof RestClientOptions>;
|
|
13
|
+
export type Region = 'US' | 'EU';
|
|
14
|
+
declare function baseUrlForRegion(region: Region): string;
|
|
15
|
+
declare function serializeQuery(params: Record<string, unknown> | undefined): string;
|
|
16
|
+
declare function parseLinkHeader(linkHeader: string | null): Record<string, string>;
|
|
17
|
+
export interface RestResponse<T> {
|
|
18
|
+
status: number;
|
|
19
|
+
data: T;
|
|
20
|
+
links?: Record<string, string>;
|
|
21
|
+
url: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class NewRelicRestClient {
|
|
24
|
+
private readonly apiKey;
|
|
25
|
+
private readonly region;
|
|
26
|
+
constructor(options: RestClientOptions);
|
|
27
|
+
private buildUrl;
|
|
28
|
+
get<T>(path: string, query?: Record<string, unknown>): Promise<RestResponse<T>>;
|
|
29
|
+
post<T>(path: string, body: unknown): Promise<RestResponse<T>>;
|
|
30
|
+
delete<T>(path: string): Promise<RestResponse<T>>;
|
|
31
|
+
}
|
|
32
|
+
export declare const __test__: {
|
|
33
|
+
serializeQuery: typeof serializeQuery;
|
|
34
|
+
parseLinkHeader: typeof parseLinkHeader;
|
|
35
|
+
baseUrlForRegion: typeof baseUrlForRegion;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=rest-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-client.d.ts","sourceRoot":"","sources":["../../src/client/rest-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAc3E;AAED,iBAAS,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1E;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,iBAAiB;IAMtC,OAAO,CAAC,QAAQ;IAQV,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAiB/E,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAkB9D,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAgBxD;AAED,eAAO,MAAM,QAAQ;;;;CAAwD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.__test__ = exports.NewRelicRestClient = exports.RestClientOptions = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
exports.RestClientOptions = zod_1.z.object({
|
|
7
|
+
apiKey: zod_1.z.string().min(1),
|
|
8
|
+
region: zod_1.z.enum(['US', 'EU']).default('US'),
|
|
9
|
+
});
|
|
10
|
+
function baseUrlForRegion(region) {
|
|
11
|
+
return region === 'EU' ? 'https://api.eu.newrelic.com/v2' : 'https://api.newrelic.com/v2';
|
|
12
|
+
}
|
|
13
|
+
function serializeQuery(params) {
|
|
14
|
+
if (!params)
|
|
15
|
+
return '';
|
|
16
|
+
const query = new URLSearchParams();
|
|
17
|
+
for (const [key, value] of Object.entries(params)) {
|
|
18
|
+
if (value === undefined || value === null)
|
|
19
|
+
continue;
|
|
20
|
+
if (Array.isArray(value)) {
|
|
21
|
+
// arrays as repeated params: names[]=a&names[]=b
|
|
22
|
+
value.forEach((v) => query.append(`${key}[]`, String(v)));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
query.set(key, String(value));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const qs = query.toString();
|
|
29
|
+
return qs ? `?${qs}` : '';
|
|
30
|
+
}
|
|
31
|
+
function parseLinkHeader(linkHeader) {
|
|
32
|
+
if (!linkHeader)
|
|
33
|
+
return {};
|
|
34
|
+
const parts = linkHeader.split(',');
|
|
35
|
+
const links = {};
|
|
36
|
+
for (const part of parts) {
|
|
37
|
+
const section = part.split(';');
|
|
38
|
+
if (section.length < 2)
|
|
39
|
+
continue;
|
|
40
|
+
const url = section[0].trim().replace(/^<|>$/g, '');
|
|
41
|
+
const relMatch = section[1].match(/rel="(.*)"/);
|
|
42
|
+
const rel = relMatch?.[1];
|
|
43
|
+
if (rel) {
|
|
44
|
+
links[rel] = url;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return links;
|
|
48
|
+
}
|
|
49
|
+
class NewRelicRestClient {
|
|
50
|
+
apiKey;
|
|
51
|
+
region;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
const parsed = exports.RestClientOptions.parse(options);
|
|
54
|
+
this.apiKey = parsed.apiKey;
|
|
55
|
+
this.region = parsed.region;
|
|
56
|
+
}
|
|
57
|
+
buildUrl(path, query) {
|
|
58
|
+
const base = baseUrlForRegion(this.region);
|
|
59
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
60
|
+
const hasJson = normalizedPath.endsWith('.json');
|
|
61
|
+
const qs = serializeQuery(query);
|
|
62
|
+
return `${base}${hasJson ? normalizedPath : `${normalizedPath}.json`}${qs}`;
|
|
63
|
+
}
|
|
64
|
+
async get(path, query) {
|
|
65
|
+
const url = this.buildUrl(path, query);
|
|
66
|
+
const response = await fetch(url, {
|
|
67
|
+
method: 'GET',
|
|
68
|
+
headers: {
|
|
69
|
+
'Content-Type': 'application/json',
|
|
70
|
+
'Api-Key': this.apiKey,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
const links = parseLinkHeader(response.headers.get('link'));
|
|
74
|
+
const data = (await response.json());
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
throw new Error(`REST API error: ${response.status} ${response.statusText}`);
|
|
77
|
+
}
|
|
78
|
+
return { status: response.status, data, links, url };
|
|
79
|
+
}
|
|
80
|
+
async post(path, body) {
|
|
81
|
+
const url = this.buildUrl(path);
|
|
82
|
+
const response = await fetch(url, {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: {
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
'Api-Key': this.apiKey,
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify(body),
|
|
89
|
+
});
|
|
90
|
+
const links = parseLinkHeader(response.headers.get('link'));
|
|
91
|
+
const data = (await response.json());
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
throw new Error(`REST API error: ${response.status} ${response.statusText}`);
|
|
94
|
+
}
|
|
95
|
+
return { status: response.status, data, links, url };
|
|
96
|
+
}
|
|
97
|
+
async delete(path) {
|
|
98
|
+
const url = this.buildUrl(path);
|
|
99
|
+
const response = await fetch(url, {
|
|
100
|
+
method: 'DELETE',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
'Api-Key': this.apiKey,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
const links = parseLinkHeader(response.headers.get('link'));
|
|
107
|
+
const data = (await response.json());
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error(`REST API error: ${response.status} ${response.statusText}`);
|
|
110
|
+
}
|
|
111
|
+
return { status: response.status, data, links, url };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.NewRelicRestClient = NewRelicRestClient;
|
|
115
|
+
exports.__test__ = { serializeQuery, parseLinkHeader, baseUrlForRegion };
|
|
116
|
+
//# sourceMappingURL=rest-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-client.js","sourceRoot":"","sources":["../../src/client/rest-client.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAIA,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAIA,OAAO,EAKL,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAW1D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAEtB,MAAM,CAAC,EAAE,cAAc;IA4BnC,OAAO,CAAC,aAAa;IAmDrB,OAAO,CAAC,aAAa;IA8Bf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAChF,OAAO,CAAC,OAAO,CAAC;IA2InB,OAAO,CAAC,iBAAiB;IAczB,WAAW;;;;;IAQX,kBAAkB,IAAI,MAAM,EAAE;IAI9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC,mBAAmB,IAAI,MAAM,GAAG,SAAS;CAG1C"}
|
package/dist/server.js
CHANGED
|
@@ -11,6 +11,9 @@ const apm_1 = require("./tools/apm");
|
|
|
11
11
|
const entity_1 = require("./tools/entity");
|
|
12
12
|
const nerdgraph_1 = require("./tools/nerdgraph");
|
|
13
13
|
const nrql_1 = require("./tools/nrql");
|
|
14
|
+
const apm_2 = require("./tools/rest/apm");
|
|
15
|
+
const deployments_1 = require("./tools/rest/deployments");
|
|
16
|
+
const metrics_1 = require("./tools/rest/metrics");
|
|
14
17
|
const synthetics_1 = require("./tools/synthetics");
|
|
15
18
|
class NewRelicMCPServer {
|
|
16
19
|
server;
|
|
@@ -23,10 +26,10 @@ class NewRelicMCPServer {
|
|
|
23
26
|
this.client = client;
|
|
24
27
|
}
|
|
25
28
|
else {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.client = new newrelic_client_1.NewRelicClient(
|
|
29
|
+
// Best practice for Smithery tool discovery: do not force auth at startup
|
|
30
|
+
// Allow listing tools without credentials; validate when tools are invoked
|
|
31
|
+
const apiKey = process.env.NEW_RELIC_API_KEY || '';
|
|
32
|
+
this.client = new newrelic_client_1.NewRelicClient(apiKey, this.defaultAccountId);
|
|
30
33
|
}
|
|
31
34
|
this.server = new index_js_1.Server({
|
|
32
35
|
name: 'newrelic-mcp',
|
|
@@ -47,6 +50,9 @@ class NewRelicMCPServer {
|
|
|
47
50
|
const alertTool = new alert_1.AlertTool(this.client);
|
|
48
51
|
const syntheticsTool = new synthetics_1.SyntheticsTool(this.client);
|
|
49
52
|
const nerdGraphTool = new nerdgraph_1.NerdGraphTool(this.client);
|
|
53
|
+
const restDeployments = new deployments_1.RestDeploymentsTool();
|
|
54
|
+
const restApm = new apm_2.RestApmTool();
|
|
55
|
+
const restMetrics = new metrics_1.RestMetricsTool();
|
|
50
56
|
// Register all tools
|
|
51
57
|
const tools = [
|
|
52
58
|
nrqlTool.getToolDefinition(),
|
|
@@ -59,6 +65,14 @@ class NewRelicMCPServer {
|
|
|
59
65
|
syntheticsTool.getListMonitorsTool(),
|
|
60
66
|
syntheticsTool.getCreateMonitorTool(),
|
|
61
67
|
nerdGraphTool.getQueryTool(),
|
|
68
|
+
// REST v2 tools
|
|
69
|
+
restDeployments.getCreateTool(),
|
|
70
|
+
restDeployments.getListTool(),
|
|
71
|
+
restDeployments.getDeleteTool(),
|
|
72
|
+
restApm.getListApplicationsTool(),
|
|
73
|
+
restMetrics.getListMetricNamesTool(),
|
|
74
|
+
restMetrics.getMetricDataTool(),
|
|
75
|
+
restMetrics.getListApplicationHostsTool(),
|
|
62
76
|
{
|
|
63
77
|
name: 'get_account_details',
|
|
64
78
|
description: 'Get New Relic account details',
|
|
@@ -104,9 +118,12 @@ class NewRelicMCPServer {
|
|
|
104
118
|
});
|
|
105
119
|
}
|
|
106
120
|
async start() {
|
|
107
|
-
|
|
108
|
-
if (
|
|
109
|
-
|
|
121
|
+
// Only validate if credentials were provided; otherwise allow startup for tool discovery
|
|
122
|
+
if (process.env.NEW_RELIC_API_KEY) {
|
|
123
|
+
const isValid = await this.client.validateCredentials();
|
|
124
|
+
if (!isValid) {
|
|
125
|
+
throw new Error('Invalid New Relic API credentials');
|
|
126
|
+
}
|
|
110
127
|
}
|
|
111
128
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
112
129
|
await this.server.connect(transport);
|
|
@@ -128,6 +145,20 @@ class NewRelicMCPServer {
|
|
|
128
145
|
...args,
|
|
129
146
|
target_account_id: accountId,
|
|
130
147
|
});
|
|
148
|
+
case 'create_deployment':
|
|
149
|
+
return await new deployments_1.RestDeploymentsTool().create(args);
|
|
150
|
+
case 'list_deployments_rest':
|
|
151
|
+
return await new deployments_1.RestDeploymentsTool().list(args);
|
|
152
|
+
case 'delete_deployment':
|
|
153
|
+
return await new deployments_1.RestDeploymentsTool().delete(args);
|
|
154
|
+
case 'list_apm_applications_rest':
|
|
155
|
+
return await new apm_2.RestApmTool().listApplications(args);
|
|
156
|
+
case 'list_metric_names_for_host':
|
|
157
|
+
return await new metrics_1.RestMetricsTool().listMetricNames(args);
|
|
158
|
+
case 'get_metric_data_for_host':
|
|
159
|
+
return await new metrics_1.RestMetricsTool().getMetricData(args);
|
|
160
|
+
case 'list_application_hosts':
|
|
161
|
+
return await new metrics_1.RestMetricsTool().listApplicationHosts(args);
|
|
131
162
|
case 'get_account_details':
|
|
132
163
|
return await this.client.getAccountDetails(accountId);
|
|
133
164
|
case 'list_alert_policies':
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;AAEA,wEAAmE;AACnE,wEAAiF;AACjF,iEAM4C;AAC5C,8DAA0D;AAC1D,yCAA0C;AAC1C,qCAAsC;AACtC,2CAA4C;AAC5C,iDAAkD;AAClD,uCAAwC;AACxC,mDAAoD;AAEpD,MAAa,iBAAiB;IACpB,MAAM,CAAS;IACf,MAAM,CAAiB;IACvB,KAAK,CAAoB;IACzB,gBAAgB,CAAU;IAElC,YAAY,MAAuB;QACjC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;AAEA,wEAAmE;AACnE,wEAAiF;AACjF,iEAM4C;AAC5C,8DAA0D;AAC1D,yCAA0C;AAC1C,qCAAsC;AACtC,2CAA4C;AAC5C,iDAAkD;AAClD,uCAAwC;AACxC,0CAA+C;AAC/C,0DAA+D;AAC/D,kDAAuD;AACvD,mDAAoD;AAEpD,MAAa,iBAAiB;IACpB,MAAM,CAAS;IACf,MAAM,CAAiB;IACvB,KAAK,CAAoB;IACzB,gBAAgB,CAAU;IAElC,YAAY,MAAuB;QACjC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,0EAA0E;YAC1E,2EAA2E;YAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,GAAG,IAAI,gCAAc,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAM,CACtB;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;aACV;SACF,CACF,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,eAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,aAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,iBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,IAAI,2BAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,IAAI,iCAAmB,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,iBAAW,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,yBAAe,EAAE,CAAC;QAE1C,qBAAqB;QACrB,MAAM,KAAK,GAAG;YACZ,QAAQ,CAAC,iBAAiB,EAAE;YAC5B,OAAO,CAAC,uBAAuB,EAAE;YACjC,UAAU,CAAC,aAAa,EAAE;YAC1B,UAAU,CAAC,cAAc,EAAE;YAC3B,SAAS,CAAC,eAAe,EAAE;YAC3B,SAAS,CAAC,gBAAgB,EAAE;YAC5B,SAAS,CAAC,kBAAkB,EAAE;YAC9B,cAAc,CAAC,mBAAmB,EAAE;YACpC,cAAc,CAAC,oBAAoB,EAAE;YACrC,aAAa,CAAC,YAAY,EAAE;YAC5B,gBAAgB;YAChB,eAAe,CAAC,aAAa,EAAE;YAC/B,eAAe,CAAC,WAAW,EAAE;YAC7B,eAAe,CAAC,aAAa,EAAE;YAC/B,OAAO,CAAC,uBAAuB,EAAE;YACjC,WAAW,CAAC,sBAAsB,EAAE;YACpC,WAAW,CAAC,iBAAiB,EAAE;YAC/B,WAAW,CAAC,2BAA2B,EAAE;YACzC;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,WAAW,EAAE,+BAA+B;gBAC5C,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,iBAAiB,EAAE;4BACjB,IAAI,EAAE,QAAiB;4BACvB,WAAW,EAAE,wCAAwC;yBACtD;qBACF;iBACF;aACF;SACF,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACvC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,gCAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,mBAAQ,CAAC,oBAAS,CAAC,cAAc,EAAE,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC;YACxF,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAE3F,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;gBACjF,MAAM,IAAI,mBAAQ,CAAC,oBAAS,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,yFAAyF;QACzF,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACxD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,IAAiF;QAEjF,MAAM,SAAS,GACb,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAErE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB;gBACnB,OAAO,MAAM,IAAI,eAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;oBAC7C,GAAG,IAAI;oBACP,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,KAAK,uBAAuB;gBAC1B,OAAO,MAAM,IAAI,aAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;oBAC5C,GAAG,IAAI;oBACP,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,KAAK,mBAAmB;gBACtB,OAAO,MAAM,IAAI,iCAAmB,EAAE,CAAC,MAAM,CAC3C,IAAoD,CACrD,CAAC;YACJ,KAAK,uBAAuB;gBAC1B,OAAO,MAAM,IAAI,iCAAmB,EAAE,CAAC,IAAI,CACzC,IAAkD,CACnD,CAAC;YACJ,KAAK,mBAAmB;gBACtB,OAAO,MAAM,IAAI,iCAAmB,EAAE,CAAC,MAAM,CAC3C,IAAoD,CACrD,CAAC;YACJ,KAAK,4BAA4B;gBAC/B,OAAO,MAAM,IAAI,iBAAW,EAAE,CAAC,gBAAgB,CAC7C,IAAsD,CACvD,CAAC;YACJ,KAAK,4BAA4B;gBAC/B,OAAO,MAAM,IAAI,yBAAe,EAAE,CAAC,eAAe,CAChD,IAAyD,CAC1D,CAAC;YACJ,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,IAAI,yBAAe,EAAE,CAAC,aAAa,CAC9C,IAAuD,CACxD,CAAC;YACJ,KAAK,wBAAwB;gBAC3B,OAAO,MAAM,IAAI,yBAAe,EAAE,CAAC,oBAAoB,CACrD,IAA8D,CAC/D,CAAC;YACJ,KAAK,qBAAqB;gBACxB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACxD,KAAK,qBAAqB;gBACxB,OAAO,MAAM,IAAI,iBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC;oBACxD,GAAG,IAAI;oBACP,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,KAAK,qBAAqB;gBACxB,OAAO,MAAM,IAAI,iBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC;oBACxD,GAAG,IAAI;oBACP,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAA+B,CAAC;gBACjE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACjE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACxF,CAAC;gBACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACpF,CAAC;gBACD,OAAO,MAAM,IAAI,iBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC;oBAC1D,WAAW;oBACX,OAAO,EAAE,OAA6B;iBACvC,CAAC,CAAC;YACL,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAA+B,CAAC;gBAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACrD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,KAA2B,CAAC;gBAChC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACjC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBACjF,CAAC;oBACD,KAAK,GAAI,YAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;gBACxF,CAAC;gBACD,OAAO,MAAM,IAAI,mBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC;oBACtD,KAAK;oBACL,YAAY,EAAE,KAAK;oBACnB,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC;YACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,EAAE,WAAW,EAAE,GAAG,IAA+B,CAAC;gBACxD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACjE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;gBACtF,CAAC;gBACD,OAAO,MAAM,IAAI,mBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,IAAI,2BAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC;oBAClE,GAAG,IAAI;oBACP,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,KAAK,wBAAwB,CAAC,CAAC,CAAC;gBAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAA+B,CAAC;gBAC5E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACnD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBACnF,CAAC;gBACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACjD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;gBAClF,CAAC;gBACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;oBACnF,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;gBACvF,CAAC;gBACD,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;oBACxB,SAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAC3D,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACrF,CAAC;gBACD,OAAO,MAAM,IAAI,2BAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;oBAChE,IAAI;oBACJ,GAAG;oBACH,SAAS;oBACT,SAAS,EAAE,SAAqB;oBAChC,iBAAiB,EAAE,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC;YACD,KAAK,qBAAqB;gBACxB,OAAO,MAAM,IAAI,yBAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,kBAAkB,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,MAAM,oBAAoB,GAAG;YAC3B,gBAAgB;YAChB,uBAAuB;YACvB,iBAAiB;YACjB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,0BAA0B;YAC1B,wBAAwB;SACzB,CAAC;QACF,OAAO,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,WAAW;QACT,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,6DAA6D;SAC3E,CAAC;IACJ,CAAC;IAED,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAjTD,8CAiTC;AAED,mBAAmB;AACnB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Region } from '../../client/rest-client';
|
|
3
|
+
type ListPoliciesArgs = {
|
|
4
|
+
filter_name?: string;
|
|
5
|
+
page?: number;
|
|
6
|
+
auto_paginate?: boolean;
|
|
7
|
+
region?: Region;
|
|
8
|
+
};
|
|
9
|
+
type ListIncidentsArgs = {
|
|
10
|
+
page?: number;
|
|
11
|
+
auto_paginate?: boolean;
|
|
12
|
+
only_open?: boolean;
|
|
13
|
+
priority?: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
14
|
+
region?: Region;
|
|
15
|
+
};
|
|
16
|
+
export declare class RestAlertsTool {
|
|
17
|
+
private restFor;
|
|
18
|
+
getListPoliciesTool(): Tool;
|
|
19
|
+
listPolicies(args: ListPoliciesArgs): Promise<unknown>;
|
|
20
|
+
getListIncidentsTool(): Tool;
|
|
21
|
+
listIncidents(args: ListIncidentsArgs): Promise<unknown>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../../src/tools/rest/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE3E,KAAK,gBAAgB,GAAG;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO;IAKf,mBAAmB,IAAI,IAAI;IAgBrB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5D,oBAAoB,IAAI,IAAI;IAiBtB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAwC/D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestAlertsTool = void 0;
|
|
4
|
+
const rest_client_1 = require("../../client/rest-client");
|
|
5
|
+
class RestAlertsTool {
|
|
6
|
+
restFor(region) {
|
|
7
|
+
const apiKey = process.env.NEW_RELIC_API_KEY;
|
|
8
|
+
return new rest_client_1.NewRelicRestClient({ apiKey, region: region ?? 'US' });
|
|
9
|
+
}
|
|
10
|
+
getListPoliciesTool() {
|
|
11
|
+
return {
|
|
12
|
+
name: 'list_alert_policies_rest',
|
|
13
|
+
description: 'List alert policies via REST v2.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
filter_name: { type: 'string' },
|
|
18
|
+
page: { type: 'number' },
|
|
19
|
+
auto_paginate: { type: 'boolean' },
|
|
20
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async listPolicies(args) {
|
|
26
|
+
const client = this.restFor(args.region);
|
|
27
|
+
const path = '/alerts_policies';
|
|
28
|
+
const query = {};
|
|
29
|
+
if (args.filter_name)
|
|
30
|
+
query['filter[name]'] = args.filter_name;
|
|
31
|
+
if (args.page)
|
|
32
|
+
query.page = args.page;
|
|
33
|
+
const res = await client.get(path, query);
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
getListIncidentsTool() {
|
|
37
|
+
return {
|
|
38
|
+
name: 'list_open_incidents_rest',
|
|
39
|
+
description: 'List alert incidents via REST v2 (client-side filtering of open/priority).',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
only_open: { type: 'boolean' },
|
|
44
|
+
priority: { type: 'string', enum: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'] },
|
|
45
|
+
page: { type: 'number' },
|
|
46
|
+
auto_paginate: { type: 'boolean' },
|
|
47
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async listIncidents(args) {
|
|
53
|
+
const client = this.restFor(args.region);
|
|
54
|
+
const path = '/alerts_incidents';
|
|
55
|
+
const query = {};
|
|
56
|
+
if (args.page)
|
|
57
|
+
query.page = args.page;
|
|
58
|
+
const results = [];
|
|
59
|
+
let nextUrl;
|
|
60
|
+
let page = args.page;
|
|
61
|
+
do {
|
|
62
|
+
const res = await client.get(path, page ? { ...query, page } : query);
|
|
63
|
+
results.push(res.data);
|
|
64
|
+
const next = res.links?.next;
|
|
65
|
+
if (args.auto_paginate && next) {
|
|
66
|
+
const u = new URL(next);
|
|
67
|
+
const p = u.searchParams.get('page');
|
|
68
|
+
page = p ? Number(p) : undefined;
|
|
69
|
+
nextUrl = next;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
nextUrl = undefined;
|
|
73
|
+
}
|
|
74
|
+
} while (args.auto_paginate && nextUrl);
|
|
75
|
+
const combined = args.auto_paginate ? results.flat() : results[0];
|
|
76
|
+
// Apply client-side filters if requested
|
|
77
|
+
let items = combined;
|
|
78
|
+
if (Array.isArray(combined)) {
|
|
79
|
+
items = combined.filter((inc) => {
|
|
80
|
+
let ok = true;
|
|
81
|
+
if (args.only_open === true) {
|
|
82
|
+
ok = ok && (!inc.closed_at || inc.closed_at === 0);
|
|
83
|
+
}
|
|
84
|
+
if (args.priority) {
|
|
85
|
+
ok = ok && inc.priority === args.priority;
|
|
86
|
+
}
|
|
87
|
+
return ok;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return { items, page };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.RestAlertsTool = RestAlertsTool;
|
|
94
|
+
//# sourceMappingURL=alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../../src/tools/rest/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Region } from '../../client/rest-client';
|
|
3
|
+
type ListApplicationsArgs = {
|
|
4
|
+
filter_name?: string;
|
|
5
|
+
filter_host?: string;
|
|
6
|
+
filter_ids?: number[];
|
|
7
|
+
filter_language?: string;
|
|
8
|
+
page?: number;
|
|
9
|
+
auto_paginate?: boolean;
|
|
10
|
+
region?: Region;
|
|
11
|
+
};
|
|
12
|
+
export declare class RestApmTool {
|
|
13
|
+
private restFor;
|
|
14
|
+
getListApplicationsTool(): Tool;
|
|
15
|
+
listApplications(args: ListApplicationsArgs): Promise<unknown>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=apm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apm.d.ts","sourceRoot":"","sources":["../../../src/tools/rest/apm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE3E,KAAK,oBAAoB,GAAG;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO;IAKf,uBAAuB,IAAI,IAAI;IAmBzB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;CA8BrE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestApmTool = void 0;
|
|
4
|
+
const rest_client_1 = require("../../client/rest-client");
|
|
5
|
+
class RestApmTool {
|
|
6
|
+
restFor(region) {
|
|
7
|
+
const apiKey = process.env.NEW_RELIC_API_KEY;
|
|
8
|
+
return new rest_client_1.NewRelicRestClient({ apiKey, region: region ?? 'US' });
|
|
9
|
+
}
|
|
10
|
+
getListApplicationsTool() {
|
|
11
|
+
return {
|
|
12
|
+
name: 'list_apm_applications_rest',
|
|
13
|
+
description: 'List APM applications via REST v2.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
filter_name: { type: 'string' },
|
|
18
|
+
filter_host: { type: 'string' },
|
|
19
|
+
filter_ids: { type: 'array', items: { type: 'number' } },
|
|
20
|
+
filter_language: { type: 'string' },
|
|
21
|
+
page: { type: 'number' },
|
|
22
|
+
auto_paginate: { type: 'boolean' },
|
|
23
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async listApplications(args) {
|
|
29
|
+
const client = this.restFor(args.region);
|
|
30
|
+
const path = '/applications';
|
|
31
|
+
const query = {};
|
|
32
|
+
if (args.filter_name)
|
|
33
|
+
query['filter[name]'] = args.filter_name;
|
|
34
|
+
if (args.filter_host)
|
|
35
|
+
query['filter[host]'] = args.filter_host;
|
|
36
|
+
if (args.filter_language)
|
|
37
|
+
query['filter[language]'] = args.filter_language;
|
|
38
|
+
if (args.filter_ids && args.filter_ids.length > 0)
|
|
39
|
+
query['filter[ids]'] = args.filter_ids.join(',');
|
|
40
|
+
if (args.page)
|
|
41
|
+
query.page = args.page;
|
|
42
|
+
const results = [];
|
|
43
|
+
let nextUrl;
|
|
44
|
+
let page = args.page;
|
|
45
|
+
do {
|
|
46
|
+
const res = await client.get(path, page ? { ...query, page } : query);
|
|
47
|
+
results.push(res.data);
|
|
48
|
+
const next = res.links?.next;
|
|
49
|
+
if (args.auto_paginate && next) {
|
|
50
|
+
const u = new URL(next);
|
|
51
|
+
const p = u.searchParams.get('page');
|
|
52
|
+
page = p ? Number(p) : undefined;
|
|
53
|
+
nextUrl = next;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
nextUrl = undefined;
|
|
57
|
+
}
|
|
58
|
+
} while (args.auto_paginate && nextUrl);
|
|
59
|
+
return { items: args.auto_paginate ? results : results[0], page };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.RestApmTool = RestApmTool;
|
|
63
|
+
//# sourceMappingURL=apm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apm.js","sourceRoot":"","sources":["../../../src/tools/rest/apm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Region } from '../../client/rest-client';
|
|
3
|
+
type CreateDeploymentArgs = {
|
|
4
|
+
application_id: number;
|
|
5
|
+
revision: string;
|
|
6
|
+
changelog?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
user?: string;
|
|
9
|
+
region?: Region;
|
|
10
|
+
};
|
|
11
|
+
type ListDeploymentsArgs = {
|
|
12
|
+
application_id: number;
|
|
13
|
+
page?: number;
|
|
14
|
+
auto_paginate?: boolean;
|
|
15
|
+
region?: Region;
|
|
16
|
+
};
|
|
17
|
+
type DeleteDeploymentArgs = {
|
|
18
|
+
application_id: number;
|
|
19
|
+
id: number;
|
|
20
|
+
confirm: true;
|
|
21
|
+
region?: Region;
|
|
22
|
+
};
|
|
23
|
+
export declare class RestDeploymentsTool {
|
|
24
|
+
private restFor;
|
|
25
|
+
getCreateTool(): Tool;
|
|
26
|
+
create(args: CreateDeploymentArgs): Promise<unknown>;
|
|
27
|
+
getListTool(): Tool;
|
|
28
|
+
list(args: ListDeploymentsArgs): Promise<unknown>;
|
|
29
|
+
getDeleteTool(): Tool;
|
|
30
|
+
delete(args: DeleteDeploymentArgs): Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=deployments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../../src/tools/rest/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE3E,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO;IAKf,aAAa,IAAI,IAAI;IAmBf,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1D,WAAW,IAAI,IAAI;IAiBb,IAAI,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BvD,aAAa,IAAI,IAAI;IAiBf,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;CAS3D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestDeploymentsTool = void 0;
|
|
4
|
+
const rest_client_1 = require("../../client/rest-client");
|
|
5
|
+
class RestDeploymentsTool {
|
|
6
|
+
restFor(region) {
|
|
7
|
+
const apiKey = process.env.NEW_RELIC_API_KEY;
|
|
8
|
+
return new rest_client_1.NewRelicRestClient({ apiKey, region: region ?? 'US' });
|
|
9
|
+
}
|
|
10
|
+
getCreateTool() {
|
|
11
|
+
return {
|
|
12
|
+
name: 'create_deployment',
|
|
13
|
+
description: 'Create a deployment marker for an APM application (REST v2).',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
application_id: { type: 'number' },
|
|
18
|
+
revision: { type: 'string' },
|
|
19
|
+
changelog: { type: 'string' },
|
|
20
|
+
description: { type: 'string' },
|
|
21
|
+
user: { type: 'string' },
|
|
22
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
23
|
+
},
|
|
24
|
+
required: ['application_id', 'revision'],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async create(args) {
|
|
29
|
+
const client = this.restFor(args.region);
|
|
30
|
+
const path = `/applications/${args.application_id}/deployments`;
|
|
31
|
+
const payload = {
|
|
32
|
+
deployment: {
|
|
33
|
+
revision: args.revision,
|
|
34
|
+
changelog: args.changelog,
|
|
35
|
+
description: args.description,
|
|
36
|
+
user: args.user,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const res = await client.post(path, payload);
|
|
40
|
+
return { ...res };
|
|
41
|
+
}
|
|
42
|
+
getListTool() {
|
|
43
|
+
return {
|
|
44
|
+
name: 'list_deployments_rest',
|
|
45
|
+
description: 'List deployments for an APM application (REST v2).',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
application_id: { type: 'number' },
|
|
50
|
+
page: { type: 'number' },
|
|
51
|
+
auto_paginate: { type: 'boolean' },
|
|
52
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
53
|
+
},
|
|
54
|
+
required: ['application_id'],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async list(args) {
|
|
59
|
+
const client = this.restFor(args.region);
|
|
60
|
+
const path = `/applications/${args.application_id}/deployments`;
|
|
61
|
+
const results = [];
|
|
62
|
+
let page = args.page;
|
|
63
|
+
let nextUrl;
|
|
64
|
+
do {
|
|
65
|
+
const res = await client.get(path, page ? { page } : undefined);
|
|
66
|
+
results.push(res.data);
|
|
67
|
+
const next = res.links?.next;
|
|
68
|
+
if (args.auto_paginate && next) {
|
|
69
|
+
// Extract page from next URL if present
|
|
70
|
+
const u = new URL(next);
|
|
71
|
+
const p = u.searchParams.get('page');
|
|
72
|
+
page = p ? Number(p) : undefined;
|
|
73
|
+
nextUrl = next;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
nextUrl = undefined;
|
|
77
|
+
}
|
|
78
|
+
} while (args.auto_paginate && nextUrl);
|
|
79
|
+
return {
|
|
80
|
+
items: args.auto_paginate ? results : results[0],
|
|
81
|
+
page: page,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
getDeleteTool() {
|
|
85
|
+
return {
|
|
86
|
+
name: 'delete_deployment',
|
|
87
|
+
description: 'Delete a deployment record (REST v2). Requires admin role permissions.',
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
application_id: { type: 'number' },
|
|
92
|
+
id: { type: 'number' },
|
|
93
|
+
confirm: { type: 'boolean' },
|
|
94
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
95
|
+
},
|
|
96
|
+
required: ['application_id', 'id', 'confirm'],
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async delete(args) {
|
|
101
|
+
if (args.confirm !== true) {
|
|
102
|
+
throw new Error('delete_deployment: confirm must be true');
|
|
103
|
+
}
|
|
104
|
+
const client = this.restFor(args.region);
|
|
105
|
+
const path = `/applications/${args.application_id}/deployments/${args.id}`;
|
|
106
|
+
const res = await client.delete(path);
|
|
107
|
+
return { ...res };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.RestDeploymentsTool = RestDeploymentsTool;
|
|
111
|
+
//# sourceMappingURL=deployments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../../src/tools/rest/deployments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Region } from '../../client/rest-client';
|
|
3
|
+
type ListMetricNamesArgs = {
|
|
4
|
+
application_id: number;
|
|
5
|
+
host_id: number;
|
|
6
|
+
name?: string;
|
|
7
|
+
page?: number;
|
|
8
|
+
auto_paginate?: boolean;
|
|
9
|
+
region?: Region;
|
|
10
|
+
};
|
|
11
|
+
type GetMetricDataArgs = {
|
|
12
|
+
application_id: number;
|
|
13
|
+
host_id: number;
|
|
14
|
+
names: string[];
|
|
15
|
+
values?: string[];
|
|
16
|
+
from?: string;
|
|
17
|
+
to?: string;
|
|
18
|
+
period?: number;
|
|
19
|
+
summarize?: boolean;
|
|
20
|
+
page?: number;
|
|
21
|
+
auto_paginate?: boolean;
|
|
22
|
+
region?: Region;
|
|
23
|
+
};
|
|
24
|
+
type ListHostsArgs = {
|
|
25
|
+
application_id: number;
|
|
26
|
+
filter_hostname?: string;
|
|
27
|
+
filter_ids?: string;
|
|
28
|
+
page?: number;
|
|
29
|
+
auto_paginate?: boolean;
|
|
30
|
+
region?: Region;
|
|
31
|
+
};
|
|
32
|
+
export declare class RestMetricsTool {
|
|
33
|
+
private restFor;
|
|
34
|
+
getListMetricNamesTool(): Tool;
|
|
35
|
+
listMetricNames(args: ListMetricNamesArgs): Promise<unknown>;
|
|
36
|
+
getMetricDataTool(): Tool;
|
|
37
|
+
getMetricData(args: GetMetricDataArgs): Promise<unknown>;
|
|
38
|
+
getListApplicationHostsTool(): Tool;
|
|
39
|
+
listApplicationHosts(args: ListHostsArgs): Promise<unknown>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/tools/rest/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE3E,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO;IAKf,sBAAsB,IAAI,IAAI;IAmBxB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBlE,iBAAiB,IAAI,IAAI;IAwBnB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B9D,2BAA2B,IAAI,IAAI;IAmB7B,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;CAUlE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestMetricsTool = void 0;
|
|
4
|
+
const rest_client_1 = require("../../client/rest-client");
|
|
5
|
+
class RestMetricsTool {
|
|
6
|
+
restFor(region) {
|
|
7
|
+
const apiKey = process.env.NEW_RELIC_API_KEY;
|
|
8
|
+
return new rest_client_1.NewRelicRestClient({ apiKey, region: region ?? 'US' });
|
|
9
|
+
}
|
|
10
|
+
getListMetricNamesTool() {
|
|
11
|
+
return {
|
|
12
|
+
name: 'list_metric_names_for_host',
|
|
13
|
+
description: 'List metric names and values for a specific application host (REST v2).',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
application_id: { type: 'number' },
|
|
18
|
+
host_id: { type: 'number' },
|
|
19
|
+
name: { type: 'string' },
|
|
20
|
+
page: { type: 'number' },
|
|
21
|
+
auto_paginate: { type: 'boolean' },
|
|
22
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
23
|
+
},
|
|
24
|
+
required: ['application_id', 'host_id'],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async listMetricNames(args) {
|
|
29
|
+
const client = this.restFor(args.region);
|
|
30
|
+
const path = `/applications/${args.application_id}/hosts/${args.host_id}/metrics`;
|
|
31
|
+
const query = {};
|
|
32
|
+
if (args.name)
|
|
33
|
+
query.name = args.name;
|
|
34
|
+
if (args.page)
|
|
35
|
+
query.page = args.page;
|
|
36
|
+
const results = [];
|
|
37
|
+
let nextUrl;
|
|
38
|
+
let page = args.page;
|
|
39
|
+
do {
|
|
40
|
+
const res = await client.get(path, page ? { ...query, page } : query);
|
|
41
|
+
results.push(res.data);
|
|
42
|
+
const next = res.links?.next;
|
|
43
|
+
if (args.auto_paginate && next) {
|
|
44
|
+
const u = new URL(next);
|
|
45
|
+
const p = u.searchParams.get('page');
|
|
46
|
+
page = p ? Number(p) : undefined;
|
|
47
|
+
nextUrl = next;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
nextUrl = undefined;
|
|
51
|
+
}
|
|
52
|
+
} while (args.auto_paginate && nextUrl);
|
|
53
|
+
return { items: args.auto_paginate ? results : results[0], page };
|
|
54
|
+
}
|
|
55
|
+
getMetricDataTool() {
|
|
56
|
+
return {
|
|
57
|
+
name: 'get_metric_data_for_host',
|
|
58
|
+
description: 'Get metric timeslices for metrics on a host (REST v2).',
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
application_id: { type: 'number' },
|
|
63
|
+
host_id: { type: 'number' },
|
|
64
|
+
names: { type: 'array', items: { type: 'string' } },
|
|
65
|
+
values: { type: 'array', items: { type: 'string' } },
|
|
66
|
+
from: { type: 'string' },
|
|
67
|
+
to: { type: 'string' },
|
|
68
|
+
period: { type: 'number' },
|
|
69
|
+
summarize: { type: 'boolean' },
|
|
70
|
+
page: { type: 'number' },
|
|
71
|
+
auto_paginate: { type: 'boolean' },
|
|
72
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
73
|
+
},
|
|
74
|
+
required: ['application_id', 'host_id', 'names'],
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async getMetricData(args) {
|
|
79
|
+
const client = this.restFor(args.region);
|
|
80
|
+
const path = `/applications/${args.application_id}/hosts/${args.host_id}/metrics/data`;
|
|
81
|
+
const query = { names: args.names, values: args.values };
|
|
82
|
+
if (args.from)
|
|
83
|
+
query.from = args.from;
|
|
84
|
+
if (args.to)
|
|
85
|
+
query.to = args.to;
|
|
86
|
+
if (args.period)
|
|
87
|
+
query.period = args.period;
|
|
88
|
+
if (args.summarize !== undefined)
|
|
89
|
+
query.summarize = args.summarize;
|
|
90
|
+
if (args.page)
|
|
91
|
+
query.page = args.page;
|
|
92
|
+
const results = [];
|
|
93
|
+
let nextUrl;
|
|
94
|
+
let page = args.page;
|
|
95
|
+
do {
|
|
96
|
+
const res = await client.get(path, page ? { ...query, page } : query);
|
|
97
|
+
results.push(res.data);
|
|
98
|
+
const next = res.links?.next;
|
|
99
|
+
if (args.auto_paginate && next) {
|
|
100
|
+
const u = new URL(next);
|
|
101
|
+
const p = u.searchParams.get('page');
|
|
102
|
+
page = p ? Number(p) : undefined;
|
|
103
|
+
nextUrl = next;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
nextUrl = undefined;
|
|
107
|
+
}
|
|
108
|
+
} while (args.auto_paginate && nextUrl);
|
|
109
|
+
return { items: args.auto_paginate ? results : results[0], page };
|
|
110
|
+
}
|
|
111
|
+
getListApplicationHostsTool() {
|
|
112
|
+
return {
|
|
113
|
+
name: 'list_application_hosts',
|
|
114
|
+
description: 'List hosts for an APM application (REST v2).',
|
|
115
|
+
inputSchema: {
|
|
116
|
+
type: 'object',
|
|
117
|
+
properties: {
|
|
118
|
+
application_id: { type: 'number' },
|
|
119
|
+
filter_hostname: { type: 'string' },
|
|
120
|
+
filter_ids: { type: 'string' },
|
|
121
|
+
page: { type: 'number' },
|
|
122
|
+
auto_paginate: { type: 'boolean' },
|
|
123
|
+
region: { type: 'string', enum: ['US', 'EU'] },
|
|
124
|
+
},
|
|
125
|
+
required: ['application_id'],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async listApplicationHosts(args) {
|
|
130
|
+
const client = this.restFor(args.region);
|
|
131
|
+
const path = `/applications/${args.application_id}/hosts`;
|
|
132
|
+
const query = {};
|
|
133
|
+
if (args.filter_hostname)
|
|
134
|
+
query['filter[hostname]'] = args.filter_hostname;
|
|
135
|
+
if (args.filter_ids)
|
|
136
|
+
query['filter[ids]'] = args.filter_ids;
|
|
137
|
+
if (args.page)
|
|
138
|
+
query.page = args.page;
|
|
139
|
+
const res = await client.get(path, query);
|
|
140
|
+
return res;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.RestMetricsTool = RestMetricsTool;
|
|
144
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/tools/rest/metrics.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "newrelic-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Model Context Protocol server for New Relic observability platform integration",
|
|
5
|
+
"module": "./src/server.ts",
|
|
5
6
|
"main": "dist/server.js",
|
|
6
7
|
"bin": {
|
|
7
8
|
"newrelic-mcp": "./dist/server.js"
|
|
8
9
|
},
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=20"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public",
|
|
15
|
+
"provenance": true
|
|
16
|
+
},
|
|
9
17
|
"files": [
|
|
10
18
|
"dist/",
|
|
11
19
|
"README.md",
|
|
@@ -28,6 +36,7 @@
|
|
|
28
36
|
"build": "tsc",
|
|
29
37
|
"dev": "tsx src/server.ts",
|
|
30
38
|
"start": "node dist/server.js",
|
|
39
|
+
"prepack": "npm run build",
|
|
31
40
|
"test": "vitest",
|
|
32
41
|
"test:watch": "vitest",
|
|
33
42
|
"test:ui": "vitest --ui",
|
|
@@ -44,6 +53,8 @@
|
|
|
44
53
|
"format:check": "npx ultracite lint",
|
|
45
54
|
"ai:test": "vitest --run",
|
|
46
55
|
"ai:test:watch": "vitest",
|
|
56
|
+
"ai:test:coverage": "vitest --coverage --run",
|
|
57
|
+
"ai:test:integration": "USE_REAL_ENV=true vitest --run",
|
|
47
58
|
"ai:lint": "biome lint --max-diagnostics=none --reporter=summary .",
|
|
48
59
|
"ai:check": "biome check --max-diagnostics=none --reporter=summary .",
|
|
49
60
|
"ai:ci": "biome ci --max-diagnostics=none --reporter=summary .",
|