@zackbart/connecta 0.34.0 → 0.34.1

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 (78) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +3 -2
  3. package/bin/version.mjs +1 -1
  4. package/dist/catalog-drift.d.ts +30 -26
  5. package/dist/catalog-drift.js +169 -84
  6. package/dist/catalog-service.js +1 -1
  7. package/dist/connectors/api-connector.d.ts +3 -0
  8. package/dist/connectors/api-connector.js +5 -1
  9. package/dist/connectors/option-shapes.js +1 -1
  10. package/dist/connectors/remote-mcp.d.ts +2 -0
  11. package/dist/connectors/remote-mcp.js +5 -1
  12. package/dist/describe-config.d.ts +2 -0
  13. package/dist/describe-config.js +1 -0
  14. package/dist/invocation.js +3 -2
  15. package/dist/meta-tools.js +3 -2
  16. package/dist/operator-ui/config-summary.js +3 -0
  17. package/dist/operator-ui/connection-map.js +2 -1
  18. package/dist/operator-ui/endpoints.js +1 -1
  19. package/dist/operator-ui/generated.js +3 -3
  20. package/dist/operator-ui/health.js +52 -0
  21. package/dist/operator-ui/overview.js +6 -17
  22. package/dist/operator-ui/view.d.ts +3 -4
  23. package/dist/operator-ui/view.js +29 -11
  24. package/dist/provider.d.ts +6 -1
  25. package/dist/provider.js +18 -1
  26. package/dist/providers/_shared/google/workspace.d.ts +3 -0
  27. package/dist/providers/_shared/google/workspace.js +1 -1
  28. package/dist/providers/basecamp/index.d.ts +2 -0
  29. package/dist/providers/breeze/index.d.ts +2 -0
  30. package/dist/providers/ccb/index.d.ts +2 -0
  31. package/dist/providers/ccb/index.js +1 -1
  32. package/dist/providers/cloudflare/index.d.ts +2 -0
  33. package/dist/providers/cloudflare/index.js +5 -1
  34. package/dist/providers/cloudflare/openapi.generated.js +3296 -3206
  35. package/dist/providers/cloudflare/rest.js +19 -0
  36. package/dist/providers/cloudflare/skill.generated.js +2 -2
  37. package/dist/providers/cloudflare/value-safety.js +51 -18
  38. package/dist/providers/intercom/index.d.ts +24 -0
  39. package/dist/providers/intercom/index.js +121 -0
  40. package/dist/providers/intercom/skill.generated.js +8 -0
  41. package/dist/providers/linear/index.js +204 -19
  42. package/dist/providers/linear/skill.generated.js +2 -2
  43. package/dist/providers/mixpanel/index.d.ts +2 -0
  44. package/dist/providers/mixpanel/index.js +21 -17
  45. package/dist/providers/mixpanel/skill.generated.js +1 -1
  46. package/dist/providers/notion/index.d.ts +2 -0
  47. package/dist/providers/notion/index.js +1 -1
  48. package/dist/providers/overflow/index.d.ts +2 -0
  49. package/dist/providers/planning-center/index.d.ts +2 -0
  50. package/dist/providers/revenuecat/index.d.ts +5 -3
  51. package/dist/providers/revenuecat/index.js +147 -7
  52. package/dist/providers/revenuecat/skill.generated.js +3 -3
  53. package/dist/providers/stripe/index.d.ts +2 -0
  54. package/dist/providers/stripe/index.js +50 -30
  55. package/dist/providers/stripe/skill.generated.js +2 -1
  56. package/dist/providers/tithely/index.d.ts +2 -0
  57. package/dist/providers/vercel/index.d.ts +2 -0
  58. package/dist/providers/vercel/index.js +1 -1
  59. package/dist/providers/vercel/openapi.generated.js +391 -374
  60. package/dist/providers/vercel/skill.generated.js +1 -1
  61. package/dist/providers/vercel/value-safety.js +14 -4
  62. package/dist/registry.d.ts +10 -14
  63. package/dist/registry.js +62 -62
  64. package/dist/routes/ui-data.js +8 -2
  65. package/dist/skills.js +8 -2
  66. package/dist/types.d.ts +18 -4
  67. package/dist/version.d.ts +1 -1
  68. package/dist/version.js +1 -1
  69. package/documentation/architecture.md +48 -5
  70. package/documentation/code-mode.md +7 -5
  71. package/documentation/integrating.md +55 -1
  72. package/documentation/meta-tools.md +2 -2
  73. package/documentation/operating.md +1 -1
  74. package/documentation/operator-tests.md +8 -2
  75. package/documentation/operator-ui.md +58 -11
  76. package/documentation/provider-auth-migration.md +22 -0
  77. package/package.json +5 -1
  78. package/templates/node/package.json +1 -1
@@ -26,246 +26,431 @@ const UPSERT = "An upsert: supplying a record id overwrites that record in place
26
26
  * caller gets and the verdict a check reads can never disagree. It is a
27
27
  * superset: Linear's hosted `tools/list` varies by plan and enabled features,
28
28
  * so a name this workspace never returns costs nothing, while an unlisted new
29
- * one fails closed. The genuine creates — the `create_*_label` and attachment
30
- * tools — are plain writes rather than destructive.
29
+ * one without an explicit read annotation fails closed. The genuine creates —
30
+ * the `create_*_label` and attachment tools — are plain writes rather than
31
+ * destructive.
31
32
  */
