@jupiterone/jupiterone-mcp 0.0.3 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +2 -2
  2. package/dist/client/graphql/mutations.js +13 -10
  3. package/dist/client/graphql/mutations.js.map +1 -1
  4. package/dist/client/graphql/queries.d.ts +1 -1
  5. package/dist/client/graphql/queries.d.ts.map +1 -1
  6. package/dist/client/graphql/queries.js +22 -19
  7. package/dist/client/graphql/queries.js.map +1 -1
  8. package/dist/client/jupiterone-client.d.ts +3 -1
  9. package/dist/client/jupiterone-client.d.ts.map +1 -1
  10. package/dist/client/jupiterone-client.js +33 -20
  11. package/dist/client/jupiterone-client.js.map +1 -1
  12. package/dist/client/services/account-service.js +8 -4
  13. package/dist/client/services/account-service.js.map +1 -1
  14. package/dist/client/services/alert-service.js +7 -3
  15. package/dist/client/services/alert-service.js.map +1 -1
  16. package/dist/client/services/dashboard-service.js +12 -8
  17. package/dist/client/services/dashboard-service.js.map +1 -1
  18. package/dist/client/services/integration-service.js +11 -7
  19. package/dist/client/services/integration-service.js.map +1 -1
  20. package/dist/client/services/j1ql-service.d.ts.map +1 -1
  21. package/dist/client/services/j1ql-service.js +42 -7
  22. package/dist/client/services/j1ql-service.js.map +1 -1
  23. package/dist/client/services/rule-service.js +17 -13
  24. package/dist/client/services/rule-service.js.map +1 -1
  25. package/dist/generated/description-map.d.ts +2 -0
  26. package/dist/generated/description-map.d.ts.map +1 -0
  27. package/dist/generated/description-map.js +2107 -0
  28. package/dist/generated/description-map.js.map +1 -0
  29. package/dist/index.js +11 -12
  30. package/dist/index.js.map +1 -1
  31. package/dist/server/mcp-server.d.ts +9 -1
  32. package/dist/server/mcp-server.d.ts.map +1 -1
  33. package/dist/server/mcp-server.js +1557 -1360
  34. package/dist/server/mcp-server.js.map +1 -1
  35. package/dist/types/jupiterone.d.ts +3 -2
  36. package/dist/types/jupiterone.d.ts.map +1 -1
  37. package/dist/types/jupiterone.js +2 -1
  38. package/dist/utils/description-loader.js +8 -5
  39. package/dist/utils/description-loader.js.map +1 -1
  40. package/dist/utils/j1ql-validator.d.ts +34 -0
  41. package/dist/utils/j1ql-validator.d.ts.map +1 -0
  42. package/dist/utils/j1ql-validator.js +292 -0
  43. package/dist/utils/j1ql-validator.js.map +1 -0
  44. package/dist/utils/load-description.d.ts.map +1 -1
  45. package/dist/utils/load-description.js +7 -7
  46. package/dist/utils/load-description.js.map +1 -1
  47. package/package.json +5 -5
  48. package/dist/descriptions/create-dashboard-widget.md +0 -325
  49. package/dist/descriptions/create-dashboard.md +0 -12
  50. package/dist/descriptions/create-inline-question-rule.md +0 -374
  51. package/dist/descriptions/create-j1ql-from-natural-language.md +0 -7
  52. package/dist/descriptions/execute-j1ql-query.md +0 -426
  53. package/dist/descriptions/get-integration-definitions.md +0 -27
  54. package/dist/descriptions/get-integration-instances.md +0 -35
  55. package/dist/descriptions/list-alerts.md +0 -14
  56. package/dist/descriptions/list-rules.md +0 -53
  57. package/dist/descriptions/update-dashboard.md +0 -467
  58. package/dist/descriptions/update-inline-question-rule.md +0 -363
