@openhands/extensions 0.15.0 → 0.17.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/.release-please-manifest.json +1 -1
- package/AGENTS.md +1 -0
- package/automations/README.md +97 -18
- package/automations/bundle-index.js +9 -0
- package/automations/catalog/github-pr-reviewer/manifest.json +23 -7
- package/automations/catalog/github-repo-monitor/manifest.json +28 -34
- package/automations/catalog/jira-issue-to-pr/manifest.json +3 -3
- package/automations/catalog.schema.json +102 -1
- package/automations/index.d.ts +174 -1
- package/automations/index.js +14 -0
- package/automations/interface.json +93 -6
- package/automations/interface.schema.json +273 -9
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/integrations/catalog/posthog.json +41 -3
- package/integrations/catalog/sonarqube.json +78 -0
- package/integrations/catalog-index.js +65 -63
- package/marketplaces/openhands-extensions.json +11 -0
- package/package.json +1 -1
- package/plugins/qa-changes/action.yml +1 -1
- package/pyproject.toml +1 -1
- package/python/openhands_extensions/_version.py +1 -1
- package/scripts/build-automation-catalog.mjs +30 -0
- package/scripts/build-skills-catalog.mjs +24 -7
- package/skills/add-skill/SKILL.md +1 -1
- package/skills/github-pr-reviewer/README.md +12 -6
- package/skills/github-pr-reviewer/SKILL.md +93 -31
- package/skills/github-pr-reviewer/commands/pr-reviewer-setup.md +1 -1
- package/skills/github-pr-reviewer/references/state-schema.md +68 -18
- package/skills/github-pr-reviewer/scripts/main.py +540 -103
- package/skills/github-pr-reviewer/tests/test_main.py +503 -0
- package/skills/index.d.ts +6 -0
- package/skills/index.js +29 -17
- package/skills/jira-issue-to-pr/scripts/main.py +4 -2
- package/skills/openhands-sdk/SKILL.md +2 -0
- package/skills/skill-creator/SKILL.md +1 -1
- package/skills/slack-channel-monitor/scripts/main.py +3 -2
- package/tests/fixtures/automations/capabilities.json +30 -0
- package/tests/fixtures/automations/github-pr-reviewer.json +319 -55
- package/tests/fixtures/automations/github-repo-monitor.json +153 -62
- package/tests/test_automation_setup.py +226 -31
- package/tests/test_catalogs.py +43 -0
- package/tests/test_interface_manifest.py +20 -0
- package/tests/test_skills_catalog.py +182 -36
- package/tests/test_slack_channel_monitor.py +1 -1
|
@@ -26,17 +26,21 @@
|
|
|
26
26
|
"description": "The routes of the Automation interface. The host must have a registration serving each declared shape, so admission verifies they match what it mounted; the manifest is the single source for link construction.",
|
|
27
27
|
"type": "object",
|
|
28
28
|
"additionalProperties": false,
|
|
29
|
-
"required": ["list", "setup", "detail"],
|
|
29
|
+
"required": ["list", "setup", "detail", "templates"],
|
|
30
30
|
"properties": {
|
|
31
31
|
"list": { "$ref": "#/$defs/routePath" },
|
|
32
32
|
"setup": { "$ref": "#/$defs/parameterizedRoutePath" },
|
|
33
|
-
"detail": { "$ref": "#/$defs/parameterizedRoutePath" }
|
|
33
|
+
"detail": { "$ref": "#/$defs/parameterizedRoutePath" },
|
|
34
|
+
"templates": {
|
|
35
|
+
"description": "The templates sub-page. Static: there is no parameter to substitute.",
|
|
36
|
+
"allOf": [{ "$ref": "#/$defs/routePath" }, { "not": { "pattern": ":" } }]
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
39
|
},
|
|
36
40
|
"navigation": {
|
|
37
41
|
"type": "object",
|
|
38
42
|
"additionalProperties": false,
|
|
39
|
-
"required": ["sidebar", "commandMenu"],
|
|
43
|
+
"required": ["sidebar", "commandMenu", "subPages"],
|
|
40
44
|
"properties": {
|
|
41
45
|
"sidebar": {
|
|
42
46
|
"type": "object",
|
|
@@ -53,22 +57,46 @@
|
|
|
53
57
|
"description": { "$ref": "#/$defs/copy" },
|
|
54
58
|
"keywords": { "$ref": "#/$defs/copy" }
|
|
55
59
|
}
|
|
60
|
+
},
|
|
61
|
+
"subPages": {
|
|
62
|
+
"description": "The ordered sub-page navigation of the Automation interface. Each page id may appear once; the host's admission checks that, since uniqueItems cannot see through differing labels.",
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minItems": 1,
|
|
65
|
+
"maxItems": 2,
|
|
66
|
+
"uniqueItems": true,
|
|
67
|
+
"items": { "$ref": "#/$defs/subPageNavItem" }
|
|
56
68
|
}
|
|
57
69
|
}
|
|
58
70
|
},
|
|
59
71
|
"pages": {
|
|
60
|
-
"description": "Page-identity copy. Generic chrome - buttons, toasts, empty states, validation sentences - stays host copy, rendered through the host's translations.",
|
|
72
|
+
"description": "Page-identity copy, plus the list page's dashboard composition. Generic chrome - buttons, toasts, empty states, validation sentences - stays host copy, rendered through the host's translations.",
|
|
61
73
|
"type": "object",
|
|
62
74
|
"additionalProperties": false,
|
|
63
|
-
"required": ["list", "detail", "edit"],
|
|
75
|
+
"required": ["list", "detail", "edit", "templates"],
|
|
64
76
|
"properties": {
|
|
65
77
|
"list": {
|
|
66
78
|
"type": "object",
|
|
67
79
|
"additionalProperties": false,
|
|
68
|
-
"required": ["title", "subtitle"],
|
|
80
|
+
"required": ["title", "subtitle", "overview", "filters", "sort", "insights"],
|
|
69
81
|
"properties": {
|
|
70
82
|
"title": { "$ref": "#/$defs/copy" },
|
|
71
|
-
"subtitle": { "$ref": "#/$defs/copy" }
|
|
83
|
+
"subtitle": { "$ref": "#/$defs/copy" },
|
|
84
|
+
"overview": { "$ref": "#/$defs/overview" },
|
|
85
|
+
"filters": {
|
|
86
|
+
"description": "The filter dropdowns of the list page, in render order. Each filter id may appear once; the host's admission checks that.",
|
|
87
|
+
"type": "array",
|
|
88
|
+
"minItems": 1,
|
|
89
|
+
"maxItems": 2,
|
|
90
|
+
"uniqueItems": true,
|
|
91
|
+
"items": {
|
|
92
|
+
"oneOf": [
|
|
93
|
+
{ "$ref": "#/$defs/statusFilter" },
|
|
94
|
+
{ "$ref": "#/$defs/triggerFilter" }
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"sort": { "$ref": "#/$defs/sort" },
|
|
99
|
+
"insights": { "$ref": "#/$defs/insights" }
|
|
72
100
|
}
|
|
73
101
|
},
|
|
74
102
|
"detail": {
|
|
@@ -82,6 +110,16 @@
|
|
|
82
110
|
"additionalProperties": false,
|
|
83
111
|
"required": ["title"],
|
|
84
112
|
"properties": { "title": { "$ref": "#/$defs/copy" } }
|
|
113
|
+
},
|
|
114
|
+
"templates": {
|
|
115
|
+
"description": "The templates sub-page identity. Its body - the catalog cards and their launch behavior - is the host's existing catalog surface.",
|
|
116
|
+
"type": "object",
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"required": ["title", "description"],
|
|
119
|
+
"properties": {
|
|
120
|
+
"title": { "$ref": "#/$defs/copy" },
|
|
121
|
+
"description": { "$ref": "#/$defs/copy" }
|
|
122
|
+
}
|
|
85
123
|
}
|
|
86
124
|
}
|
|
87
125
|
},
|
|
@@ -140,7 +178,9 @@
|
|
|
140
178
|
"capabilities",
|
|
141
179
|
"validate",
|
|
142
180
|
"createPrompt",
|
|
143
|
-
"createPlugin"
|
|
181
|
+
"createPlugin",
|
|
182
|
+
"createBundle",
|
|
183
|
+
"uploads"
|
|
144
184
|
],
|
|
145
185
|
"properties": {
|
|
146
186
|
"list": { "$ref": "#/$defs/plainEndpoint" },
|
|
@@ -152,7 +192,9 @@
|
|
|
152
192
|
"capabilities": { "$ref": "#/$defs/plainEndpoint" },
|
|
153
193
|
"validate": { "$ref": "#/$defs/plainEndpoint" },
|
|
154
194
|
"createPrompt": { "$ref": "#/$defs/plainEndpoint" },
|
|
155
|
-
"createPlugin": { "$ref": "#/$defs/plainEndpoint" }
|
|
195
|
+
"createPlugin": { "$ref": "#/$defs/plainEndpoint" },
|
|
196
|
+
"createBundle": { "$ref": "#/$defs/plainEndpoint" },
|
|
197
|
+
"uploads": { "$ref": "#/$defs/plainEndpoint" }
|
|
156
198
|
}
|
|
157
199
|
},
|
|
158
200
|
"featuredAutomationIds": {
|
|
@@ -238,6 +280,228 @@
|
|
|
238
280
|
"minItems": 1,
|
|
239
281
|
"uniqueItems": true,
|
|
240
282
|
"items": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }
|
|
283
|
+
},
|
|
284
|
+
"iconSlug": {
|
|
285
|
+
"description": "An icon name from the host's closed icon map. The manifest picks from what the host ships; it cannot supply artwork.",
|
|
286
|
+
"enum": [
|
|
287
|
+
"layout-dashboard",
|
|
288
|
+
"sparkles",
|
|
289
|
+
"bot",
|
|
290
|
+
"circle-alert",
|
|
291
|
+
"activity",
|
|
292
|
+
"timer"
|
|
293
|
+
]
|
|
294
|
+
},
|
|
295
|
+
"subPageNavItem": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"additionalProperties": false,
|
|
298
|
+
"required": ["page", "label", "icon"],
|
|
299
|
+
"properties": {
|
|
300
|
+
"page": {
|
|
301
|
+
"description": "The pages entry this item navigates to; its route comes from routes.list or routes.templates.",
|
|
302
|
+
"enum": ["list", "templates"]
|
|
303
|
+
},
|
|
304
|
+
"label": { "$ref": "#/$defs/copy" },
|
|
305
|
+
"icon": { "$ref": "#/$defs/iconSlug" }
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"overview": {
|
|
309
|
+
"description": "The summary tiles above the list. label names the section for assistive technology.",
|
|
310
|
+
"type": "object",
|
|
311
|
+
"additionalProperties": false,
|
|
312
|
+
"required": ["label", "tiles"],
|
|
313
|
+
"properties": {
|
|
314
|
+
"label": { "$ref": "#/$defs/copy" },
|
|
315
|
+
"tiles": {
|
|
316
|
+
"description": "Each metric may appear once; the host's admission checks that.",
|
|
317
|
+
"type": "array",
|
|
318
|
+
"minItems": 1,
|
|
319
|
+
"maxItems": 8,
|
|
320
|
+
"uniqueItems": true,
|
|
321
|
+
"items": { "$ref": "#/$defs/overviewTile" }
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
"overviewTile": {
|
|
326
|
+
"description": "One summary tile. The metric names a value the host computes - a tile picks and captions it, never defines it. detail is the caption under the value; zeroDetail, when present, replaces it while the value is zero. Both are plain substitution over the metric's placeholder namespace: only the automations metric exposes {{active}}, so every other tile's copy is literal.",
|
|
327
|
+
"type": "object",
|
|
328
|
+
"additionalProperties": false,
|
|
329
|
+
"required": ["metric", "label", "detail", "icon"],
|
|
330
|
+
"properties": {
|
|
331
|
+
"metric": {
|
|
332
|
+
"enum": ["automations", "needs-attention", "total-runs", "average-duration"]
|
|
333
|
+
},
|
|
334
|
+
"label": { "$ref": "#/$defs/copy" },
|
|
335
|
+
"detail": { "$ref": "#/$defs/copy" },
|
|
336
|
+
"zeroDetail": { "$ref": "#/$defs/copy" },
|
|
337
|
+
"icon": { "$ref": "#/$defs/iconSlug" }
|
|
338
|
+
},
|
|
339
|
+
"allOf": [
|
|
340
|
+
{
|
|
341
|
+
"if": {
|
|
342
|
+
"properties": { "metric": { "const": "automations" } },
|
|
343
|
+
"required": ["metric"]
|
|
344
|
+
},
|
|
345
|
+
"then": {
|
|
346
|
+
"properties": {
|
|
347
|
+
"detail": { "not": { "pattern": "\\{\\{(?!active\\}\\})" } },
|
|
348
|
+
"zeroDetail": { "not": { "pattern": "\\{\\{(?!active\\}\\})" } }
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"else": {
|
|
352
|
+
"properties": {
|
|
353
|
+
"detail": { "not": { "pattern": "\\{\\{" } },
|
|
354
|
+
"zeroDetail": { "not": { "pattern": "\\{\\{" } }
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
},
|
|
360
|
+
"statusFilter": {
|
|
361
|
+
"description": "The status filter. Values name predicates the host implements over an automation and its derived health; the manifest supplies which appear and their labels. The all option is the host's default and reset target, so it must be offered.",
|
|
362
|
+
"type": "object",
|
|
363
|
+
"additionalProperties": false,
|
|
364
|
+
"required": ["id", "label", "options"],
|
|
365
|
+
"properties": {
|
|
366
|
+
"id": { "const": "status" },
|
|
367
|
+
"label": {
|
|
368
|
+
"description": "The control's accessible name.",
|
|
369
|
+
"$ref": "#/$defs/copy"
|
|
370
|
+
},
|
|
371
|
+
"options": {
|
|
372
|
+
"description": "Each value may appear once; the host's admission checks that.",
|
|
373
|
+
"type": "array",
|
|
374
|
+
"minItems": 2,
|
|
375
|
+
"maxItems": 8,
|
|
376
|
+
"uniqueItems": true,
|
|
377
|
+
"items": {
|
|
378
|
+
"type": "object",
|
|
379
|
+
"additionalProperties": false,
|
|
380
|
+
"required": ["value", "label"],
|
|
381
|
+
"properties": {
|
|
382
|
+
"value": { "enum": ["all", "active", "failing", "disabled"] },
|
|
383
|
+
"label": { "$ref": "#/$defs/copy" }
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
"contains": {
|
|
387
|
+
"type": "object",
|
|
388
|
+
"required": ["value"],
|
|
389
|
+
"properties": { "value": { "const": "all" } }
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
"triggerFilter": {
|
|
395
|
+
"description": "The trigger filter. Like the status filter, values name host-implemented predicates: event matches event-triggered automations, schedule everything else.",
|
|
396
|
+
"type": "object",
|
|
397
|
+
"additionalProperties": false,
|
|
398
|
+
"required": ["id", "label", "options"],
|
|
399
|
+
"properties": {
|
|
400
|
+
"id": { "const": "trigger" },
|
|
401
|
+
"label": {
|
|
402
|
+
"description": "The control's accessible name.",
|
|
403
|
+
"$ref": "#/$defs/copy"
|
|
404
|
+
},
|
|
405
|
+
"options": {
|
|
406
|
+
"description": "Each value may appear once; the host's admission checks that.",
|
|
407
|
+
"type": "array",
|
|
408
|
+
"minItems": 2,
|
|
409
|
+
"maxItems": 8,
|
|
410
|
+
"uniqueItems": true,
|
|
411
|
+
"items": {
|
|
412
|
+
"type": "object",
|
|
413
|
+
"additionalProperties": false,
|
|
414
|
+
"required": ["value", "label"],
|
|
415
|
+
"properties": {
|
|
416
|
+
"value": { "enum": ["all", "schedule", "event"] },
|
|
417
|
+
"label": { "$ref": "#/$defs/copy" }
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
"contains": {
|
|
421
|
+
"type": "object",
|
|
422
|
+
"required": ["value"],
|
|
423
|
+
"properties": { "value": { "const": "all" } }
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
"sort": {
|
|
429
|
+
"description": "The sort dropdown. Values name comparators the host implements. default must be one of the declared option values; the host's admission checks that, as schemas cannot cheaply.",
|
|
430
|
+
"type": "object",
|
|
431
|
+
"additionalProperties": false,
|
|
432
|
+
"required": ["label", "options", "default"],
|
|
433
|
+
"properties": {
|
|
434
|
+
"label": {
|
|
435
|
+
"description": "The control's accessible name.",
|
|
436
|
+
"$ref": "#/$defs/copy"
|
|
437
|
+
},
|
|
438
|
+
"options": {
|
|
439
|
+
"description": "Each value may appear once; the host's admission checks that.",
|
|
440
|
+
"type": "array",
|
|
441
|
+
"minItems": 1,
|
|
442
|
+
"maxItems": 3,
|
|
443
|
+
"uniqueItems": true,
|
|
444
|
+
"items": {
|
|
445
|
+
"type": "object",
|
|
446
|
+
"additionalProperties": false,
|
|
447
|
+
"required": ["value", "label"],
|
|
448
|
+
"properties": {
|
|
449
|
+
"value": { "$ref": "#/$defs/sortValue" },
|
|
450
|
+
"label": { "$ref": "#/$defs/copy" }
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
"default": { "$ref": "#/$defs/sortValue" }
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
"sortValue": { "enum": ["last-run", "runs", "name"] },
|
|
458
|
+
"insights": {
|
|
459
|
+
"description": "Copy for the per-automation run insights on cards and rows. The states, precedence, sampling, and value formatting are the host's; the manifest names them.",
|
|
460
|
+
"type": "object",
|
|
461
|
+
"additionalProperties": false,
|
|
462
|
+
"required": ["health", "lastRun", "stats"],
|
|
463
|
+
"properties": {
|
|
464
|
+
"health": {
|
|
465
|
+
"type": "object",
|
|
466
|
+
"additionalProperties": false,
|
|
467
|
+
"required": [
|
|
468
|
+
"healthy",
|
|
469
|
+
"failing",
|
|
470
|
+
"running",
|
|
471
|
+
"disabled",
|
|
472
|
+
"neverRun",
|
|
473
|
+
"checking"
|
|
474
|
+
],
|
|
475
|
+
"properties": {
|
|
476
|
+
"healthy": { "$ref": "#/$defs/copy" },
|
|
477
|
+
"failing": { "$ref": "#/$defs/copy" },
|
|
478
|
+
"running": { "$ref": "#/$defs/copy" },
|
|
479
|
+
"disabled": { "$ref": "#/$defs/copy" },
|
|
480
|
+
"neverRun": { "$ref": "#/$defs/copy" },
|
|
481
|
+
"checking": { "$ref": "#/$defs/copy" }
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
"lastRun": {
|
|
485
|
+
"type": "object",
|
|
486
|
+
"additionalProperties": false,
|
|
487
|
+
"required": ["label", "never", "justNow"],
|
|
488
|
+
"properties": {
|
|
489
|
+
"label": { "$ref": "#/$defs/copy" },
|
|
490
|
+
"never": { "$ref": "#/$defs/copy" },
|
|
491
|
+
"justNow": { "$ref": "#/$defs/copy" }
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"stats": {
|
|
495
|
+
"type": "object",
|
|
496
|
+
"additionalProperties": false,
|
|
497
|
+
"required": ["runs", "recentSuccess", "averageDuration"],
|
|
498
|
+
"properties": {
|
|
499
|
+
"runs": { "$ref": "#/$defs/copy" },
|
|
500
|
+
"recentSuccess": { "$ref": "#/$defs/copy" },
|
|
501
|
+
"averageDuration": { "$ref": "#/$defs/copy" }
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
241
505
|
}
|
|
242
506
|
}
|
|
243
507
|
}
|
package/index.d.ts
CHANGED
|
@@ -42,5 +42,5 @@ export type {
|
|
|
42
42
|
AutomationInterfacePages,
|
|
43
43
|
AutomationInterfaceRoutes,
|
|
44
44
|
} from "./automations/index.js";
|
|
45
|
-
export { SKILLS_CATALOG } from "./skills/index.js";
|
|
45
|
+
export { SKILLS_CATALOG, DEFAULT_ENABLED_SKILL_NAMES } from "./skills/index.js";
|
|
46
46
|
export type { SkillCatalogEntry } from "./skills/index.js";
|
package/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { INTEGRATION_CATALOG } from "./integrations/index.js";
|
|
2
2
|
export { AUTOMATION_CATALOG, AUTOMATION_INTERFACE } from "./automations/index.js";
|
|
3
|
-
export { SKILLS_CATALOG } from "./skills/index.js";
|
|
3
|
+
export { SKILLS_CATALOG, DEFAULT_ENABLED_SKILL_NAMES } from "./skills/index.js";
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
],
|
|
9
9
|
"appUrl": "https://posthog.com",
|
|
10
10
|
"docsUrl": "https://posthog.com/docs/model-context-protocol",
|
|
11
|
-
"notes": "
|
|
11
|
+
"notes": "Uses PostHog's official hosted MCP server. OAuth is preferred; the bearer-token option remains for clients or deployments that require a personal API key. The OAuth URL defaults to read-only mode; remove readonly=true only when write access has been approved.",
|
|
12
12
|
"popularityRank": 37,
|
|
13
13
|
"iconBg": "#1D4AFF",
|
|
14
14
|
"logoUrl": "https://cdn.simpleicons.org/posthog/FFFFFF",
|
|
@@ -18,8 +18,44 @@
|
|
|
18
18
|
"product",
|
|
19
19
|
"experiments"
|
|
20
20
|
],
|
|
21
|
-
"installHint": "
|
|
21
|
+
"installHint": "Prefer OAuth. The default OAuth connection uses read-only MCP mode; edit the URL or use the bearer-key fallback only when a workflow needs approved write access. For API keys, create a PostHog personal API key with the MCP Server preset.",
|
|
22
22
|
"connectionOptions": [
|
|
23
|
+
{
|
|
24
|
+
"id": "oauth",
|
|
25
|
+
"provider": "mcp",
|
|
26
|
+
"auth": {
|
|
27
|
+
"strategy": "oauth2",
|
|
28
|
+
"oauth": {
|
|
29
|
+
"authorizationUrl": "https://oauth.posthog.com/oauth/authorize/",
|
|
30
|
+
"tokenUrl": "https://oauth.posthog.com/oauth/token/",
|
|
31
|
+
"registrationUrl": "https://oauth.posthog.com/oauth/register/",
|
|
32
|
+
"scopes": [
|
|
33
|
+
"openid",
|
|
34
|
+
"profile",
|
|
35
|
+
"email",
|
|
36
|
+
"organization:read",
|
|
37
|
+
"project:read",
|
|
38
|
+
"dashboard:read",
|
|
39
|
+
"insight:read",
|
|
40
|
+
"query:read",
|
|
41
|
+
"event_definition:read"
|
|
42
|
+
],
|
|
43
|
+
"pkce": true,
|
|
44
|
+
"clientAuthentication": "none",
|
|
45
|
+
"additionalAuthorizationParams": {
|
|
46
|
+
"resource": "https://mcp.posthog.com/mcp"
|
|
47
|
+
},
|
|
48
|
+
"additionalTokenParams": {
|
|
49
|
+
"resource": "https://mcp.posthog.com/mcp"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"transport": {
|
|
54
|
+
"kind": "shttp",
|
|
55
|
+
"url": "https://mcp.posthog.com/mcp?readonly=true",
|
|
56
|
+
"urlEditable": true
|
|
57
|
+
}
|
|
58
|
+
},
|
|
23
59
|
{
|
|
24
60
|
"id": "api-key",
|
|
25
61
|
"provider": "mcp",
|
|
@@ -31,7 +67,9 @@
|
|
|
31
67
|
"strategy": "bearer",
|
|
32
68
|
"credentialLabel": "PostHog personal API key",
|
|
33
69
|
"credentialPlaceholder": "Paste your PostHog personal API key",
|
|
34
|
-
"credentialHelp": "Create one under PostHog
|
|
70
|
+
"credentialHelp": "Create one under PostHog > User settings > API keys using the MCP Server preset. Sent as Authorization: Bearer <token>.",
|
|
71
|
+
"credentialSecretName": "POSTHOG_PERSONAL_API_KEY",
|
|
72
|
+
"saveCredentialAsSecretByDefault": true
|
|
35
73
|
}
|
|
36
74
|
}
|
|
37
75
|
]
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "sonarqube",
|
|
3
|
+
"name": "SonarQube",
|
|
4
|
+
"description": "Inspect code quality and security findings, quality gates, and analyze code snippets from SonarQube Server or Cloud.",
|
|
5
|
+
"categories": [
|
|
6
|
+
"Engineering",
|
|
7
|
+
"Security"
|
|
8
|
+
],
|
|
9
|
+
"appUrl": "https://www.sonarsource.com/products/sonarqube/mcp-server/",
|
|
10
|
+
"docsUrl": "https://github.com/SonarSource/sonarqube-mcp-server",
|
|
11
|
+
"notes": "Uses SonarSource's official SonarQube MCP Server, run locally as a Docker container. Provide a SonarQube user token. Set SONARQUBE_ORG for SonarQube Cloud, or SONARQUBE_URL for a self-managed SonarQube Server (or https://sonarqube.us for SonarQube Cloud US).",
|
|
12
|
+
"popularityRank": 43,
|
|
13
|
+
"installHint": "SONARQUBE_TOKEN is always required. For SonarQube Cloud, set your organization key in SONARQUBE_ORG. For a self-managed SonarQube Server, set SONARQUBE_URL to your server URL; for SonarQube Cloud US, set SONARQUBE_URL to https://sonarqube.us. Requires a container runtime such as Docker.",
|
|
14
|
+
"connectionOptions": [
|
|
15
|
+
{
|
|
16
|
+
"id": "api",
|
|
17
|
+
"provider": "mcp",
|
|
18
|
+
"transport": {
|
|
19
|
+
"kind": "stdio",
|
|
20
|
+
"serverName": "sonarqube",
|
|
21
|
+
"command": "docker",
|
|
22
|
+
"args": [
|
|
23
|
+
"run",
|
|
24
|
+
"--init",
|
|
25
|
+
"--pull=always",
|
|
26
|
+
"-i",
|
|
27
|
+
"--rm",
|
|
28
|
+
"-e",
|
|
29
|
+
"SONARQUBE_TOKEN",
|
|
30
|
+
"-e",
|
|
31
|
+
"SONARQUBE_ORG",
|
|
32
|
+
"-e",
|
|
33
|
+
"SONARQUBE_URL",
|
|
34
|
+
"sonarsource/sonarqube-mcp"
|
|
35
|
+
],
|
|
36
|
+
"envFields": [
|
|
37
|
+
{
|
|
38
|
+
"key": "SONARQUBE_TOKEN",
|
|
39
|
+
"label": "SonarQube token",
|
|
40
|
+
"type": "password",
|
|
41
|
+
"required": true,
|
|
42
|
+
"helperText": "User token generated in your SonarQube Server or Cloud account settings.",
|
|
43
|
+
"helperLink": "https://docs.sonarsource.com/sonarqube-cloud/managing-your-account/managing-tokens/"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"key": "SONARQUBE_ORG",
|
|
47
|
+
"label": "Organization key (SonarQube Cloud)",
|
|
48
|
+
"type": "text",
|
|
49
|
+
"required": false,
|
|
50
|
+
"placeholder": "my-org",
|
|
51
|
+
"helperText": "Required for SonarQube Cloud. Your organization key, found in SonarQube Cloud."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"key": "SONARQUBE_URL",
|
|
55
|
+
"label": "Server URL (SonarQube Server)",
|
|
56
|
+
"type": "text",
|
|
57
|
+
"required": false,
|
|
58
|
+
"placeholder": "https://sonarqube.example.com",
|
|
59
|
+
"helperText": "Required for a self-managed SonarQube Server. For SonarQube Cloud US, use https://sonarqube.us."
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"auth": {
|
|
64
|
+
"strategy": "api_key"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"iconBg": "#126ED3",
|
|
69
|
+
"logoUrl": "https://cdn.simpleicons.org/sonarqubeserver/FFFFFF",
|
|
70
|
+
"keywords": [
|
|
71
|
+
"code quality",
|
|
72
|
+
"static analysis",
|
|
73
|
+
"security",
|
|
74
|
+
"sast",
|
|
75
|
+
"quality gate",
|
|
76
|
+
"sonarcloud"
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -14,69 +14,70 @@ import entry8 from "./catalog/elevenlabs.json" with { type: "json" };
|
|
|
14
14
|
import entry9 from "./catalog/bitbucket.json" with { type: "json" };
|
|
15
15
|
import entry10 from "./catalog/xero.json" with { type: "json" };
|
|
16
16
|
import entry11 from "./catalog/quickbooks.json" with { type: "json" };
|
|
17
|
-
import entry12 from "./catalog/
|
|
18
|
-
import entry13 from "./catalog/
|
|
19
|
-
import entry14 from "./catalog/
|
|
20
|
-
import entry15 from "./catalog/
|
|
21
|
-
import entry16 from "./catalog/
|
|
22
|
-
import entry17 from "./catalog/
|
|
23
|
-
import entry18 from "./catalog/
|
|
24
|
-
import entry19 from "./catalog/
|
|
25
|
-
import entry20 from "./catalog/
|
|
26
|
-
import entry21 from "./catalog/
|
|
27
|
-
import entry22 from "./catalog/
|
|
28
|
-
import entry23 from "./catalog/
|
|
29
|
-
import entry24 from "./catalog/
|
|
30
|
-
import entry25 from "./catalog/
|
|
31
|
-
import entry26 from "./catalog/
|
|
32
|
-
import entry27 from "./catalog/
|
|
33
|
-
import entry28 from "./catalog/
|
|
34
|
-
import entry29 from "./catalog/
|
|
35
|
-
import entry30 from "./catalog/
|
|
36
|
-
import entry31 from "./catalog/microsoft-
|
|
37
|
-
import entry32 from "./catalog/
|
|
38
|
-
import entry33 from "./catalog/
|
|
39
|
-
import entry34 from "./catalog/
|
|
40
|
-
import entry35 from "./catalog/
|
|
41
|
-
import entry36 from "./catalog/
|
|
42
|
-
import entry37 from "./catalog/
|
|
43
|
-
import entry38 from "./catalog/
|
|
44
|
-
import entry39 from "./catalog/
|
|
45
|
-
import entry40 from "./catalog/
|
|
46
|
-
import entry41 from "./catalog/
|
|
47
|
-
import entry42 from "./catalog/google-
|
|
48
|
-
import entry43 from "./catalog/
|
|
49
|
-
import entry44 from "./catalog/
|
|
50
|
-
import entry45 from "./catalog/
|
|
51
|
-
import entry46 from "./catalog/
|
|
52
|
-
import entry47 from "./catalog/
|
|
53
|
-
import entry48 from "./catalog/
|
|
54
|
-
import entry49 from "./catalog/
|
|
55
|
-
import entry50 from "./catalog/
|
|
56
|
-
import entry51 from "./catalog/cloudflare-
|
|
57
|
-
import entry52 from "./catalog/cloudflare-
|
|
58
|
-
import entry53 from "./catalog/cloudflare-
|
|
59
|
-
import entry54 from "./catalog/cloudflare-
|
|
60
|
-
import entry55 from "./catalog/
|
|
61
|
-
import entry56 from "./catalog/
|
|
62
|
-
import entry57 from "./catalog/
|
|
63
|
-
import entry58 from "./catalog/
|
|
64
|
-
import entry59 from "./catalog/
|
|
65
|
-
import entry60 from "./catalog/
|
|
66
|
-
import entry61 from "./catalog/
|
|
67
|
-
import entry62 from "./catalog/
|
|
68
|
-
import entry63 from "./catalog/
|
|
69
|
-
import entry64 from "./catalog/
|
|
70
|
-
import entry65 from "./catalog/
|
|
71
|
-
import entry66 from "./catalog/
|
|
72
|
-
import entry67 from "./catalog/
|
|
73
|
-
import entry68 from "./catalog/
|
|
74
|
-
import entry69 from "./catalog/
|
|
75
|
-
import entry70 from "./catalog/
|
|
76
|
-
import entry71 from "./catalog/
|
|
77
|
-
import entry72 from "./catalog/
|
|
78
|
-
import entry73 from "./catalog/
|
|
79
|
-
import entry74 from "./catalog/
|
|
17
|
+
import entry12 from "./catalog/sonarqube.json" with { type: "json" };
|
|
18
|
+
import entry13 from "./catalog/okta.json" with { type: "json" };
|
|
19
|
+
import entry14 from "./catalog/netlify.json" with { type: "json" };
|
|
20
|
+
import entry15 from "./catalog/vercel.json" with { type: "json" };
|
|
21
|
+
import entry16 from "./catalog/supabase.json" with { type: "json" };
|
|
22
|
+
import entry17 from "./catalog/posthog.json" with { type: "json" };
|
|
23
|
+
import entry18 from "./catalog/sentry.json" with { type: "json" };
|
|
24
|
+
import entry19 from "./catalog/datadog.json" with { type: "json" };
|
|
25
|
+
import entry20 from "./catalog/canva.json" with { type: "json" };
|
|
26
|
+
import entry21 from "./catalog/miro.json" with { type: "json" };
|
|
27
|
+
import entry22 from "./catalog/webflow.json" with { type: "json" };
|
|
28
|
+
import entry23 from "./catalog/zoom.json" with { type: "json" };
|
|
29
|
+
import entry24 from "./catalog/discord.json" with { type: "json" };
|
|
30
|
+
import entry25 from "./catalog/stripe.json" with { type: "json" };
|
|
31
|
+
import entry26 from "./catalog/intercom.json" with { type: "json" };
|
|
32
|
+
import entry27 from "./catalog/hubspot.json" with { type: "json" };
|
|
33
|
+
import entry28 from "./catalog/salesforce.json" with { type: "json" };
|
|
34
|
+
import entry29 from "./catalog/sharepoint.json" with { type: "json" };
|
|
35
|
+
import entry30 from "./catalog/onedrive.json" with { type: "json" };
|
|
36
|
+
import entry31 from "./catalog/microsoft-teams.json" with { type: "json" };
|
|
37
|
+
import entry32 from "./catalog/microsoft-outlook.json" with { type: "json" };
|
|
38
|
+
import entry33 from "./catalog/box.json" with { type: "json" };
|
|
39
|
+
import entry34 from "./catalog/airtable.json" with { type: "json" };
|
|
40
|
+
import entry35 from "./catalog/monday.json" with { type: "json" };
|
|
41
|
+
import entry36 from "./catalog/trello.json" with { type: "json" };
|
|
42
|
+
import entry37 from "./catalog/asana.json" with { type: "json" };
|
|
43
|
+
import entry38 from "./catalog/confluence.json" with { type: "json" };
|
|
44
|
+
import entry39 from "./catalog/jira.json" with { type: "json" };
|
|
45
|
+
import entry40 from "./catalog/google-calendar.json" with { type: "json" };
|
|
46
|
+
import entry41 from "./catalog/gmail.json" with { type: "json" };
|
|
47
|
+
import entry42 from "./catalog/google-sheets.json" with { type: "json" };
|
|
48
|
+
import entry43 from "./catalog/google-drive.json" with { type: "json" };
|
|
49
|
+
import entry44 from "./catalog/figma.json" with { type: "json" };
|
|
50
|
+
import entry45 from "./catalog/google-docs.json" with { type: "json" };
|
|
51
|
+
import entry46 from "./catalog/apify.json" with { type: "json" };
|
|
52
|
+
import entry47 from "./catalog/atlassian-rovo.json" with { type: "json" };
|
|
53
|
+
import entry48 from "./catalog/brave-search.json" with { type: "json" };
|
|
54
|
+
import entry49 from "./catalog/browser-mcp.json" with { type: "json" };
|
|
55
|
+
import entry50 from "./catalog/clickhouse.json" with { type: "json" };
|
|
56
|
+
import entry51 from "./catalog/cloudflare-bindings.json" with { type: "json" };
|
|
57
|
+
import entry52 from "./catalog/cloudflare-browser-rendering.json" with { type: "json" };
|
|
58
|
+
import entry53 from "./catalog/cloudflare-builds.json" with { type: "json" };
|
|
59
|
+
import entry54 from "./catalog/cloudflare-docs.json" with { type: "json" };
|
|
60
|
+
import entry55 from "./catalog/cloudflare-observability.json" with { type: "json" };
|
|
61
|
+
import entry56 from "./catalog/deepwiki.json" with { type: "json" };
|
|
62
|
+
import entry57 from "./catalog/everything.json" with { type: "json" };
|
|
63
|
+
import entry58 from "./catalog/exa.json" with { type: "json" };
|
|
64
|
+
import entry59 from "./catalog/fetch.json" with { type: "json" };
|
|
65
|
+
import entry60 from "./catalog/filesystem.json" with { type: "json" };
|
|
66
|
+
import entry61 from "./catalog/firecrawl.json" with { type: "json" };
|
|
67
|
+
import entry62 from "./catalog/git.json" with { type: "json" };
|
|
68
|
+
import entry63 from "./catalog/huggingface.json" with { type: "json" };
|
|
69
|
+
import entry64 from "./catalog/kagi.json" with { type: "json" };
|
|
70
|
+
import entry65 from "./catalog/memory.json" with { type: "json" };
|
|
71
|
+
import entry66 from "./catalog/mongodb.json" with { type: "json" };
|
|
72
|
+
import entry67 from "./catalog/neon.json" with { type: "json" };
|
|
73
|
+
import entry68 from "./catalog/obsidian.json" with { type: "json" };
|
|
74
|
+
import entry69 from "./catalog/paypal.json" with { type: "json" };
|
|
75
|
+
import entry70 from "./catalog/playwright.json" with { type: "json" };
|
|
76
|
+
import entry71 from "./catalog/redis.json" with { type: "json" };
|
|
77
|
+
import entry72 from "./catalog/resend.json" with { type: "json" };
|
|
78
|
+
import entry73 from "./catalog/sequential-thinking.json" with { type: "json" };
|
|
79
|
+
import entry74 from "./catalog/superhuman-mail.json" with { type: "json" };
|
|
80
|
+
import entry75 from "./catalog/time.json" with { type: "json" };
|
|
80
81
|
|
|
81
82
|
export const INTEGRATION_CATALOG_ENTRIES = [
|
|
82
83
|
entry0,
|
|
@@ -154,4 +155,5 @@ export const INTEGRATION_CATALOG_ENTRIES = [
|
|
|
154
155
|
entry72,
|
|
155
156
|
entry73,
|
|
156
157
|
entry74,
|
|
158
|
+
entry75,
|
|
157
159
|
];
|