32
33
  const LINEAR_CLASSIFICATION = {
33
34
  tools: {
34
35
  // Issues
35
36
  list_issues: {
37
+ schemaDigest: "sha256:294b644db541de9f1f4cec011164fe7cec29153aa12d5d94d0748fe35fe973d4",
36
38
  "verdict": "read",
37
39
  "reason": "Reads existing Linear list issues data without changing workspace state.",
38
40
  },
39
41
  get_issue: {
42
+ schemaDigest: "sha256:33b204248ae63119751ed4cbade909b05cfbd9aa241cd39e4cec5690d062688e",
40
43
  "verdict": "read",
41
44
  "reason": "Reads existing Linear get issue data without changing workspace state.",
42
45
  },
43
46
  list_issue_statuses: {
47
+ schemaDigest: "sha256:8a740e800811796eab16dee1c22db5d8e3c971bebf3ccec7d7d2ee36157f4316",
44
48
  "verdict": "read",
45
49
  "reason": "Reads existing Linear list issue statuses data without changing workspace state.",
46
50
  },
47
51
  get_issue_status: {
52
+ schemaDigest: "sha256:ea4e287dc5fc9b930b790430ca02f221a75444d789a252d87aff838767ce4f05",
48
53
  "verdict": "read",
49
54
  "reason": "Reads existing Linear get issue status data without changing workspace state.",
50
55
  },
51
56
  list_issue_labels: {
57
+ schemaDigest: "sha256:5eb361d26464fcaef257499c150bf9cb9349308d03ef31c119e826752cbc998e",
52
58
  "verdict": "read",
53
59
  "reason": "Reads existing Linear list issue labels data without changing workspace state.",
54
60
  },
55
- save_issue: { verdict: "destructive", reason: UPSERT },
61
+ save_issue: {
62
+ schemaDigest: "sha256:23a22fd38cd3234f3a112c460daf04779034e54e45ed00ca27232574f3d60547",
63
+ verdict: "destructive",
64
+ reason: UPSERT,
65
+ },
66
+ save_issue_label: {
67
+ schemaDigest: "sha256:a39c5e1194b33f1a07139c6c2219a991a818f7027b26aef059959bc67248d528",
68
+ verdict: "destructive",
69
+ reason: UPSERT,
70
+ },
71
+ retire_issue_label: {
72
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
73
+ verdict: "destructive",
74
+ reason: "Retires an existing issue label or group, including child labels, so it cannot be applied to new records.",
75
+ },
76
+ restore_issue_label: {
77
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
78
+ verdict: "destructive",
79
+ reason: "Restores an existing issue label or group and every child label, including children retired separately.",
80
+ },
56
81
  create_issue_label: {
82
+ schemaDigest: "sha256:92a9bbefc33410795f6c23ae609b1cb61d6168b36b5b60f4563090e468c7f53c",
57
83
  "verdict": "write",
58
84
  "reason": "Creates Linear state through create_issue_label; the reviewed operation only appends.",
59
85
  },
60
86
  // Projects
61
87
  list_projects: {
88
+ schemaDigest: "sha256:3cadc9d39d1372e89bf671ae44b88aee4d7bc0d23af24979e2401facedd0253f",
62
89
  "verdict": "read",
63
90
  "reason": "Reads existing Linear list projects data without changing workspace state.",
64
91
  },
65
92
  get_project: {
93
+ schemaDigest: "sha256:e752476aabfdf9d25b03a57f682f6fcb187b10d823a3c6371abe49f7dda8a6e0",
66
94
  "verdict": "read",
67
95
  "reason": "Reads existing Linear get project data without changing workspace state.",
68
96
  },
69
97
  list_project_labels: {
98
+ schemaDigest: "sha256:5eb361d26464fcaef257499c150bf9cb9349308d03ef31c119e826752cbc998e",
70
99
  "verdict": "read",
71
100
  "reason": "Reads existing Linear list project labels data without changing workspace state.",
72
101
  },
73
- save_project: { verdict: "destructive", reason: UPSERT },
102
+ save_project: {
103
+ schemaDigest: "sha256:2531c09aba662f0793dad42fa43d32708fe68047479cf2c00b32f368e1014413",
104
+ verdict: "destructive",
105
+ reason: UPSERT,
106
+ },
107
+ save_project_label: {
108
+ schemaDigest: "sha256:703b141f537e40c693fd6cf5e6fc8ba97359830f943e022f4b32414562e72719",
109
+ verdict: "destructive",
110
+ reason: UPSERT,
111
+ },
112
+ retire_project_label: {
113
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
114
+ verdict: "destructive",
115
+ reason: "Retires an existing project label or group, including child labels, so it cannot be applied to new records.",
116
+ },
117
+ restore_project_label: {
118
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
119
+ verdict: "destructive",
120
+ reason: "Restores an existing project label or group and every child label, including children retired separately.",
121
+ },
74
122
  // Milestones
75
123
  list_milestones: {
124
+ schemaDigest: "sha256:97e2d99f903538f1a99d7aef71bb8215dc99279e4395310c14a1c5c67852444a",
76
125
  "verdict": "read",
77
126
  "reason": "Reads existing Linear list milestones data without changing workspace state.",
78
127
  },
79
128
  get_milestone: {
129
+ schemaDigest: "sha256:5631cd5fdcd020ad3b57ee65dc92ec32a8be0df06136a7bcb1a83e5fb333df71",
80
130
  "verdict": "read",
81
131
  "reason": "Reads existing Linear get milestone data without changing workspace state.",
82
132
  },
83
- save_milestone: { verdict: "destructive", reason: UPSERT },
133
+ save_milestone: {
134
+ schemaDigest: "sha256:d55f3018b2e8693c950e71751a6769f056f85cc51f351c1df26674f45eda4974",
135
+ verdict: "destructive",
136
+ reason: UPSERT,
137
+ },
84
138
  // Initiatives
85
139
  list_initiatives: {
140
+ schemaDigest: "sha256:7d4bf3b546207ae0e41e215dc1f115ae05c61125b3299335a290e42498a63704",
86
141
  "verdict": "read",
87
142
  "reason": "Reads existing Linear list initiatives data without changing workspace state.",
88
143
  },
89
144
  get_initiative: {
145
+ schemaDigest: "sha256:dda5376b85019b51df65b94ed0baed0bf2715d59567ff6169bbcf67c6794ba81",
90
146
  "verdict": "read",
91
147
  "reason": "Reads existing Linear get initiative data without changing workspace state.",
92
148
  },
93
149
  list_initiative_labels: {
150
+ schemaDigest: "sha256:8c844c2f031db6e3c2665dac47e3ea8b006330b4bcc6df4b6479055e57ee057d",
94
151
  "verdict": "read",
95
152
  "reason": "Reads existing Linear list initiative labels data without changing workspace state.",
96
153
  },
97
- save_initiative: { verdict: "destructive", reason: UPSERT },
154
+ save_initiative: {
155
+ schemaDigest: "sha256:65a4b02ead7630b12db3d9811192fb2595b8a34c79e1146a19318d640bf8b104",
156
+ verdict: "destructive",
157
+ reason: UPSERT,
158
+ },
159
+ save_initiative_label: {
160
+ schemaDigest: "sha256:23a42a87a9420428381a719b5a64d4514c5edd97bddb885517ade6306d36bbe0",
161
+ verdict: "destructive",
162
+ reason: UPSERT,
163
+ },
164
+ retire_initiative_label: {
165
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
166
+ verdict: "destructive",
167
+ reason: "Retires an existing initiative label or group, including child labels, so it cannot be applied to new records.",
168
+ },
169
+ restore_initiative_label: {
170
+ schemaDigest: "sha256:d9f254b2c134123d14a9b91ed0df063d45aa99d85f2ccdaf90ac57aa3c50a3de",
171
+ verdict: "destructive",
172
+ reason: "Restores an existing initiative label or group and every child label, including children retired separately.",
173
+ },
98
174
  create_initiative_label: {
175
+ schemaDigest: "sha256:442e098c4e81e46071f13f9359dd296acd1cb03eee0c71d68fc7a329cc503277",
99
176
  "verdict": "write",
100
177
  "reason": "Creates Linear state through create_initiative_label; the reviewed operation only appends.",
101
178
  },
179
+ // Saved views
180
+ list_custom_views: {
181
+ schemaDigest: "sha256:ec3cbc000f325d82c0b4949acf6995cf4c11d4b4084c84037ee5aa5801eea92d",
182
+ verdict: "read",
183
+ reason: "Lists accessible saved view metadata without changing views or their matching records.",
184
+ },
102
185
  // Cycles
103
186
  list_cycles: {
187
+ schemaDigest: "sha256:39d0ade50e1bbe3e68f366b12b9ce001d4ab39dda416e061cc670c402963237f",
104
188
  "verdict": "read",
105
189
  "reason": "Reads existing Linear list cycles data without changing workspace state.",
106
190
  },
107
191
  // Comments
108
192
  list_comments: {
193
+ schemaDigest: "sha256:cd004335be5c0e9dfcd7997be16527cbaaf1eafddfa1ff0c367d904fb4c7372b",
109
194
  "verdict": "read",
110
195
  "reason": "Reads existing Linear list comments data without changing workspace state.",
111
196
  },
112
- save_comment: { verdict: "destructive", reason: UPSERT },
197
+ save_comment: {
198
+ schemaDigest: "sha256:795f5d486218ccfe5d2d3480d8624feecb0af92cbff80804c3030a994aa343aa",
199
+ verdict: "destructive",
200
+ reason: UPSERT,
201
+ },
113
202
  delete_comment: {
203
+ schemaDigest: "sha256:2c78afdc6b2a0e16421b88ad51e84fcc86f64ae7b551eae01a2f3c8437ebbb2b",
114
204
  "verdict": "destructive",
115
205
  "reason": "Changes or removes existing Linear state through delete_comment.",
116
206
  },
117
207
  // Documents
118
208
  list_documents: {
209
+ schemaDigest: "sha256:0c34f1ad0045ed166a200790b80cc274357f8dd916bade75267ce17ad3a0cd70",
119
210
  "verdict": "read",
120
211
  "reason": "Reads existing Linear list documents data without changing workspace state.",
121
212
  },
122
213
  get_document: {
214
+ schemaDigest: "sha256:3cb4635f04b8a5b10b6973a579123b0ff38b9942a4e5c019140c94c67bd23c29",
123
215
  "verdict": "read",
124
216
  "reason": "Reads existing Linear get document data without changing workspace state.",
125
217
  },
126
- save_document: { verdict: "destructive", reason: UPSERT },
218
+ save_document: {
219
+ schemaDigest: "sha256:a1022c0e1a427aca42a5032acc1fe798eb41a6b503a9b8f2b0b1842bcc42b77a",
220
+ verdict: "destructive",
221
+ reason: UPSERT,
222
+ },
223
+ // Inbox
224
+ get_notifications: {
225
+ schemaDigest: "sha256:eae99e7b6395842bd0aa3008dc4b8b75c12be444bca1111f68352127db852750",
226
+ verdict: "read",
227
+ reason: "Lists the authenticated user's inbox notifications without marking or snoozing them.",
228
+ },
229
+ mark_notification: {
230
+ schemaDigest: "sha256:96190ee9b29c980c1df2bf741ec1eebc49eed9a87f6db74d89bfa87b800b7fac",
231
+ verdict: "write",
232
+ reason: "Changes read/unread or snooze state in the authenticated user's inbox; the reviewed operation removes no workspace record.",
233
+ },
127
234
  // Teams and users
128
235
  list_teams: {
236
+ schemaDigest: "sha256:35496fcc47293f7976a418f5babd99f063465c9b614606b1feb0ab13879a4048",
129
237
  "verdict": "read",
130
238
  "reason": "Reads existing Linear list teams data without changing workspace state.",
131
239
  },
132
- get_team: { "verdict": "read", "reason": "Reads existing Linear get team data without changing workspace state." },
240
+ get_team: {
241
+ schemaDigest: "sha256:4e62e3954a183e2256921cd40450335d3fcd6b4ba52354854a4257efabebf256",
242
+ "verdict": "read",
243
+ "reason": "Reads existing Linear get team data without changing workspace state.",
244
+ },
133
245
  list_users: {
246
+ schemaDigest: "sha256:2ce638c3be81ff50ac7a4f2c929cce39a62a011aad006ba9a26569a45ad095e5",
134
247
  "verdict": "read",
135
248
  "reason": "Reads existing Linear list users data without changing workspace state.",
136
249
  },
137
- get_user: { "verdict": "read", "reason": "Reads existing Linear get user data without changing workspace state." },
250
+ get_user: {
251
+ schemaDigest: "sha256:5046c1d7d44be9142585a2fbd71785fb6f5832b99d723763251913e1a4ccc6f9",
252
+ "verdict": "read",
253
+ "reason": "Reads existing Linear get user data without changing workspace state.",
254
+ },
138
255
  get_workspace: {
256
+ schemaDigest: "sha256:caa1215d2278f303733e5fcb008a09853e2bc0e4d5545416a1f40eb4e3ba29fe",
139
257
  "verdict": "read",
140
258
  "reason": "Reads existing Linear get workspace data without changing workspace state.",
141
259
  },
260
+ get_triage_responsibility: {
261
+ schemaDigest: "sha256:8ee4f3c9799a763001089d1a56691020fac5bf9866b80bdbc21495702051737b",
262
+ verdict: "read",
263
+ reason: "Reads a team's current triage responsibility and upcoming rotation shifts without changing assignments.",
264
+ },
142
265
  // Templates
143
266
  list_templates: {
267
+ schemaDigest: "sha256:387aea405fd7d1ebd9b44228865f55dcc03cdbf1ff82dfe6a6766994177b3531",
144
268
  "verdict": "read",
145
269
  "reason": "Reads existing Linear list templates data without changing workspace state.",
146
270
  },
147
271
  get_template: {
272
+ schemaDigest: "sha256:b5feb94b620c9466a87c0feb232e19223e73abb1965579208c1aa47e6ef2b082",
148
273
  "verdict": "read",
149
274
  "reason": "Reads existing Linear get template data without changing workspace state.",
150
275
  },
151
276
  // Status updates
152
277
  get_status_updates: {
278
+ schemaDigest: "sha256:af40904370cffcca265f1a05bff133d561c7009f6960a84096025cf8163663f3",
153
279
  "verdict": "read",
154
280
  "reason": "Reads existing Linear get status updates data without changing workspace state.",
155
281
  },
156
- save_status_update: { verdict: "destructive", reason: UPSERT },
282
+ save_status_update: {
283
+ schemaDigest: "sha256:5078fdc9f3ea4ee104d05def28e45949083d4f2ff6f2435bd6b856abccbece75",
284
+ verdict: "destructive",
285
+ reason: UPSERT,
286
+ },
157
287
  delete_status_update: {
288
+ schemaDigest: "sha256:5e4e4cdac2d818bdc2a572947a11a28b251797e59affea97aa3b853f5439bf7f",
158
289
  "verdict": "destructive",
159
290
  "reason": "Changes or removes existing Linear state through delete_status_update.",
160
291
  },
161
292
  // Releases
162
293
  list_release_pipelines: {
294
+ schemaDigest: "sha256:7a20220ffbd895f834a0bd85ab6a444fbe7d71ee5b1d5dcbf8c109c7451984e0",
163
295
  "verdict": "read",
164
296
  "reason": "Reads existing Linear list release pipelines data without changing workspace state.",
165
297
  },
166
298
  list_releases: {
299
+ schemaDigest: "sha256:c9c6fa51eb980c3304a37f64e2a73f6e2e03e252330fcdb4ab9fc2e995c949cc",
167
300
  "verdict": "read",
168
301
  "reason": "Reads existing Linear list releases data without changing workspace state.",
169
302
  },
170
303
  get_release: {
304
+ schemaDigest: "sha256:6adeb4b4a0cb4888cfb45bf0a0d047f6de516dc05b7067912f5ba77025155fdb",
171
305
  "verdict": "read",
172
306
  "reason": "Reads existing Linear get release data without changing workspace state.",
173
307
  },
174
308
  list_release_notes: {
309
+ schemaDigest: "sha256:b0f1da15034143f29d44d949ea08bdfec2509ef196175a7a8ee5db11b655b06a",
175
310
  "verdict": "read",
176
311
  "reason": "Reads existing Linear list release notes data without changing workspace state.",
177
312
  },
178
313
  get_release_note: {
314
+ schemaDigest: "sha256:d28c0187ad65bca21b32451f8ab1d4a1c1a26efb485b9d4395e9b3d41555f532",
179
315
  "verdict": "read",
180
316
  "reason": "Reads existing Linear get release note data without changing workspace state.",
181
317
  },
182
- save_release: { verdict: "destructive", reason: UPSERT },
183
- save_release_note: { verdict: "destructive", reason: UPSERT },
318
+ save_release: {
319
+ schemaDigest: "sha256:97db7fa9246750a0533d07ed73d633fadc3fe2f27f2bf95deb6ea86bbcb2bc4b",
320
+ verdict: "destructive",
321
+ reason: UPSERT,
322
+ },
323
+ save_release_note: {
324
+ schemaDigest: "sha256:933c46faa3bb1edb4e9cc89299ab7dbcdaafab4bee6615aa43d538703fe4dab7",
325
+ verdict: "destructive",
326
+ reason: UPSERT,
327
+ },
184
328
  // Code review
185
329
  list_diffs: {
330
+ schemaDigest: "sha256:1eccf293d83cd2d962e6f840cd42dac43eaee1a15cbf7ea6b78bd6b55fe94313",
186
331
  "verdict": "read",
187
332
  "reason": "Reads existing Linear list diffs data without changing workspace state.",
188
333
  },
189
- get_diff: { "verdict": "read", "reason": "Reads existing Linear get diff data without changing workspace state." },
334
+ get_diff: {
335
+ schemaDigest: "sha256:692aaf3e4a1adb0b82e38bf01574b6615747f48619e295f0377255cf2fd3dbaa",
336
+ "verdict": "read",
337
+ "reason": "Reads existing Linear get diff data without changing workspace state.",
338
+ },
190
339
  get_diff_threads: {
340
+ schemaDigest: "sha256:98b66ecda18665bf883e70169c472802105fc113c0f39d3e25da76824b3e3457",
191
341
  "verdict": "read",
192
342
  "reason": "Reads existing Linear get diff threads data without changing workspace state.",
193
343
  },
194
- save_diff_comment: { verdict: "destructive", reason: UPSERT },
344
+ save_diff_comment: {
345
+ schemaDigest: "sha256:29a06cce756a5f3a6987693129a260659cad50083f7400723fb0b8bc9dd2b8bb",
346
+ verdict: "destructive",
347
+ reason: UPSERT,
348
+ },
195
349
  resolve_diff_thread: {
350
+ schemaDigest: "sha256:e493a5e74c1fd7e7bf104dbed8032c721c15209991aa12686c7f46b82a49ab2e",
196
351
  "verdict": "destructive",
197
352
  "reason": "Changes or removes existing Linear state through resolve_diff_thread.",
198
353
  },
199
354
  delete_diff_comment: {
355
+ schemaDigest: "sha256:88db600198790b6c99b6e9397d26649f49d48b0deaa758dc64e6f8b516d817c7",
200
356
  "verdict": "destructive",
201
357
  "reason": "Changes or removes existing Linear state through delete_diff_comment.",
202
358
  },
203
359
  submit_diff_review: {
360
+ schemaDigest: "sha256:97aa13f00d23db8d16191104dae0ddd2a3dd1c047415bf770474be0180320acf",
204
361
  "verdict": "destructive",
205
362
  "reason": "Changes or removes existing Linear state through submit_diff_review.",
206
363
  },
207
- merge_diff: { "verdict": "destructive", "reason": "Changes or removes existing Linear state through merge_diff." },
364
+ update_diff: {
365
+ schemaDigest: "sha256:8e5b77961d3d344b99a68cb82901d3764f6fb4c700f42c3c2fc59ea12a490f27",
366
+ verdict: "destructive",
367
+ reason: "Changes an existing diff's metadata, review requests, issue links or status; combined updates can partially succeed.",
368
+ },
369
+ merge_diff: {
370
+ schemaDigest: "sha256:e809bf0416c3cfb99794448eb66f69f83bbd7a451604faec7f622f47025f17fc",
371
+ "verdict": "destructive",
372
+ "reason": "Changes or removes existing Linear state through merge_diff.",
373
+ },
208
374
  // Attachments
209
375
  get_attachment: {
376
+ schemaDigest: "sha256:158ac0e0add99d9a9109a4f3549266be8f2d1eb5fa0832c861a4c56c20708a3b",
210
377
  "verdict": "read",
211
378
  "reason": "Reads existing Linear get attachment data without changing workspace state.",
212
379
  },
213
380
  prepare_attachment_upload: {
381
+ schemaDigest: "sha256:641559612992b1f6c1cd69fec3c66b898c12d2a21bc58973589be81fc2612c9c",
214
382
  verdict: "write",
215
383
  reason: "Mints an upload URL: a side effect, but it changes no existing record.",
216
384
  },
217
385
  create_attachment_from_upload: {
386
+ schemaDigest: "sha256:10818ba9327b9b70816512fd557ed3b4b85776f47cf8ca498f0d3ba17953dc2a",
218
387
  "verdict": "write",
219
388
  "reason": "Creates Linear state through create_attachment_from_upload; the reviewed operation only appends.",
220
389
  },
221
390
  create_attachment: {
391
+ schemaDigest: "sha256:0a4e4d5f6b62b5fbfd52d466d8b3167005e3574f3d00cf92e2fbfbbe769d8a1e",
222
392
  "verdict": "write",
223
393
  "reason": "Creates Linear state through create_attachment; the reviewed operation only appends.",
224
394
  },
225
395
  delete_attachment: {
396
+ schemaDigest: "sha256:ef21d1c1a7d09827b3c44bdefe18fc2dec28af468d19d2060f97df0a0f76bd0e",
226
397
  "verdict": "destructive",
227
398
  "reason": "Changes or removes existing Linear state through delete_attachment.",
228
399
  },
229
400
  // Explicit issue access.
230
401
  share_issue: {
402
+ schemaDigest: "sha256:f41410b4cf5effc62a03ad26bcf76ba792a1f7bea52a78da9183b5279b4a0433",
231
403
  verdict: "destructive",
232
404
  reason: "Changes who can see an existing issue.",
233
405
  },
234
406
  unshare_issue: {
407
+ schemaDigest: "sha256:f41410b4cf5effc62a03ad26bcf76ba792a1f7bea52a78da9183b5279b4a0433",
235
408
  verdict: "destructive",
236
409
  reason: "Changes who can see an existing issue.",
237
410
  },
238
411
  // Agent skills
239
412
  list_agent_skills: {
413
+ schemaDigest: "sha256:38fc34a53e932314e0bf6abc6493bca1256d37a951befceb95c1fe13bfa46ebd",
240
414
  "verdict": "read",
241
415
  "reason": "Reads existing Linear list agent skills data without changing workspace state.",
242
416
  },
243
417
  get_agent_skill: {
418
+ schemaDigest: "sha256:deb4296f3f7612ffb1af1e6ec75976acdc04ba12aff6c129a92b5a87e7a9ee09",
244
419
  "verdict": "read",
245
420
  "reason": "Reads existing Linear get agent skill data without changing workspace state.",
246
421
  },
247
422
  // Documentation search
248
423
  search_documentation: {
424
+ schemaDigest: "sha256:c2b89b06275e7b0cb63b73af749ae88b694446066058584e65c9208e33339efa",
249
425
  "verdict": "read",
250
426
  "reason": "Reads existing Linear search documentation data without changing workspace state.",
251
427
  },
252
428
  // Customer requests (plan-gated)
253
429
  list_customers: {
254
430
  "verdict": "read",
431
+ optional: true,
255
432
  "reason": "Reads existing Linear list customers data without changing workspace state.",
256
433
  },
257
- save_customer: { verdict: "destructive", reason: UPSERT },
434
+ list_customer_needs: {
435
+ verdict: "read",
436
+ optional: true,
437
+ reason: "Lists customer requests for an issue, project or initiative; announced in Linear's 2026-10-08 changelog and plan-gated in hosted catalogs.",
438
+ },
439
+ save_customer: { verdict: "destructive", optional: true, reason: UPSERT },
258
440
  delete_customer: {
259
441
  "verdict": "destructive",
442
+ optional: true,
260
443
  "reason": "Changes or removes existing Linear state through delete_customer.",
261
444
  },
262
- save_customer_need: { verdict: "destructive", reason: UPSERT },
445
+ save_customer_need: { verdict: "destructive", optional: true, reason: UPSERT },
263
446
  delete_customer_need: {
264
447
  "verdict": "destructive",
448
+ optional: true,
265
449
  "reason": "Changes or removes existing Linear state through delete_customer_need.",
266
450
  },
267
451
  // Markdown helper.
268
452
  extract_images: {
453
+ schemaDigest: "sha256:1d7273f64621448fd901fb4ac94ee3b29a4c4a833f0b27083775bd685f8a401c",
269
454
  verdict: "read",
270
455
  reason: "Reads images out of content it is handed and touches no workspace state; the hosted server ships it annotated readOnlyHint: true and idempotentHint: true.",
271
456
  },
@@ -302,7 +487,7 @@ export const linear = defineProvider({
302
487
  // the summary without the description.
303
488
  const accessNote = access === "read-only"
304
489
  ? "Read-only connection: bound to Linear's read-only endpoint, whose token is scope-limited downstream, so every write fails at Linear regardless of arguments. Route writes to a connector configured for read-write access."
305
- : "Read-write connection: treat every `save_`, `create_`, `delete_`, `resolve_`, `submit_`, and `merge_` operation as a write. Connecta classifies the maintained writes explicitly, and a read-only endpoint refuses them. Unknown tools without an explicit, uncontradicted read annotation fail closed.";
490
+ : "Read-write connection: treat every `save_`, `create_`, `delete_`, `retire_`, `restore_`, `mark_`, `update_`, `resolve_`, `submit_`, `share_`, `unshare_`, `prepare_`, and `merge_` operation as a write. Connecta classifies the maintained writes explicitly, and a read-only endpoint refuses them. Unknown tools without an explicit, uncontradicted read annotation fail closed.";
306
491
  return remoteMcp(id, {
307
492
  url: LINEAR_MCP_ENDPOINTS[access],
308
493
  ...provider.connectorOptions,
@@ -1,8 +1,8 @@
1
1
  // Generated by scripts/generate-providers.mjs; do not edit.
2
2
  export const skill = {
3
- "content": "- Issue arguments use `state`, not `status`. Resolve team-specific states through `list_issue_statuses` and use the value format required by the live input schema.\n- Resolve identity before acting. `list_teams`, `list_users`, `list_projects`, `list_issue_statuses`, and `list_issue_labels` return the ids that create and update arguments expect; do not guess a team, status, label, or assignee id.\n- Issues carry a human identifier like `ENG-123` — team key, dash, number — alongside a UUID. Use the identifier the request gave you and resolve it with `get_issue` or `list_issues` when a tool wants an id; never fabricate an identifier or renumber one.\n- `save_*` tools are upserts: omit the record id to create, supply it to update in place. Read the record first when you mean to update, and send only the fields you intend to change — an upsert overwrites what you restate.\n- Labels are the exception to that naming: `create_issue_label` and `create_initiative_label` only ever create.\n- Projects, milestones, and initiatives nest: initiatives contain projects, projects contain milestones and issues, and cycles are per-team time boxes. Scope a search by team or project rather than listing the workspace and filtering afterwards.\n- List tools paginate with a cursor. Thread the returned cursor for the next page instead of raising the page size, and reduce pages inside `execute_code` before returning them.\n- This workspace's catalog is not the whole product. Customer requests, releases, and code review are plan- and feature-gated, so search the catalog for what this connector actually exposes rather than assuming a tool exists.\n- Linear meters the underlying API per user per hour, shared with everything else that credential does. Reuse discovery results within a run and avoid speculative fan-out.\n- An `auth_required` failure means this connector's Linear authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged.",
3
+ "content": "- Issue arguments use `state`, not `status`. Resolve team-specific states through `list_issue_statuses` and use the value format required by the live input schema.\n- Resolve identity before acting. `list_teams`, `list_users`, `list_projects`, `list_issue_statuses`, and `list_issue_labels` return the ids that create and update arguments expect; do not guess a team, status, label, or assignee id.\n- Issues carry a human identifier like `ENG-123` — team key, dash, number — alongside a UUID. Use the identifier the request gave you and resolve it with `get_issue` or `list_issues` when a tool wants an id; never fabricate an identifier or renumber one.\n- `save_*` tools are upserts: omit the record id to create, supply it to update in place. Read the record first when you mean to update, and send only the fields you intend to change — an upsert overwrites what you restate.\n- Prefer `save_issue_label`, `save_project_label`, and `save_initiative_label` for label upserts. The deprecated `create_issue_label` and `create_initiative_label` remain create-only writes. Resolve existing labels with the corresponding `list_*_labels`; when updating issue or project labels, `teamId` disambiguates a name and cannot move the label to another team.\n- `retire_*_label` prevents new uses while preserving labels on existing records. Retiring a group retires its children; restoring a group restores every child, including children retired separately. Check the group and child scope before either lifecycle write.\n- `get_notifications` only reads the authenticated user's inbox. `mark_notification` writes read/unread or snooze state; resolve notification ids from that inbox before marking.\n- Read `get_diff` before `update_diff` and send only intended changes. Combined updates can partially succeed: inspect the result and reread before deciding whether any remaining change needs another call; never blindly replay the whole write. Use `merge_diff` to merge and `submit_diff_review` to approve or request changes.\n- Projects, milestones, and initiatives nest: initiatives contain projects, projects contain milestones and issues, and cycles are per-team time boxes. Scope a search by team or project rather than listing the workspace and filtering afterwards.\n- List tools paginate with a cursor. Thread the returned cursor for the next page instead of raising the page size, and reduce pages inside `execute_code` before returning them.\n- This workspace's catalog is not the whole product. Customer requests, releases, and code review are plan- and feature-gated, so search the catalog for what this connector actually exposes rather than assuming a tool exists.\n- Linear meters the underlying API per user per hour, shared with everything else that credential does. Reuse discovery results within a run and avoid speculative fan-out.\n- An `auth_required` failure means this connector's Linear authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged.",
4
4
  "instructionsHeading": "Workspace instructions",
5
5
  "fragments": {
6
- "content": "- Issue arguments use `state`, not `status`. Resolve team-specific states through `list_issue_statuses` and use the value format required by the live input schema.\n- Resolve identity before acting. `list_teams`, `list_users`, `list_projects`, `list_issue_statuses`, and `list_issue_labels` return the ids that create and update arguments expect; do not guess a team, status, label, or assignee id.\n- Issues carry a human identifier like `ENG-123` — team key, dash, number — alongside a UUID. Use the identifier the request gave you and resolve it with `get_issue` or `list_issues` when a tool wants an id; never fabricate an identifier or renumber one.\n- `save_*` tools are upserts: omit the record id to create, supply it to update in place. Read the record first when you mean to update, and send only the fields you intend to change — an upsert overwrites what you restate.\n- Labels are the exception to that naming: `create_issue_label` and `create_initiative_label` only ever create.\n- Projects, milestones, and initiatives nest: initiatives contain projects, projects contain milestones and issues, and cycles are per-team time boxes. Scope a search by team or project rather than listing the workspace and filtering afterwards.\n- List tools paginate with a cursor. Thread the returned cursor for the next page instead of raising the page size, and reduce pages inside `execute_code` before returning them.\n- This workspace's catalog is not the whole product. Customer requests, releases, and code review are plan- and feature-gated, so search the catalog for what this connector actually exposes rather than assuming a tool exists.\n- Linear meters the underlying API per user per hour, shared with everything else that credential does. Reuse discovery results within a run and avoid speculative fan-out.\n- An `auth_required` failure means this connector's Linear authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged."
6
+ "content": "- Issue arguments use `state`, not `status`. Resolve team-specific states through `list_issue_statuses` and use the value format required by the live input schema.\n- Resolve identity before acting. `list_teams`, `list_users`, `list_projects`, `list_issue_statuses`, and `list_issue_labels` return the ids that create and update arguments expect; do not guess a team, status, label, or assignee id.\n- Issues carry a human identifier like `ENG-123` — team key, dash, number — alongside a UUID. Use the identifier the request gave you and resolve it with `get_issue` or `list_issues` when a tool wants an id; never fabricate an identifier or renumber one.\n- `save_*` tools are upserts: omit the record id to create, supply it to update in place. Read the record first when you mean to update, and send only the fields you intend to change — an upsert overwrites what you restate.\n- Prefer `save_issue_label`, `save_project_label`, and `save_initiative_label` for label upserts. The deprecated `create_issue_label` and `create_initiative_label` remain create-only writes. Resolve existing labels with the corresponding `list_*_labels`; when updating issue or project labels, `teamId` disambiguates a name and cannot move the label to another team.\n- `retire_*_label` prevents new uses while preserving labels on existing records. Retiring a group retires its children; restoring a group restores every child, including children retired separately. Check the group and child scope before either lifecycle write.\n- `get_notifications` only reads the authenticated user's inbox. `mark_notification` writes read/unread or snooze state; resolve notification ids from that inbox before marking.\n- Read `get_diff` before `update_diff` and send only intended changes. Combined updates can partially succeed: inspect the result and reread before deciding whether any remaining change needs another call; never blindly replay the whole write. Use `merge_diff` to merge and `submit_diff_review` to approve or request changes.\n- Projects, milestones, and initiatives nest: initiatives contain projects, projects contain milestones and issues, and cycles are per-team time boxes. Scope a search by team or project rather than listing the workspace and filtering afterwards.\n- List tools paginate with a cursor. Thread the returned cursor for the next page instead of raising the page size, and reduce pages inside `execute_code` before returning them.\n- This workspace's catalog is not the whole product. Customer requests, releases, and code review are plan- and feature-gated, so search the catalog for what this connector actually exposes rather than assuming a tool exists.\n- Linear meters the underlying API per user per hour, shared with everything else that credential does. Reuse discovery results within a run and avoid speculative fan-out.\n- An `auth_required` failure means this connector's Linear authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged."
7
7
  }
8
8
  };
@@ -22,6 +22,8 @@ interface MixpanelCommonOptions {
22
22
  instructions?: string;
23
23
  /** Connector-specific inline result limit; omit to inherit the deployment. */
24
24
  maxResultBytes?: number;
25
+ /** Serve only read-classified tools on every endpoint. Defaults to false. */
26
+ readOnly?: boolean;
25
27
  /**
26
28
  * Optional per-runtime policy. API mode defaults to 60 calls/hour and five
27
29
  * concurrent calls across all tools and projects. MCP mode has no default:
@@ -12,10 +12,10 @@ export const MIXPANEL_MCP_ENDPOINTS = {
12
12
  in: "https://mcp-in.mixpanel.com/mcp",
13
13
  };
14
14
  /**
15
- * Reviewed in #705's provider audit against https://docs.mixpanel.com/docs/mcp.
16
- * Retains the release-reviewed inventory, including names absent from today's
17
- * public reference. Live annotations were not reverified without credentials.
18
- * Schema digests retain the 2026-08-30 live US review (#395, #512).
15
+ * Reviewed against https://docs.mixpanel.com/docs/mcp and the 2026-10-19 live
16
+ * US describe schemas (#343, #703). Eleven of the 64 previously pinned tools
17
+ * changed since the 2026-08-30 review (#395, #512); unchanged pins are retained.
18
+ * Get-Audit-Log is documented beta-only: no live schema digest is claimed.
19
19
  */
20
20
  const MIXPANEL_CLASSIFICATION = {
21
21
  tools: {
@@ -47,7 +47,7 @@ const MIXPANEL_CLASSIFICATION = {
47
47
  "Get-Dashboard": {
48
48
  "verdict": "read",
49
49
  "reason": "Retrieves Mixpanel dashboard information without changing vendor state.",
50
- "schemaDigest": "sha256:56659fa3277723b75e24f3b4ca142ac9cd62120fb97e6c9252c221d00cdf8509",
50
+ "schemaDigest": "sha256:0af78ab95566a20eeba08af6922f2017d98503e2b14dcbe8d7e2ac54eef870d7",
51
51
  },
52
52
  "Get-Business-Context": {
53
53
  "verdict": "read",
@@ -64,10 +64,14 @@ const MIXPANEL_CLASSIFICATION = {
64
64
  "reason": "Retrieves Mixpanel organizations information without changing vendor state.",
65
65
  "schemaDigest": "sha256:e4c23f123dde073e00038d92ebd53f45157c83a4d3a2ff686ab1b66c859f4a11",
66
66
  },
67
+ "Get-Audit-Log": {
68
+ "verdict": "read",
69
+ "reason": "Queries existing organization audit history; limited-access beta requiring organization admin or owner access.",
70
+ },
67
71
  "Get-Events": {
68
72
  "verdict": "read",
69
73
  "reason": "Retrieves Mixpanel events information without changing vendor state.",
70
- "schemaDigest": "sha256:d206fe30ab47d64bf6090bffdb4d119a80cfc2a35963bbe7fd52d56060090ded",
74
+ "schemaDigest": "sha256:09d7874b0c60cf790944b8998ee943f200912eac4349dfa80d0f2ae82a7a7998",
71
75
  },
72
76
  "List-Properties": {
73
77
  "verdict": "read",
@@ -112,7 +116,7 @@ const MIXPANEL_CLASSIFICATION = {
112
116
  "List-Cohorts": {
113
117
  "verdict": "read",
114
118
  "reason": "Retrieves Mixpanel cohorts information without changing vendor state.",
115
- "schemaDigest": "sha256:fd04778d60a027cfd777b40f36fbb037ba070661e149b2fce35a14865cada2db",
119
+ "schemaDigest": "sha256:505ff07f668186b670bcce28aa339076140b85896eb4f64afad78d963018297a",
116
120
  },
117
121
  "Describe-Cohort-Schema": {
118
122
  "verdict": "read",
@@ -127,7 +131,7 @@ const MIXPANEL_CLASSIFICATION = {
127
131
  "Get-Metric": {
128
132
  "verdict": "read",
129
133
  "reason": "Retrieves Mixpanel metric information without changing vendor state.",
130
- "schemaDigest": "sha256:eef10dd9ca25a63a63775565cbc4f2261b289dec526aa33df0f318eefbc96c46",
134
+ "schemaDigest": "sha256:451e867abd1162f25bec96f76cb1b1d1d84eb33c04fe4d804e729810d93d26d7",
131
135
  },
132
136
  "List-Metrics": {
133
137
  "verdict": "read",
@@ -145,9 +149,9 @@ const MIXPANEL_CLASSIFICATION = {
145
149
  "schemaDigest": "sha256:26a3f3e0b4e52135d74335dd769103303071fc48c15b1df40efd2dfa5a353848",
146
150
  },
147
151
  "Get-Experiment": {
148
- "verdict": "read",
149
- "reason": "Retrieves Mixpanel experiment information without changing vendor state.",
150
- "schemaDigest": "sha256:ab685aa985aa2ec36d9cbeb1b3c1ef298b020e552e8fdce12e75abbeb4706f2b",
152
+ "verdict": "destructive",
153
+ "reason": "Optional compute flags persist refreshed result caches and may auto-conclude an experiment; the full tool can modify existing state.",
154
+ "schemaDigest": "sha256:aebe329b5c5f3a9a465d40f12af1d6336d1304cc949c291eea752a5dd532e6fa",
151
155
  },
152
156
  "Get-Experiment-Setup-Guidance": {
153
157
  "verdict": "read",
@@ -197,12 +201,12 @@ const MIXPANEL_CLASSIFICATION = {
197
201
  "Create-Dashboard": {
198
202
  "verdict": "write",
199
203
  "reason": "Create Dashboard creates or appends Mixpanel state; it has side effects.",
200
- "schemaDigest": "sha256:bd3b6e5134d27dafb04ccdf04d19e54dd23e6e2dc16989e418006e484268037b",
204
+ "schemaDigest": "sha256:59fbe58cc8b69b31adfa7015e541d495abc566f56b1320e10ad77288ff9facf0",
201
205
  },
202
206
  "Update-Dashboard": {
203
207
  "verdict": "destructive",
204
208
  "reason": "Update Dashboard changes existing Mixpanel state or removes it.",
205
- "schemaDigest": "sha256:2cc179ba75eda476ba7488f01503d947f023a4460aa98c4806ef0ab10c3b3ce8",
209
+ "schemaDigest": "sha256:6f2f11e94a13667848bdcb30531a7ff478a8c53460a5e0859f8241b64d0008da",
206
210
  },
207
211
  "Duplicate-Dashboard": {
208
212
  "verdict": "write",
@@ -307,22 +311,22 @@ const MIXPANEL_CLASSIFICATION = {
307
311
  "Create-Metric": {
308
312
  "verdict": "write",
309
313
  "reason": "Create Metric creates or appends Mixpanel state; it has side effects.",
310
- "schemaDigest": "sha256:315766d0c197d87bb44aedd16732f6e69fbfc93661d1fcfc177cadc1751f26ce",
314
+ "schemaDigest": "sha256:c10bc660e0664a9aba6450a45b50fb1fbea6a4fac809fd5390616416f72e04d6",
311
315
  },
312
316
  "Update-Metric": {
313
317
  "verdict": "destructive",
314
318
  "reason": "Update Metric changes existing Mixpanel state or removes it.",
315
- "schemaDigest": "sha256:739bb6abdab19282afd4a6644a96183daabe9098a5322c44a77b840608a5ee9d",
319
+ "schemaDigest": "sha256:ca03823ea995d0ae53807a60b1dd0d47f1667b28cfd24cdab52a9fc66f0c2834",
316
320
  },
317
321
  "Create-Experiment": {
318
322
  "verdict": "write",
319
323
  "reason": "Create Experiment creates or appends Mixpanel state; it has side effects.",
320
- "schemaDigest": "sha256:1cfc2edeb2ac2d329a531d2095671a0653ab5b94b9e233b34268ff29a48c5ac5",
324
+ "schemaDigest": "sha256:ce64eafec7f2490fa3c76030c75340bf5dd282a9d0bfb0c5353bcdc3b50f602d",
321
325
  },
322
326
  "Update-Experiment": {
323
327
  "verdict": "destructive",
324
328
  "reason": "Update Experiment changes existing Mixpanel state or removes it.",
325
- "schemaDigest": "sha256:3ea3902555c146f45127fc563b36ffb7ff04b7594765dac9ae98cc09dc432808",
329
+ "schemaDigest": "sha256:27c0e2b58fbb1468dda938c4112560e9481f58bc4ddafd4a94bad56666c5b12c",
326
330
  },
327
331
  "Create-Feature-Flag": {
328
332
  "verdict": "write",