@@ -1,12 +0,0 @@
1
- # Create Dashboard Tool
2
-
3
- Creates a new dashboard in JupiterOne. This tool is simple and self-descriptive: provide a name and a type to create a dashboard. Unless specified otherwise, default to creating personal dashboards.
4
- After creating a dashboard and all its widgets, you will typically want to call `update-dashboard` tool to set a layout favorable for the user, widgets should never be left at their default size.
5
-
6
- ## Valid Dashboard Types
7
- ```typescript
8
- export enum DashboardType {
9
- USER = 'User',
10
- ACCOUNT = 'Account',
11
- }
12
- ```
@@ -1,374 +0,0 @@
1
- # JupiterOne Rule Creation Tool - Complete Guide
2
-
3
- **Purpose**: Creates inline question-based alert rules in JupiterOne to monitor entities and trigger alerts based on specified conditions.
4
-
5
- The first step in creating a rule is to identify the query you want to use in order to get the data you want to take action with. Use the `execute-j1ql-query` tool to find the correct query.
6
-
7
- ## Key Requirements for Success
8
-
9
- ### 1. Condition Format (Critical)
10
- The `condition` parameter must use JupiterOne's specific array format:
11
- - **Structure**: `["LOGICAL_OPERATOR", [left_value, operator, right_value]]`
12
- - **Example**: `["AND", ["queries.queryName.total", ">", 0]]`
13
- - **Supported operators**: `>`, `<`, `>=`, `<=`, `=`, `!=`
14
- - **Logical operators**: `"AND"`, `"OR"`
15
-
16
- ### 2. Operations Structure
17
- The `when` clause should only contain:
18
- - `type`: Always `"FILTER"`
19
- - `condition`: The array format described above
20
- - **Do NOT include**: `version`, `specVersion` (these belong at the rule level, not in the when clause)
21
-
22
- ### 3. Query Naming Convention
23
- - Query names in the `queries` array must match the references in conditions
24
- - Example: If query name is `"users"`, reference it as `"queries.users.total"`
25
- - **IMPORTANT**: Use `"query0"` as the standard query name for compatibility with existing patterns
26
-
27
- ### 4. New Entity Detection
28
- - Use `triggerActionsOnNewEntitiesOnly: true` to only alert on genuinely new entities
29
- - This prevents re-alerting on existing entities every polling cycle
30
- - Essential for "new user" or "new resource" type alerts
31
-
32
- ### 5. Polling Intervals
33
- - **Default**: Use `"ONE_DAY"` unless the user specifically requests a different interval
34
- - **Available options**: `"DISABLED"`, `"THIRTY_MINUTES"`, `"ONE_HOUR"`, `"FOUR_HOURS"`, `"EIGHT_HOURS"`, `"TWELVE_HOURS"`, `"ONE_DAY"`, `"ONE_WEEK"`
35
- - Only use more frequent intervals (like `"THIRTY_MINUTES"`) when explicitly requested or for time-sensitive security alerts
36
-
37
- ### 6. Tags vs Labels (Important)
38
- - **DEPRECATED**: The `tags` array field is deprecated and should always be set to an empty array `[]`
39
- - **USE INSTEAD**: For tagging functionality, use the `labels` field with key-value pairs
40
- - **Format**: `labels: [{"labelName": "key", "labelValue": "value"}]`
41
- - **When users ask for tagging**: Always use the `labels` field to meet their needs
42
- - **Note**: The `tags` field is still required in the schema for compatibility but should remain empty
43
-
44
- ## Required Schema Fields
45
-
46
- ### Complete Required Parameters for create-inline-question-rule
47
- **CRITICAL**: All of these fields must be included for successful rule creation:
48
-
49
- ```json
50
- {
51
- "name": "Rule Name",
52
- "description": "Rule description",
53
- "notifyOnFailure": true,
54
- "triggerActionsOnNewEntitiesOnly": true,
55
- "ignorePreviousResults": false,
56
- "pollingInterval": "ONE_DAY",
57
- "specVersion": 1,
58
- "templates": {},
59
- "outputs": ["alertLevel"],
60
- "tags": [],
61
- "labels": [
62
- {"labelName": "environment", "labelValue": "production"},
63
- {"labelName": "team", "labelValue": "security"}
64
- ],
65
- "queries": [
66
- {
67
- "query": "FIND Entity...",
68
- "name": "query0",
69
- "version": "v1",
70
- "includeDeleted": false
71
- }
72
- ],
73
- "operations": [
74
- {
75
- "when": {
76
- "type": "FILTER",
77
- "condition": ["AND", ["queries.query0.total", ">", 0]]
78
- },
79
- "actions": [...]
80
- }
81
- ]
82
- }
83
- ```
84
-
85
- **Key Schema Requirements**:
86
- - `ignorePreviousResults`: Must be included (typically `false`)
87
- - `templates`: Must be included (use `{}` if empty)
88
- - `tags`: Must be included but should always be empty `[]` (deprecated field)
89
- - `labels`: Use this for actual tagging functionality with key-value pairs
90
- - Query `name`: Use `"query0"` for primary query
91
- - Query `version`: Include `"v1"` for compatibility
92
- - Query `includeDeleted`: Must be explicitly set to `false`
93
-
94
- ## Available Action Types
95
-
96
- ### 1. SET_PROPERTY
97
- Sets a property value on the alert (commonly used for alert severity levels).
98
-
99
- **Configuration**:
100
- ```json
101
- {
102
- "type": "SET_PROPERTY",
103
- "targetProperty": "alertLevel",
104
- "targetValue": "CRITICAL"
105
- }
106
- ```
107
-
108
- **Common Values for alertLevel**: `"LOW"`, `"MEDIUM"`, `"HIGH"`, `"CRITICAL"`, `"INFO"`
109
-
110
- ### 2. CREATE_ALERT
111
- Creates a basic alert in JupiterOne.
112
-
113
- **Configuration**:
114
- ```json
115
- {
116
- "type": "CREATE_ALERT"
117
- }
118
- ```
119
-
120
- **Note**: This is the most basic action and should almost always be included.
121
-
122
- ### 3. SEND_EMAIL
123
- Sends email notifications to specified recipients.
124
-
125
- **Configuration**:
126
- ```json
127
- {
128
- "type": "SEND_EMAIL",
129
- "recipients": ["user1@company.com", "user2@company.com"],
130
- "body": "Affected Items: <br><br>* {{queries.query0.data|mapProperty('displayName')|join('<br>* ')}}"
131
- }
132
- ```
133
-
134
- **Required Information to Ask User**:
135
- - Email addresses of recipients
136
- - Custom email body content (if desired)
137
-
138
- **Template Variables Available**:
139
- - `{{alertWebLink}}` - Link to the alert in JupiterOne
140
- - `{{queries.queryName.data|mapProperty('fieldName')|join('separator')}}` - Format query results
141
-
142
- ### 4. TAG_ENTITIES
143
- Adds or removes tags from entities that triggered the rule.
144
-
145
- **Configuration**:
146
- ```json
147
- {
148
- "type": "TAG_ENTITIES",
149
- "entities": "{{queries.query0.data}}",
150
- "tags": [
151
- {"name": "existing tag to remove", "value": null},
152
- {"name": "new tag", "value": "tag value"}
153
- ]
154
- }
155
- ```
156
-
157
- **Required Information to Ask User**:
158
- - Tag names and values to add
159
- - Tag names to remove (set value to `null`)
160
-
161
- ### 5. SEND_SLACK_MESSAGE
162
- Sends messages to Slack channels (requires Slack integration).
163
-
164
- **Configuration**:
165
- ```json
166
- {
167
- "integrationInstanceId": "d97d9127-c532-410a-bf0a-9ea93f66c3d2",
168
- "type": "SEND_SLACK_MESSAGE",
169
- "channels": ["#security-alerts", "#general"],
170
- "body": "*Affected Items:* \n\n- {{queries.query0.data|mapProperty('displayName')|join('\n- ')}}"
171
- }
172
- ```
173
-
174
- **Required Information to Ask User**:
175
- - Slack channel names (with # prefix)
176
- - Slack integration instance ID (may need to query available integrations)
177
- - Custom message content (if desired)
178
-
179
- ### 6. SEND_TO_S3
180
- Sends alert data to an S3 bucket (requires AWS S3 integration).
181
-
182
- **Configuration**:
183
- ```json
184
- {
185
- "integrationInstanceId": "f89568b4-2a1b-4bd8-8abd-aee21270df75",
186
- "type": "SEND_TO_S3",
187
- "bucket": "security-alerts-bucket",
188
- "region": "us-east-1",
189
- "data": {
190
- "description": "{{alertWebLink}}\n\n**Affected Items:**\n\n* {{queries.query0.data|mapProperty('displayName')|join('\n* ')}}"
191
- }
192
- }
193
- ```
194
-
195
- **Required Information to Ask User**:
196
- - S3 bucket name
197
- - AWS region
198
- - S3 integration instance ID
199
- - Data structure to send
200
-
201
- ### 7. CREATE_JIRA_TICKET
202
- Creates a Jira ticket for the alert (requires Jira integration).
203
-
204
- **Configuration**:
205
- ```json
206
- {
207
- "integrationInstanceId": "53a99eaa-18a5-45ef-b748-2de39d642a91",
208
- "type": "CREATE_JIRA_TICKET",
209
- "entityClass": "Finding",
210
- "summary": "Security Alert: Critical Unencrypted Data Found",
211
- "issueType": "Bug",
212
- "project": "SEC",
213
- "updateContentOnChanges": false,
214
- "additionalFields": {
215
- "description": {
216
- "type": "doc",
217
- "version": 1,
218
- "content": [
219
- {
220
- "type": "paragraph",
221
- "content": [
222
- {
223
- "type": "text",
224
- "text": "{{alertWebLink}}\n\n**Affected Items:**\n\n* {{queries.query0.data|mapProperty('displayName')|join('\n* ')}}"
225
- }
226
- ]
227
- }
228
- ]
229
- }
230
- }
231
- }
232
- ```
233
-
234
- **Required Information to Ask User**:
235
- - Jira project key
236
- - Issue type (Bug, Task, Story, etc.)
237
- - Ticket summary/title
238
- - Jira integration instance ID
239
- - Additional fields as needed
240
-
241
- **Common Entity Classes**: `"Finding"`, `"Incident"`, `"Issue"`
242
-
243
- ## Template Variables and Formatting
244
-
245
- ### Available Variables
246
- - `{{alertWebLink}}` - Direct link to the alert in JupiterOne
247
- - `{{queries.queryName.data}}` - Array of entities from the specified query
248
- - `{{queries.queryName.total}}` - Count of entities from the query
249
-
250
- ### Data Formatting
251
- - `|mapProperty('fieldName')` - Extract specific field from each entity
252
- - `|join('separator')` - Join array elements with specified separator
253
- - Example: `{{queries.users.data|mapProperty('displayName')|join(', ')}}` - Creates comma-separated list of user names
254
-
255
- ### Common Formatting Patterns
256
- - **HTML list**: `{{queries.query0.data|mapProperty('displayName')|join('<br>* ')}}`
257
- - **Markdown list**: `{{queries.query0.data|mapProperty('displayName')|join('\n- ')}}`
258
- - **Simple list**: `{{queries.query0.data|mapProperty('displayName')|join('\n* ')}}`
259
-
260
- ## Integration Dependencies
261
-
262
- For actions requiring integrations, you may need to:
263
- 1. Query available integration instances using `get-integration-instances`
264
- 2. Ask the user which integration to use
265
- 3. Use the integration's `id` as the `integrationInstanceId`
266
-
267
- **Actions requiring integrations**:
268
- - `SEND_SLACK_MESSAGE` (Slack integration)
269
- - `SEND_TO_S3` (AWS S3 integration)
270
- - `CREATE_JIRA_TICKET` (Jira integration)
271
-
272
- ## Working Example Template
273
-
274
- ### Complete Working Rule Structure
275
- Based on confirmed working examples, use this template:
276
-
277
- ```json
278
- {
279
- "name": "Your Rule Name",
280
- "description": "Your rule description",
281
- "notifyOnFailure": true,
282
- "triggerActionsOnNewEntitiesOnly": true,
283
- "ignorePreviousResults": false,
284
- "pollingInterval": "ONE_DAY",
285
- "specVersion": 1,
286
- "templates": {},
287
- "outputs": ["alertLevel"],
288
- "tags": [],
289
- "labels": [
290
- {"labelName": "severity", "labelValue": "high"},
291
- {"labelName": "category", "labelValue": "security"}
292
- ],
293
- "queries": [
294
- {
295
- "query": "FIND Entity WITH condition",
296
- "name": "query0",
297
- "version": "v1",
298
- "includeDeleted": false
299
- }
300
- ],
301
- "operations": [
302
- {
303
- "when": {
304
- "type": "FILTER",
305
- "condition": ["AND", ["queries.query0.total", ">", 0]]
306
- },
307
- "actions": [
308
- {
309
- "type": "SET_PROPERTY",
310
- "targetProperty": "alertLevel",
311
- "targetValue": "CRITICAL"
312
- },
313
- {
314
- "type": "CREATE_ALERT"
315
- },
316
- {
317
- "type": "SEND_EMAIL",
318
- "recipients": ["user@company.com"],
319
- "body": "Affected Items: <br><br>* {{queries.query0.data|mapProperty('displayName')|join('<br>* ')}}"
320
- }
321
- ]
322
- }
323
- ]
324
- }
325
- ```
326
-
327
- ## Common Patterns
328
-
329
- ### New Entity Monitoring
330
- ```json
331
- {
332
- "condition": ["AND", ["queries.query0.total", ">", 0]],
333
- "triggerActionsOnNewEntitiesOnly": true
334
- }
335
- ```
336
-
337
- ### Threshold-based Alerts
338
- ```json
339
- {
340
- "condition": ["AND", ["queries.query0.total", ">=", 5]]
341
- }
342
- ```
343
-
344
- ### Multi-action Rule Example
345
- ```json
346
- "actions": [
347
- {"type": "SET_PROPERTY", "targetProperty": "alertLevel", "targetValue": "HIGH"},
348
- {"type": "CREATE_ALERT"},
349
- {"type": "SEND_EMAIL", "recipients": ["security@company.com"], "body": "Security issue detected: {{alertWebLink}}"},
350
- {"type": "TAG_ENTITIES", "entities": "{{queries.query0.data}}", "tags": [{"name": "needs-review", "value": "true"}]}
351
- ]
352
- ```
353
-
354
- ## Debugging Tips
355
- - If you get "Invalid conjunction operator" errors, check the condition array format
356
- - If you get "additional properties" errors, remove extra fields from the `when` clause
357
- - If you get missing property errors, ensure all required schema fields are included
358
- - **Always include**: `ignorePreviousResults`, `templates`, `tags`, query `version` and `includeDeleted`
359
- - Always reference existing rules with `get-rule-details` to see working examples
360
- - Test with simple conditions first, then add complexity
361
- - Use `"query0"` as the standard query name for compatibility
362
-
363
- ## Best Practices
364
- - Use descriptive query names that match their purpose (but prefer `"query0"` for main query)
365
- - Include relevant entity fields in `outputs` for alert context
366
- - Set appropriate polling intervals (default to `"ONE_DAY"` unless specified)
367
- - Use the `labels` field for rule organization and tagging (not the deprecated `tags` field)
368
- - Use `notifyOnFailure: true` to catch rule execution issues
369
- - Always include `CREATE_ALERT` action as a baseline
370
- - Always include all required schema fields from the working template
371
- - Ask users for specific details when configuring notification actions (emails, channels, etc.)
372
- - When users request tagging functionality, use the `labels` field with key-value pairs
373
-
374
- This format ensures reliable rule creation and helps avoid common pitfalls encountered during rule development.
@@ -1,7 +0,0 @@
1
- # JupiterOne Natural Language to J1QL Converter
2
-
3
- **Purpose**: Converts natural language queries into JupiterOne Query Language (J1QL) syntax using AI-powered translation.
4
- Unless the user gives a specific query to run, this should always be used for determing a query to use for any (but not exclusively) of the following:
5
- - Queries for rules
6
- - Queries for widgets
7
- - Queries to answer a user's question regarding their data in jupiterone