@integrity-labs/agt-cli 0.28.196 → 0.28.197

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.
@@ -58,6 +58,624 @@ function resolveAvatarEnvUrl(raw) {
58
58
  return { url: trimmed };
59
59
  }
60
60
 
61
+ // ../../packages/core/dist/integrations/registry.js
62
+ var INTEGRATION_REGISTRY = [
63
+ {
64
+ id: "linear",
65
+ name: "Linear",
66
+ category: "project-management",
67
+ description: "Issue tracking and project management",
68
+ supported_auth_types: ["api_key", "oauth2"],
69
+ capabilities: [
70
+ { id: "linear:read-issues", name: "Read Issues", description: "View issues, projects, and teams", access: "read" },
71
+ { id: "linear:create-issue", name: "Create Issues", description: "Create and update issues", access: "write" },
72
+ { id: "linear:manage-projects", name: "Manage Projects", description: "Create/archive projects and manage team settings", access: "admin" }
73
+ ],
74
+ cli_tool: {
75
+ package: "@schpet/linear-cli",
76
+ binary: "linear",
77
+ env_key: "LINEAR_API_KEY",
78
+ skill_id: "linear-cli",
79
+ extra_env: { LINEAR_ISSUE_SORT: "priority" },
80
+ installer: "npm"
81
+ }
82
+ },
83
+ {
84
+ id: "github",
85
+ name: "GitHub",
86
+ category: "code",
87
+ description: "Source code hosting, pull requests, and CI/CD",
88
+ supported_auth_types: ["api_key", "oauth2"],
89
+ // ENG-7015: customer-installable native — OAuth-first in the connect UI.
90
+ installable: { category: "Code", authTypes: ["oauth2", "api_key"] },
91
+ capabilities: [
92
+ { id: "github:read-repos", name: "Read Repositories", description: "View repos, issues, and PRs", access: "read" },
93
+ { id: "github:write-code", name: "Write Code", description: "Push commits and create PRs", access: "write" },
94
+ { id: "github:manage-repos", name: "Manage Repositories", description: "Create/delete repos and manage settings", access: "admin" }
95
+ ],
96
+ cli_tool: {
97
+ package: "gh",
98
+ binary: "gh",
99
+ env_key: "GITHUB_TOKEN",
100
+ skill_id: "gh-cli",
101
+ // ENG-6206: `brew` never installs on the Linux fleet (root-on-AL2023,
102
+ // no Homebrew) — gh was permanently missing. Use an OS-detecting script
103
+ // that installs from GitHub's official repos: dnf (AL2023 / RHEL),
104
+ // apt (Debian / Ubuntu), and brew (macOS hosts). The catalog is the
105
+ // trust boundary — this string is source-controlled, never runtime data.
106
+ installer: "script",
107
+ script: 'if command -v dnf >/dev/null 2>&1; then curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo -o /etc/yum.repos.d/gh-cli.repo && dnf install -y gh; elif command -v apt-get >/dev/null 2>&1; then curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg -o /usr/share/keyrings/githubcli-archive-keyring.gpg && chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" > /etc/apt/sources.list.d/github-cli.list && apt-get update && apt-get install -y gh; elif command -v brew >/dev/null 2>&1; then brew install gh; else echo "gh: no supported installer (need dnf, apt-get, or brew)" >&2; exit 1; fi'
108
+ }
109
+ },
110
+ {
111
+ id: "google-workspace",
112
+ name: "Google Workspace",
113
+ category: "workspace-productivity",
114
+ description: "Gmail, Calendar, Drive, Sheets, Docs, and Chat",
115
+ supported_auth_types: ["oauth2"],
116
+ capabilities: [
117
+ { id: "gws:read-email", name: "Read Email", description: "Read Gmail messages, threads, and labels", access: "read" },
118
+ { id: "gws:send-email", name: "Send Email", description: "Send, reply, and forward emails", access: "write" },
119
+ { id: "gws:read-calendar", name: "Read Calendar", description: "View events and agendas", access: "read" },
120
+ { id: "gws:manage-calendar", name: "Manage Calendar", description: "Create, update, and delete events", access: "write" },
121
+ { id: "gws:read-drive", name: "Read Drive", description: "List and download files", access: "read" },
122
+ { id: "gws:write-drive", name: "Write Drive", description: "Upload, create, and share files", access: "write" },
123
+ { id: "gws:read-sheets", name: "Read Sheets", description: "Read spreadsheet values", access: "read" },
124
+ { id: "gws:write-sheets", name: "Write Sheets", description: "Append and update spreadsheet data", access: "write" },
125
+ { id: "gws:read-docs", name: "Read Docs", description: "Read document content", access: "read" },
126
+ { id: "gws:write-docs", name: "Write Docs", description: "Create and append to documents", access: "write" },
127
+ { id: "gws:chat", name: "Chat", description: "Send messages to Google Chat spaces", access: "write" }
128
+ ],
129
+ cli_tool: {
130
+ package: "@googleworkspace/cli",
131
+ binary: "gws",
132
+ env_key: "GOOGLE_WORKSPACE_CLI_TOKEN",
133
+ skill_id: "gws-cli",
134
+ installer: "npm"
135
+ }
136
+ },
137
+ {
138
+ id: "gcloud",
139
+ name: "Google Cloud SDK",
140
+ category: "infrastructure",
141
+ description: "Google Cloud Platform CLI \u2014 manage Compute Engine, Cloud Storage, IAM, Cloud Run, Cloud SQL, BigQuery, and Pub/Sub from a single binary",
142
+ supported_auth_types: ["oauth2", "managed"],
143
+ capabilities: [
144
+ { id: "gcloud:read", name: "Read GCP Resources", description: "List and describe projects, instances, buckets, IAM, and service configs", access: "read" },
145
+ { id: "gcloud:write", name: "Write GCP Resources", description: "Create and update GCP resources (compute, storage, IAM, run, etc.)", access: "write" },
146
+ { id: "gcloud:admin", name: "Admin GCP Resources", description: "Destructive operations: delete projects, IAM bindings, instances. Restrict with a guardrail that blocks destructive gcloud/gsutil/bq verbs.", access: "admin" }
147
+ ],
148
+ cli_tool: {
149
+ package: "google-cloud-sdk",
150
+ binary: "gcloud",
151
+ env_key: "GOOGLE_APPLICATION_CREDENTIALS",
152
+ // gcloud ships as a homebrew cask on macOS (`brew install --cask google-cloud-sdk`)
153
+ // and via curl-installed tarball elsewhere. Neither matches the simple `brew install
154
+ // <package>` or `npm install -g <package>` shape, so leave install to the operator.
155
+ installer: "manual"
156
+ },
157
+ docs_url: "https://cloud.google.com/sdk"
158
+ },
159
+ {
160
+ id: "xero",
161
+ name: "Xero",
162
+ category: "accounting",
163
+ description: "Cloud accounting \u2014 financial reports, transactions, and account balances",
164
+ supported_auth_types: ["oauth2"],
165
+ // ENG-7015: customer-installable native.
166
+ installable: { category: "Accounting", authTypes: ["oauth2"] },
167
+ capabilities: [
168
+ { id: "xero:read-reports", name: "Read Reports", description: "Pull P&L, balance sheet, and trial balance reports", access: "read" },
169
+ { id: "xero:read-accounts", name: "Read Accounts", description: "View chart of accounts and account balances", access: "read" },
170
+ { id: "xero:read-transactions", name: "Read Transactions", description: "View bank transactions, invoices, and journal entries", access: "read" },
171
+ { id: "xero:read-contacts", name: "Read Contacts", description: "View customers, suppliers, and contact groups", access: "read" },
172
+ { id: "xero:manage-settings", name: "Manage Settings", description: "Manage org settings and chart of accounts", access: "admin" }
173
+ ]
174
+ },
175
+ {
176
+ id: "granola",
177
+ name: "Granola",
178
+ category: "knowledge",
179
+ description: "Meeting notes search \u2014 query transcripts, summaries, and folders from Granola",
180
+ // Granola uses a remote streamable-HTTP MCP with PKCE + Dynamic Client
181
+ // Registration. End-user OAuth is brokered by the webapp (ENG-4693)
182
+ // through the shared /integrations/oauth/authorize → /callback path
183
+ // (ENG-4694), and the access_token is injected into .mcp.json via the
184
+ // generic bearer-header path. No host-side action required from the
185
+ // operator beyond running the one-time DCR registration script at
186
+ // deploy time.
187
+ supported_auth_types: ["oauth2"],
188
+ capabilities: [
189
+ { id: "granola:search-meetings", name: "Search Meetings", description: "Browse meetings, search content, and chat with notes (query_granola_meetings, list_meetings, get_meetings)", access: "read" },
190
+ { id: "granola:read-transcripts", name: "Read Transcripts", description: "Access raw meeting transcripts (paid plans only \u2014 get_meeting_transcript)", access: "read" },
191
+ { id: "granola:list-folders", name: "List Folders", description: "View accessible meeting folders (paid plans only \u2014 list_meeting_folders)", access: "read" }
192
+ ],
193
+ docs_url: "https://docs.granola.ai/docs/api/mcp",
194
+ beta: true
195
+ },
196
+ {
197
+ id: "brand-ninja",
198
+ name: "Brand Ninja",
199
+ category: "social",
200
+ description: "Brand-aligned content generation: submit async content requests, track them, and discover publishing channels. Wired as the hosted Brand Ninja External-Content MCP at https://ext-api.app.brandninja.ai/v1/mcp.",
201
+ // ENG-6820: same remote streamable-HTTP MCP + OAuth pattern as Granola.
202
+ // Brand Ninja's server implements the full MCP discovery chain (RFC
203
+ // 9728/8414/7591); auth is OAuth 2.0 authorization-code with PKCE (S256)
204
+ // and a public client registered via one-time Dynamic Client Registration
205
+ // (scripts/dcr-register.ts against https://ext-api.app.brandninja.ai/v1/oauth/register
206
+ // → OAUTH_BRAND_NINJA_CLIENT_ID). End-user consent is brokered by the
207
+ // webapp through the shared /integrations/oauth/authorize → /callback path,
208
+ // and the access_token is injected into .mcp.json via the generic
209
+ // bearer-header path (OAUTH_PROVIDERS.brand-ninja.mcpUrl). No host-side
210
+ // action beyond the deploy-time DCR registration.
211
+ supported_auth_types: ["oauth2"],
212
+ capabilities: [
213
+ { id: "brand-ninja:generate-content", name: "Generate Content", description: "Submit async brand-aligned content-generation requests and poll their status (submit_content_request, get_content_status, list_content_requests)", access: "write" },
214
+ { id: "brand-ninja:list-channels", name: "List Channels", description: "Discover the publishing channels available to the account, metadata only (list_channels)", access: "read" },
215
+ { id: "brand-ninja:read-credentials", name: "Read Credentials", description: "Read-only External-API credential metadata, secrets stripped. Requires the elevated external-api/admin scope (list_credentials)", access: "admin" }
216
+ ],
217
+ docs_url: "https://ext-api.app.brandninja.ai/v1/mcp",
218
+ beta: true
219
+ },
220
+ {
221
+ id: "kajabi",
222
+ name: "Kajabi",
223
+ category: "crm",
224
+ description: "Run a Kajabi creator business from chat: read contacts, products, offers, and analytics, manage contact tags & segments, and draft email broadcasts & sequences.",
225
+ // Same remote streamable-HTTP MCP + OAuth pattern as Granola/Brand Ninja.
226
+ // Kajabi's Doorkeeper AS implements the MCP discovery chain (RFC
227
+ // 9728/8414/7591); auth is OAuth 2.0 authorization-code with PKCE (S256)
228
+ // and a public client registered via one-time Dynamic Client Registration
229
+ // (scripts/dcr-register.ts against https://mcp.kajabi.com/mcp/oauth/register
230
+ // → OAUTH_KAJABI_CLIENT_ID; register with --scope 'read write:contacts
231
+ // write:emails' since Doorkeeper caps a dynamic client to its registered
232
+ // scopes). End-user consent is brokered by the webapp through the shared
233
+ // /integrations/oauth/authorize → /callback path, and the access_token is
234
+ // injected into .mcp.json via the generic bearer-header path
235
+ // (OAUTH_PROVIDERS.kajabi.mcpUrl). Every Kajabi tool is site-scoped — agents
236
+ // call list_sites/select_site first. No host-side action beyond the
237
+ // deploy-time DCR registration.
238
+ supported_auth_types: ["oauth2"],
239
+ capabilities: [
240
+ { id: "kajabi:read", name: "Read & Discover", description: "List sites and read contacts, products, offers, purchases, and revenue/contacts analytics (list_sites, select_site, search_contacts, get_contact, list_offers, get_offer, search_products, get_revenue_analytics, \u2026)", access: "read" },
241
+ { id: "kajabi:contacts", name: "Manage Contacts", description: "Create and apply contact tags, and create/update saved contact segments (create_tag, tag_contact, untag_contact, create_segment, update_segment)", access: "write" },
242
+ { id: "kajabi:emails", name: "Manage Emails", description: "Read and draft email broadcasts and sequences \u2014 drafts only, sending stays a human action in Kajabi (create_broadcast, create_sequence, list_broadcasts, get_sequence)", access: "write" }
243
+ ],
244
+ docs_url: "https://help.kajabi.com/articles/api-integrations/connect-kajabi-to-claude-or-chatgpt",
245
+ beta: true
246
+ },
247
+ {
248
+ id: "anchor-browser",
249
+ name: "Anchor Browser",
250
+ category: "workspace-productivity",
251
+ description: "Cloud browser for agents \u2014 drive any website that lacks an API (LinkedIn, Sales Navigator, supplier portals) via a hosted, stealth Chromium with persistent-login profiles. Wired as Anchor's HOSTED streamable-HTTP MCP at https://api.anchorbrowser.io/mcp.",
252
+ // ENG-5855: api-key header auth (NOT OAuth, NOT a local stdio package).
253
+ // The manager writes ANCHOR_BROWSER_API_KEY to .env.integrations from the
254
+ // stored api_key credential; the hosted MCP authenticates on the
255
+ // `anchor-api-key` header. The `anchor-session-id` header binds an
256
+ // authenticated profile session — its value is minted per-session by the
257
+ // manager (ENG-5857); until then `envDefaults` seeds it empty so
258
+ // stateless browsing works and no literal `${...}` placeholder ships.
259
+ // Tool surface (25 `anchor_*` tools) is the hosted MCP's, validated in
260
+ // the ENG-5854 spike (docs/spikes/eng-5854-anchor-browser-persistent-login.md).
261
+ supported_auth_types: ["api_key"],
262
+ capabilities: [
263
+ { id: "anchor-browser:browse", name: "Browse & Read", description: "Navigate and read pages \u2014 snapshot, screenshot, page HTML, tabs, console, network requests, wait (anchor_navigate, anchor_snapshot, anchor_take_screenshot, anchor_get_body_html, anchor_tab_list, anchor_console_messages, anchor_network_requests, anchor_wait_for, anchor_navigate_back/forward)", access: "read" },
264
+ { id: "anchor-browser:interact", name: "Interact", description: "Act on pages \u2014 click, type, hover, drag, select options, press keys, handle dialogs, upload files, resize, manage tabs (anchor_click, anchor_type, anchor_hover, anchor_drag, anchor_select_option, anchor_press_key, anchor_handle_dialog, anchor_file_upload, anchor_resize, anchor_tab_new/select/close, anchor_close)", access: "write" },
265
+ { id: "anchor-browser:export", name: "Export & Codegen", description: "Save the current page as PDF and generate Playwright code for a scenario (anchor_pdf_save, anchor_generate_playwright_code)", access: "write" }
266
+ ],
267
+ docs_url: "https://docs.anchorbrowser.io/introduction",
268
+ beta: true,
269
+ remoteMcp: {
270
+ type: "http",
271
+ url: "https://api.anchorbrowser.io/mcp",
272
+ // ENG-6993 / ADR-0033: the api-key credential header now goes through the
273
+ // structured `auth` field — the env var (ANCHOR_BROWSER_API_KEY) is
274
+ // DERIVED from this integration's definition_id + credential_ref, so it
275
+ // is scoped to Anchor and can't reference another integration's secret
276
+ // (C1). Renders byte-identically to the previous verbatim header.
277
+ auth: { scheme: "header", header_name: "anchor-api-key", credential_ref: "api_key" },
278
+ // The dynamic session header stays here (not a credential — minted per
279
+ // session by ENG-5857; empty default below until then).
280
+ headers: {
281
+ "anchor-session-id": "${ANCHOR_BROWSER_SESSION_ID}"
282
+ },
283
+ // ENG-5857 mints the real session id; default empty so the header
284
+ // resolves cleanly (no profile bound → ephemeral session) until then.
285
+ envDefaults: { ANCHOR_BROWSER_SESSION_ID: "" }
286
+ }
287
+ },
288
+ {
289
+ id: "deck",
290
+ name: "Deck",
291
+ category: "workspace-productivity",
292
+ description: "Computer-use agents that operate any software through its real interface (no API required) and return schema-validated results. A higher-level alternative to Anchor Browser: Deck owns the auth lifecycle (encrypted credential vault, login, MFA, CAPTCHA) and provisions isolated desktop sessions on demand. Augmented Team manages Deck access for you and gives each agent its own isolated Deck workspace, so there is no credential to enter.",
293
+ // Deck is REST-only (base https://api.deck.co/v2, Bearer `sk_live_` account
294
+ // key) — it ships NO MCP server, so unlike anchor-browser there is no
295
+ // `remoteMcp`/`nativeMcp` drop-in; the agent-facing tools are brokered
296
+ // server-side (deck-broker.ts). Deck is the first PREMIUM integration:
297
+ // Augmented owns ONE Deck account that every customer agent's runs bill back
298
+ // to (per-org charging is tracked in ENG-6920, not yet live), so the account
299
+ // key is a single platform-held secret (`DECK_ACCOUNT_KEY`), NOT a per-agent
300
+ // credential. Auth type is therefore `none` — customers never enter a key.
301
+ // Per-agent isolation is modelled on Deck's first-class resources: that one
302
+ // key provisions one Deck agent (`agt_`) + vault credential (`cred_`) per
303
+ // Augmented agent via POST /:id/provision-deck; the ids land in
304
+ // `agent_integrations.config` (deck_agent_id / deck_credential_id), so
305
+ // revocation + audit happen at the per-agent Deck-resource level without a
306
+ // distinct API key per agent (Deck exposes no key-minting admin API).
307
+ supported_auth_types: ["none"],
308
+ capabilities: [
309
+ { id: "deck:provision", name: "Provision Agent Access", description: "Provision a per-agent Deck agent and vault credential under the account key (create_agent, create_credential)", access: "admin" },
310
+ { id: "deck:run", name: "Run Tasks", description: "Submit tasks to the agent and read schema-validated structured results (run_task, get_task_run)", access: "write" },
311
+ { id: "deck:observe", name: "Observe Sessions", description: "Read isolated session state, screenshots, and agent-reasoning artifacts (get_session)", access: "read" }
312
+ ],
313
+ docs_url: "https://docs.deck.co/",
314
+ beta: true,
315
+ // ENG-6920: Deck is the first PREMIUM integration. Unlike the customer-auth
316
+ // integrations, every Deck run bills back to Augmented's single account
317
+ // key, and Deck is usage-priced — so it is gated on a per-org opt-in and
318
+ // metered. ENG-7032: `meters` declares the billable operation (run_task,
319
+ // billed per run); the priced rate card (integration_rate_cards) holds the
320
+ // amount ($1.00 USD / A$1.50 per run, the per-run v1 decision). The
321
+ // event_type must match what deck-broker writes to integration_usage_events.
322
+ premium: {
323
+ pricing: "usage",
324
+ note: "Billed per Deck task run.",
325
+ meters: [{ event_type: "run_task", unit: "run" }]
326
+ }
327
+ },
328
+ {
329
+ id: "elevenlabs",
330
+ name: "ElevenLabs",
331
+ category: "media",
332
+ description: "Speech-to-text for inbound voice notes. When a teammate sends an agent a voice message (Slack, Telegram, etc.), the agent uploads the audio and gets back an accurate transcript via ElevenLabs Scribe, so a voice note is no longer a black box. Augmented Team manages ElevenLabs access for you - there is no key to enter.",
333
+ // ElevenLabs is REST-only for our use (POST /v1/speech-to-text, `xi-api-key`
334
+ // header, NOT Bearer) — it ships no MCP server, so the agent-facing tools are
335
+ // brokered server-side (scribe-broker.ts). It is a PREMIUM integration on the
336
+ // Deck model (ADR-0031, epic ENG-6920): Augmented owns ONE ElevenLabs account
337
+ // that every customer agent's transcriptions bill back to, so the account key
338
+ // is a single platform-held secret (`ELEVENLABS_ACCOUNT_KEY`), NOT a per-agent
339
+ // credential. Auth type is therefore `none` — customers never enter a key.
340
+ // Usage is metered in audio-seconds at the broker chokepoint and gated on a
341
+ // per-org opt-in + monthly cap. (TTS for Augmented Live voiceover is a
342
+ // separate surface — ENG-7048 — that reuses the same account key.)
343
+ supported_auth_types: ["none"],
344
+ capabilities: [
345
+ { id: "elevenlabs:transcribe", name: "Transcribe Voice Notes", description: "Upload an inbound audio file and transcribe it to text via ElevenLabs Scribe (scribe_create_upload, scribe_transcribe)", access: "write" },
346
+ // ENG-7048: text-to-speech voiceover for Augmented Live. Surfaced as the
347
+ // agt_live.generate_voiceover tool (not a standalone scribe_* tool); shares
348
+ // this one platform account key + the same per-org budget.
349
+ { id: "elevenlabs:tts", name: "Generate Voiceover", description: "Synthesize a spoken-voice MP3 voiceover from text for an Augmented Live page via ElevenLabs text-to-speech (agt_live.generate_voiceover)", access: "write" },
350
+ // ENG-7089: instrumental music generation for Augmented Live. Surfaced as the
351
+ // agt_live.generate_music tool; shares this one platform account key + the
352
+ // same per-org budget.
353
+ { id: "elevenlabs:music", name: "Generate Music", description: "Compose an instrumental MP3 music track from a text prompt for an Augmented Live page via ElevenLabs Music (agt_live.generate_music)", access: "write" }
354
+ ],
355
+ // Capabilities index — covers speech-to-text, text-to-speech, and music, since
356
+ // the integration now advertises elevenlabs:transcribe, elevenlabs:tts, and
357
+ // elevenlabs:music.
358
+ docs_url: "https://elevenlabs.io/docs/capabilities",
359
+ beta: true,
360
+ // ENG-7005 / ENG-7048: premium (billable). Both surfaces bill back to
361
+ // Augmented's single account key and are usage-priced, so the integration is
362
+ // gated on a per-org opt-in and metered. The two surfaces share the one
363
+ // `elevenlabs` definition (and so the one per-org monthly budget). Pricing
364
+ // amounts live in integration_rate_cards; this only declares the model.
365
+ premium: {
366
+ pricing: "usage",
367
+ note: "Billed on audio transcribed (per second), voiceover synthesized (per character), and music generated (per second).",
368
+ // ENG-7032: each surface meters its own event in its own physical unit; the
369
+ // matching integration_rate_cards rows price them. Until a rate is seeded,
370
+ // that event prices at 0.
371
+ meters: [
372
+ { event_type: "transcribe", unit: "audio_second" },
373
+ { event_type: "tts", unit: "character" },
374
+ { event_type: "music", unit: "second" }
375
+ ]
376
+ }
377
+ },
378
+ {
379
+ id: "postiz",
380
+ name: "Postiz",
381
+ category: "social",
382
+ description: "Open-source social-media scheduling and publishing \u2014 schedule posts, list connected platforms, and upload media. Self-hosted-aware (defaults to Postiz Cloud at https://api.postiz.com).",
383
+ // Postiz also supports OAuth2 ('pos_'-prefixed tokens) but the public docs
384
+ // for the authorize/token URL shape are sparse — wired API-key-first; the
385
+ // OAuth path lands as a follow-up once we've confirmed the flow against
386
+ // a live instance.
387
+ supported_auth_types: ["api_key"],
388
+ capabilities: [
389
+ { id: "postiz:list", name: "List Posts & Platforms", description: "List connected social platforms (GET /integrations) and previously scheduled posts", access: "read" },
390
+ { id: "postiz:publish", name: "Publish Posts", description: "Create and schedule posts across the connected platforms (POST /posts)", access: "write" },
391
+ { id: "postiz:upload", name: "Upload Media", description: "Upload images and video for use in posts (POST /upload)", access: "write" }
392
+ ],
393
+ docs_url: "https://docs.postiz.com/public-api/introduction",
394
+ // Beta until we've verified the npx-based community MCP server
395
+ // (antoniolg/postiz-mcp) end-to-end against a real Postiz instance.
396
+ // The 30-req/hr public API rate limit also wants real-world
397
+ // validation before we drop the beta flag.
398
+ beta: true
399
+ },
400
+ {
401
+ id: "higgsfield",
402
+ name: "Higgsfield",
403
+ category: "media",
404
+ description: "Generative media \u2014 image (Soul, Nano Banana) and video (Kling, Veo, Seedance) generation, character training (Soul ID), and generation history. Remote streamable-HTTP MCP at https://mcp.higgsfield.ai/mcp.",
405
+ // Same OAuth pattern as Granola: Claude Code brokers the browser
406
+ // sign-in at runtime; nothing for the manager API to provision.
407
+ supported_auth_types: ["none"],
408
+ capabilities: [
409
+ { id: "higgsfield:generate-image", name: "Generate Image", description: "Create images via Soul, Nano Banana, and other image models \u2014 up to 4K. Includes Soul ID character consistency.", access: "write" },
410
+ { id: "higgsfield:generate-video", name: "Generate Video", description: "Create videos via Kling, Veo, Seedance \u2014 up to 15s. Includes UGC, product review, TV spot presets.", access: "write" },
411
+ { id: "higgsfield:read-history", name: "Read History", description: "Browse generation history for iterative workflows; reuse prior outputs as references.", access: "read" }
412
+ ],
413
+ docs_url: "https://higgsfield.ai/mcp",
414
+ beta: true
415
+ },
416
+ {
417
+ id: "qmd",
418
+ name: "QMD Memory Search",
419
+ category: "knowledge",
420
+ description: "Local-first memory search sidecar \u2014 BM25 + vector search + reranking over agent memory files",
421
+ supported_auth_types: ["none"],
422
+ // ENG-7015: customer-installable native (agent-scoped only — the picker
423
+ // hides it for org/team scope; that gating stays in the dialog).
424
+ installable: { category: "Knowledge", authTypes: ["none"] },
425
+ cli_tool: {
426
+ package: "@tobilu/qmd",
427
+ binary: "qmd",
428
+ env_key: "",
429
+ installer: "npm"
430
+ },
431
+ capabilities: [
432
+ { id: "qmd:search", name: "Search Memory", description: "Semantic + keyword search over indexed memory files", access: "read" },
433
+ { id: "qmd:get", name: "Get Memory", description: "Read memory files by path and line range", access: "read" }
434
+ ],
435
+ beta: true,
436
+ // ENG-5815: migrated from buildMcpJson's hardcoded if-block. qmd is
437
+ // the simplest of the four pre-data-driven entries — no env, no
438
+ // conditional logic, just `qmd mcp`. The byte-identical render is
439
+ // pinned by claudecode-qmd-data-driven.test.ts.
440
+ nativeMcp: {
441
+ command: "qmd",
442
+ args: ["mcp"]
443
+ }
444
+ },
445
+ {
446
+ id: "v0",
447
+ name: "v0 by Vercel",
448
+ category: "ui-generation",
449
+ description: "Programmatic UI generation \u2014 generate React + Tailwind + shadcn/ui components and full apps from natural language prompts",
450
+ supported_auth_types: ["api_key"],
451
+ beta: true,
452
+ capabilities: [
453
+ {
454
+ id: "v0:generate-ui",
455
+ name: "Generate UI",
456
+ description: "Create React components and full apps from a natural language prompt",
457
+ access: "write",
458
+ required_scopes: ["chats:create"]
459
+ },
460
+ {
461
+ id: "v0:iterate-ui",
462
+ name: "Iterate UI",
463
+ description: "Send follow-up prompts to refine a previously generated component",
464
+ access: "write",
465
+ required_scopes: ["chats:send"]
466
+ },
467
+ {
468
+ id: "v0:read-chats",
469
+ name: "Read Chats",
470
+ description: "Retrieve chat history, generated files, and demo URLs",
471
+ access: "read",
472
+ required_scopes: ["chats:read"]
473
+ },
474
+ {
475
+ id: "v0:manage-projects",
476
+ name: "Manage Projects",
477
+ description: "Create and manage v0 project containers for versioned generation history",
478
+ access: "write",
479
+ required_scopes: ["projects:write"]
480
+ },
481
+ {
482
+ id: "v0:deploy",
483
+ name: "Deploy to Vercel",
484
+ description: "Deploy a generated version to Vercel and receive a live URL",
485
+ access: "write",
486
+ required_scopes: ["deployments:create"]
487
+ }
488
+ ],
489
+ docs_url: "https://v0.dev/docs/api/platform/overview"
490
+ },
491
+ {
492
+ id: "pika",
493
+ name: "Pika",
494
+ category: "media",
495
+ description: "AI video meeting agent \u2014 join Google Meet and Zoom calls with a custom avatar and cloned voice via PikaStreaming",
496
+ supported_auth_types: ["api_key"],
497
+ // ENG-7015: customer-installable native — the one straggler not in the DB
498
+ // catalog, now carried by this single shared source.
499
+ installable: { category: "Media", authTypes: ["api_key"] },
500
+ capabilities: [
501
+ { id: "pika:join-meeting", name: "Join Meeting", description: "Join a video meeting as an AI participant with avatar and voice", access: "write" },
502
+ { id: "pika:leave-meeting", name: "Leave Meeting", description: "Leave an active video meeting session", access: "write" },
503
+ { id: "pika:generate-avatar", name: "Generate Avatar", description: "Generate an AI avatar image for video calls", access: "write" },
504
+ { id: "pika:clone-voice", name: "Clone Voice", description: "Clone a voice from an audio recording", access: "write" }
505
+ ],
506
+ cli_tool: {
507
+ package: "pika-skills",
508
+ binary: "python3",
509
+ env_key: "PIKA_DEV_KEY",
510
+ skill_id: "pikastream-video-meeting",
511
+ // python3 is part of the host bootstrap baseline — skills are fetched
512
+ // separately. Don't try to auto-install python via npm/brew.
513
+ installer: "manual"
514
+ },
515
+ docs_url: "https://github.com/Pika-Labs/Pika-Skills"
516
+ },
517
+ {
518
+ id: "claude-code",
519
+ name: "Claude Code",
520
+ category: "code",
521
+ description: "Claude Code AI agent runtime \u2014 code editing, task execution, file management, and development workflows",
522
+ supported_auth_types: ["api_key", "none"],
523
+ capabilities: [
524
+ { id: "claude-code:edit-code", name: "Edit Code", description: "Read, write, and edit source files", access: "write" },
525
+ { id: "claude-code:run-tasks", name: "Run Tasks", description: "Execute bash commands and development tasks", access: "write" },
526
+ { id: "claude-code:search", name: "Search Code", description: "Search files and grep codebase", access: "read" },
527
+ { id: "claude-code:git", name: "Git Operations", description: "Commit, branch, push, and manage version control", access: "write" }
528
+ ],
529
+ cli_tool: {
530
+ package: "@anthropic-ai/claude-code",
531
+ binary: "claude",
532
+ env_key: "ANTHROPIC_API_KEY",
533
+ // Claude Code is installed by the host bootstrap / operator setup —
534
+ // don't attempt a second install from the manager poll.
535
+ installer: "manual"
536
+ },
537
+ docs_url: "https://docs.anthropic.com/en/docs/claude-code"
538
+ },
539
+ {
540
+ id: "xurl",
541
+ name: "xurl (X API)",
542
+ category: "social",
543
+ description: "Official X (Twitter) API CLI \u2014 a curl-like tool for X's REST and streaming endpoints with OAuth 2.0 PKCE, OAuth 1.0a, and bearer-token auth",
544
+ supported_auth_types: ["api_key"],
545
+ // ENG-7015: customer-installable native. The connect UI also offers a
546
+ // keyless "none" option (run against the app's bearer token) that the
547
+ // runtime capability set above does not enumerate.
548
+ installable: { category: "Social", authTypes: ["none", "api_key"] },
549
+ capabilities: [
550
+ { id: "xurl:read", name: "Read X API", description: "Call GET endpoints (users, tweets, timelines, search)", access: "read" },
551
+ { id: "xurl:write", name: "Write X API", description: "Post tweets, reply, like, and retweet", access: "write" },
552
+ { id: "xurl:stream", name: "Stream X API", description: "Consume filtered and sampled stream endpoints", access: "read" },
553
+ { id: "xurl:media", name: "Upload Media", description: "Chunked upload of images and video to the X media endpoints", access: "write" }
554
+ ],
555
+ cli_tool: {
556
+ package: "@xdevplatform/xurl",
557
+ binary: "xurl",
558
+ env_key: "X_BEARER_TOKEN",
559
+ skill_id: "xurl-cli",
560
+ // xurl is a Go binary distributed through homebrew tap; operator
561
+ // installs via `brew install xdevplatform/tap/xurl`. Mark manual
562
+ // for now — add a dedicated `tap` installer in a follow-up if more
563
+ // brew-tap tools land.
564
+ installer: "manual"
565
+ },
566
+ docs_url: "https://github.com/xdevplatform/xurl"
567
+ },
568
+ {
569
+ id: "coderabbit",
570
+ name: "CodeRabbit",
571
+ category: "code",
572
+ description: "AI-powered code review CLI for local and pre-push review runs",
573
+ supported_auth_types: ["none"],
574
+ capabilities: [
575
+ { id: "coderabbit:review", name: "Review Changes", description: "Run a local CodeRabbit review over staged or branch changes", access: "read" }
576
+ ],
577
+ cli_tool: {
578
+ package: "",
579
+ binary: "coderabbit",
580
+ env_key: "",
581
+ installer: "script",
582
+ script: "curl -fsSL https://cli.coderabbit.ai/install.sh | sh"
583
+ },
584
+ docs_url: "https://www.coderabbit.ai/cli"
585
+ },
586
+ {
587
+ id: "aws",
588
+ name: "AWS",
589
+ category: "infrastructure",
590
+ description: "Amazon Web Services \u2014 query AWS APIs (EC2, S3, IAM, Lambda, etc.) via AWS Labs' official AWS API MCP server",
591
+ supported_auth_types: ["api_key", "managed", "none"],
592
+ capabilities: [
593
+ { id: "aws:read", name: "Read AWS Resources", description: "List and describe AWS resources across services (EC2, S3, IAM, Lambda, \u2026)", access: "read" },
594
+ { id: "aws:write", name: "Write AWS Resources", description: "Create and update AWS resources. Pair with an aws-no-destructive-ops guardrail.", access: "write" }
595
+ ],
596
+ docs_url: "https://github.com/awslabs/mcp/tree/main/src/aws-api-mcp-server",
597
+ beta: true,
598
+ // ENG-5815: first integration shipped purely via the data-driven
599
+ // path — buildMcpJson never grew an `aws` if-block. The AWS Labs
600
+ // AWS API MCP server runs through uvx (Python tooling), which the
601
+ // host bootstrap installs alongside python3. Credentials are
602
+ // resolved via the standard AWS_* env / shared credentials file
603
+ // chain on the host; the spec doesn't override them.
604
+ nativeMcp: {
605
+ command: "uvx",
606
+ args: ["awslabs.aws-api-mcp-server@latest"],
607
+ env: {
608
+ AWS_REGION: "{{empty_if_no_env.AWS_REGION}}",
609
+ AWS_PROFILE: "{{empty_if_no_env.AWS_PROFILE}}",
610
+ PATH: "{{process_env.PATH}}",
611
+ HOME: "{{process_env.HOME}}"
612
+ }
613
+ }
614
+ },
615
+ {
616
+ // ENG-6195: admin-only debugging surface for Integrity Labs STAFF agents.
617
+ // Provisions the @integrity-labs/augmented-admin-mcp stdio broker, which
618
+ // reads end-user agent diagnostics cross-org via /admin/debug/*. `beta` so
619
+ // it is visible/enable-able only by admin-email-domain users; the API
620
+ // double-gates every call on the caller's owning org `is_internal = true`.
621
+ // auth `none` — no end-user OAuth; the host JWT (org_id claim) is the
622
+ // credential. NOT a customer integration; do not promote to `published`.
623
+ id: "augmented-admin",
624
+ name: "Augmented Admin Debug",
625
+ category: "infrastructure",
626
+ description: "Integrity Labs staff-only: cross-org agent/host/integration/alert diagnostics for troubleshooting managed agents.",
627
+ supported_auth_types: ["none"],
628
+ beta: true,
629
+ capabilities: [
630
+ { id: "augmented-admin:read-diagnostics", name: "Read Diagnostics", description: "Cross-org read of agent, host, integration, and alert diagnostics (projection only \u2014 never credentials or transcripts).", access: "read" }
631
+ ]
632
+ },
633
+ {
634
+ // ENG-7023 (ADR-0031/0032): the per-org self-troubleshoot surface for the
635
+ // `system_support` concierge agent. Provisions the
636
+ // @integrity-labs/augmented-support-mcp stdio broker, which reads the
637
+ // agent's OWN org diagnostics and proposes self-remediation writes
638
+ // (create_agent) through the server-rendered HITL approval gate, all via
639
+ // /host/support/*. `beta` while the concierge rolls out gradually (ENG-6975);
640
+ // auth `none` - no end-user OAuth, the host JWT (org_id claim) is the
641
+ // credential and the org-lock. NOT a customer-selectable integration: it is
642
+ // attached automatically to system_support agents at provisioning.
643
+ id: "augmented-support",
644
+ name: "Augmented Support",
645
+ category: "infrastructure",
646
+ description: "Per-org self-troubleshoot concierge: reads your org's agents, hosts, integrations, alerts, flags, and audit log, files support/feature requests, and proposes new agents for human approval - all scoped to your own organization.",
647
+ supported_auth_types: ["none"],
648
+ beta: true,
649
+ capabilities: [
650
+ { id: "augmented-support:read-diagnostics", name: "Read Diagnostics", description: "Read your own org's agents, hosts, integrations, alerts, flags, and audit log (projection only - never credentials or transcripts).", access: "read" },
651
+ { id: "augmented-support:file-requests", name: "File Requests", description: "File bug / feature / integration requests to Augmented Team support.", access: "write" },
652
+ { id: "augmented-support:propose-writes", name: "Propose Self-Remediation", description: "Propose creating an agent in your own org; executed only after a human approves a server-rendered diff.", access: "write" }
653
+ ]
654
+ },
655
+ {
656
+ id: "custom",
657
+ name: "Custom Integration",
658
+ category: "custom",
659
+ description: "Connect to any service via API key or webhook",
660
+ supported_auth_types: ["api_key", "webhook", "none"],
661
+ capabilities: [
662
+ { id: "custom:api-access", name: "API Access", description: "Generic API access with configured credentials", access: "read" }
663
+ ]
664
+ }
665
+ ];
666
+ var integrationMap = new Map(INTEGRATION_REGISTRY.map((i) => [i.id, i]));
667
+ function getIntegration(id) {
668
+ return integrationMap.get(id);
669
+ }
670
+ var INSTALLABLE_NATIVE_INTEGRATIONS = INTEGRATION_REGISTRY.filter((d) => d.installable != null).map((d) => ({
671
+ id: d.id,
672
+ name: d.name,
673
+ category: d.installable.category,
674
+ authTypes: d.installable.authTypes,
675
+ ...d.beta ? { beta: true } : {}
676
+ }));
677
+ var INSTALLABLE_NATIVE_INTEGRATION_IDS = INSTALLABLE_NATIVE_INTEGRATIONS.map((i) => i.id);
678
+
61
679
  // ../../packages/core/dist/types/models.js
62
680
  function claudeModelAlias(primaryModel) {
63
681
  if (!primaryModel)
@@ -100,7 +718,7 @@ function classifyActor(lastActorId, selfAgentId) {
100
718
  return "unknown";
101
719
  }
102
720
 
103
- // ../../packages/core/dist/types/plugin.js
721
+ // ../../packages/core/dist/types/integration.js
104
722
  var HITL_TIER_ORDER = [
105
723
  "read",
106
724
  "write",
@@ -6534,6 +7152,8 @@ export {
6534
7152
  getFramework,
6535
7153
  MAX_AVATAR_ENV_URL_BYTES,
6536
7154
  resolveAvatarEnvUrl,
7155
+ INTEGRATION_REGISTRY,
7156
+ getIntegration,
6537
7157
  OAUTH_PROVIDERS,
6538
7158
  claudeModelAlias,
6539
7159
  isClaudeFastMode,
@@ -6606,4 +7226,4 @@ export {
6606
7226
  parseEnvIntegrations,
6607
7227
  probeMcpEnvSubstitution
6608
7228
  };
6609
- //# sourceMappingURL=chunk-C42HT3QT.js.map
7229
+ //# sourceMappingURL=chunk-CE6U2IAF.js.map