@jskit-ai/connectors-catalog 0.1.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.
- package/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
package/docs/ashby.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Ashby
|
|
2
|
+
|
|
3
|
+
Import `ashbyProvider` from `@jskit-ai/connectors-catalog/server/ashby`.
|
|
4
|
+
This adapter verifies an organization key by reading jobs, preserves explicit
|
|
5
|
+
cursor/incremental sync, and supports candidate/application hiring workflows.
|
|
6
|
+
|
|
7
|
+
## Provider setup
|
|
8
|
+
|
|
9
|
+
1. Sign into the intended Ashby organization as an administrator. Open
|
|
10
|
+
**Admin → Integrations → API Keys → + New**. Name the key, leave the
|
|
11
|
+
optional integration partner unset unless applicable, then **Create API Key**.
|
|
12
|
+
2. Enable **Jobs: Read** (`jobsRead`) for verification. Add `candidatesRead`
|
|
13
|
+
for candidate/application reads, `candidatesWrite` for edits and stage changes,
|
|
14
|
+
`interviewsRead` for plans/stages and `hiringProcessMetadataRead` for archive
|
|
15
|
+
reasons. Hover the module information icon to check its endpoint list. Leave
|
|
16
|
+
confidential jobs/private fields and other extra permissions off unless needed.
|
|
17
|
+
Choose **Save and Continue**. Copy the key before closing the wizard.
|
|
18
|
+
3. Copy the issued key into the backend environment as `ASHBY_API_KEY`.
|
|
19
|
+
In Vibe64, add Ashby and enter `env:ASHBY_API_KEY` in **API key reference**.
|
|
20
|
+
Save, choose **Set credential in Env** to enter the key, then **Connect account**
|
|
21
|
+
or **Verify again**. **Check connection** reads status only. CLI uses the same
|
|
22
|
+
file and `connectApiKey`. To revoke, open the key by name and choose **Disable**;
|
|
23
|
+
disconnecting locally does not disable it. For rotation, create a replacement,
|
|
24
|
+
update Env and verify before disabling the old key.
|
|
25
|
+
|
|
26
|
+
Ashby uses Basic authentication: key as username, empty password. Keys belong
|
|
27
|
+
on a server. This adapter sends `Accept: application/json; version=1`.
|
|
28
|
+
Missing credentials can return 401; invalid/deactivated keys and insufficient
|
|
29
|
+
permissions can both return 403.
|
|
30
|
+
[Authentication and permissions](https://developers.ashbyhq.com/reference/authentication),
|
|
31
|
+
[Key setup and disabling](https://docs.ashbyhq.com/how-do-i-generate-an-api-key).
|
|
32
|
+
|
|
33
|
+
## Configuration and library calls
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"schemaVersion": 1,
|
|
38
|
+
"registrations": {},
|
|
39
|
+
"integrations": {
|
|
40
|
+
"hiring": {
|
|
41
|
+
"provider": "ashby",
|
|
42
|
+
"displayName": "Hiring jobs",
|
|
43
|
+
"accountMode": "shared",
|
|
44
|
+
"scopes": [],
|
|
45
|
+
"authentication": { "method": "api-key", "secretRef": "env:ASHBY_API_KEY" }
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Use the [API-key composition pattern](../patterns/api-key-connection/PATTERN.md)
|
|
52
|
+
with `providers: [ashbyProvider]`, an authenticated application policy and the
|
|
53
|
+
file connection store. Portable configuration and durable runtime state remain
|
|
54
|
+
text files. The key is resolved from the environment for requests.
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
await connections.connectApiKey({ context, integrationId: "hiring" });
|
|
58
|
+
const page = await connections.invoke({
|
|
59
|
+
context, integrationId: "hiring", operation: "jobs.list",
|
|
60
|
+
input: { limit: 25 }
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`jobs.list` sends `POST /job.list`; this is a read despite the HTTP method.
|
|
65
|
+
The fragment accepts integer `limit` 1–100 (default 25) and optional opaque
|
|
66
|
+
`cursor` and `syncToken` strings, each up to 8192 characters. Positive page sizes
|
|
67
|
+
and token-length caps are local validation choices. It returns the original
|
|
68
|
+
`results`, `moreDataAvailable`, `nextCursor` and `syncToken` envelope.
|
|
69
|
+
Additional date/status filters and job writes are not implemented.
|
|
70
|
+
[Job listing](https://developers.ashbyhq.com/reference/joblist).
|
|
71
|
+
|
|
72
|
+
For a full scan, begin without a cursor or sync token. While
|
|
73
|
+
`moreDataAvailable` is true, explicitly request the next page with `nextCursor`.
|
|
74
|
+
Retain the final page's `syncToken` for a later incremental scan. During that
|
|
75
|
+
scan, send the same starting sync token alongside subsequent cursors; replace
|
|
76
|
+
the stored sync token only after the scan finishes. Ashby documents cursor
|
|
77
|
+
expiry after 14 days and may report errors in an HTTP-200 response.
|
|
78
|
+
[Pagination and incremental sync](https://developers.ashbyhq.com/docs/pagination-and-incremental-sync).
|
|
79
|
+
|
|
80
|
+
The application owns its synchronization checkpoint, scoped to the authorized
|
|
81
|
+
connection. This library does not silently reset it or traverse all pages.
|
|
82
|
+
`success: false` becomes a generic provider failure without exposing provider
|
|
83
|
+
error payloads. An expired cursor therefore needs explicit recovery by the
|
|
84
|
+
application. The common 403 classification is permission denied; it cannot
|
|
85
|
+
distinguish a deactivated key from missing permissions. Check the provider key
|
|
86
|
+
and reverify after correction. Disconnect removes local state; it does not
|
|
87
|
+
revoke the organization key.
|
|
88
|
+
|
|
89
|
+
## Automation and application ownership
|
|
90
|
+
|
|
91
|
+
An AI can write the configuration, environment reference, library wiring and
|
|
92
|
+
checkpoint logic. The reviewed API documents expose inspection of an existing
|
|
93
|
+
key, not a key-creation workflow. Initial organization access and key creation
|
|
94
|
+
remain administrator steps; do not invent an API for those steps.
|
|
95
|
+
[Current-key inspection](https://developers.ashbyhq.com/reference/apikeyinfo).
|
|
96
|
+
|
|
97
|
+
Each application uses an authorized key stored in its private Env. These keys
|
|
98
|
+
are not OAuth registrations and do not connect unrelated organizations.
|
|
99
|
+
Customer-owned data requires that customer's authorized key. The key guide documents a per-key request limit; it does not reserve independent
|
|
100
|
+
organization capacity or change licensed product access. Application owners
|
|
101
|
+
must arrange the capacity needed for their usage. No callback is used, so editor VM and deployed app
|
|
102
|
+
domains do not change this flow. A jobs result does not establish user login.
|
|
103
|
+
|
|
104
|
+
## Focused evidence
|
|
105
|
+
|
|
106
|
+
Simulated provider tests cover Basic headers, POST bodies, explicit paging,
|
|
107
|
+
empty results, invalid envelopes, HTTP-200 failures, input boundaries, real
|
|
108
|
+
temporary file-store restart, rotation, ownership and disconnect. Editor
|
|
109
|
+
automation verifies reference-only configuration and save/reload. Live provider
|
|
110
|
+
use, organization signup and sample-app generation are excluded.
|
|
111
|
+
|
|
112
|
+
## Recruiter workflow operations
|
|
113
|
+
|
|
114
|
+
All calls use the fixed `https://api.ashbyhq.com` origin, Basic key authentication
|
|
115
|
+
and POST JSON. Lists are reads despite POST. Responses retain Ashby's `success`
|
|
116
|
+
and `results` envelope; HTTP-200 `success: false` is a failure, not completion.
|
|
117
|
+
|
|
118
|
+
| Operation | Endpoint | Relevant inputs |
|
|
119
|
+
| --- | --- | --- |
|
|
120
|
+
| `jobs.get` | `job.info` | Job `id`. |
|
|
121
|
+
| `candidates.list` | `candidate.list` | `limit`, cursor, syncToken. |
|
|
122
|
+
| `candidates.get` | `candidate.info` | Candidate `id`. |
|
|
123
|
+
| `candidates.create` | `candidate.create` | Required `name`; optional email and phoneNumber. |
|
|
124
|
+
| `candidates.update` | `candidate.update` | `candidateId` and at least one name/email/phone change; notifications default off. |
|
|
125
|
+
| `applications.list` | `application.list` | Page inputs, optional `jobId` and Hired/Archived/Active/Lead status. |
|
|
126
|
+
| `applications.get` | `application.info` | `applicationId`. |
|
|
127
|
+
| `applications.create` | `application.create` | `candidateId`, `jobId`; optional interviewPlanId and interviewStageId. |
|
|
128
|
+
| `applications.changeStage` | `application.changeStage` | `applicationId`, `interviewStageId`; archiveReasonId for an Archived stage. |
|
|
129
|
+
| `interviewPlans.list` | `interviewPlan.list` | Page inputs, optional includeArchived (default false). |
|
|
130
|
+
| `interviewStages.list` | `interviewStage.list` | `interviewPlanId`. |
|
|
131
|
+
| `archiveReasons.list` | `archiveReason.list` | Optional includeArchived (default false). |
|
|
132
|
+
|
|
133
|
+
Use the same explicit cursor/checkpoint procedure for candidate, application and
|
|
134
|
+
interview-plan lists. Keep a separate checkpoint for each endpoint/filter/connection;
|
|
135
|
+
finish the scan before replacing it. Stage and archive-reason lists are unpaged.
|
|
136
|
+
UUID inputs come from provider records; names or display labels cannot replace IDs.
|
|
137
|
+
|
|
138
|
+
1. Select an authorized job and candidate. Create a candidate only after checking
|
|
139
|
+
existing records to avoid accidental duplicates. Profile updates send only
|
|
140
|
+
provided fields. They set `sendNotifications: false` by default; enabling it
|
|
141
|
+
explicitly can notify users subscribed to that candidate.
|
|
142
|
+
2. Source that candidate into the selected job with `applications.create`.
|
|
143
|
+
This is a recruiter action. A public careers form uses Ashby's separate
|
|
144
|
+
`applicationForm.submit` API and its form requirements, not this shortcut.
|
|
145
|
+
3. Read the application's interview plan; list published plans/stages if needed.
|
|
146
|
+
Choose a stage from the job's actual plan, not one with a similar name in
|
|
147
|
+
another plan. The provider rejects invalid plan/stage combinations.
|
|
148
|
+
4. After application authorization and confirmation, call `applications.changeStage`.
|
|
149
|
+
For an Archived stage, choose an active reason from `archiveReasons.list` and
|
|
150
|
+
send its ID. This adapter does not accept `archiveEmail` or send an archive
|
|
151
|
+
message. Read the application again to show the resulting stage/status.
|
|
152
|
+
5. Persist returned IDs. If a creation/stage change times out, inspect Ashby before
|
|
153
|
+
retrying; the adapter makes one attempt and cannot prove a lost response means
|
|
154
|
+
nothing happened. HTTP-200 provider errors and 403/429 remain visible failures.
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
const application = await connections.invoke({ context, integrationId: "hiring",
|
|
158
|
+
operation: "applications.create", input: { candidateId, jobId } });
|
|
159
|
+
// After an authorized recruiter chooses a stage from this application's plan:
|
|
160
|
+
await connections.invoke({ context, integrationId: "hiring",
|
|
161
|
+
operation: "applications.changeStage",
|
|
162
|
+
input: { applicationId: application.results.id, interviewStageId } });
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The generated application owns recruiter authorization, job/candidate visibility,
|
|
166
|
+
consent to changes and UI. The organization API key is not a tenant/user identity.
|
|
167
|
+
The optional Node runtime works without Vibe64 using the same JSON and Env
|
|
168
|
+
reference. Other frameworks can use their own HTTP client for these documented
|
|
169
|
+
endpoints, preserving the same ownership and connection configuration.
|
|
170
|
+
|
|
171
|
+
Sources: [candidates](https://developers.ashbyhq.com/reference/candidatelist),
|
|
172
|
+
[create candidate](https://developers.ashbyhq.com/reference/candidatecreate),
|
|
173
|
+
[update candidate](https://developers.ashbyhq.com/reference/candidateupdate),
|
|
174
|
+
[applications](https://developers.ashbyhq.com/reference/applicationlist),
|
|
175
|
+
[source candidate](https://developers.ashbyhq.com/reference/applicationcreate),
|
|
176
|
+
[change stage](https://developers.ashbyhq.com/reference/applicationchangestage),
|
|
177
|
+
[plans](https://developers.ashbyhq.com/reference/interviewplanlist),
|
|
178
|
+
[stages](https://developers.ashbyhq.com/reference/interviewstagelist),
|
|
179
|
+
[archive reasons](https://developers.ashbyhq.com/reference/archivereasonlist-1).
|
|
180
|
+
|
|
181
|
+
## Limitations
|
|
182
|
+
|
|
183
|
+
Editor coding-assistant attachment is deferred. For example, a generated hiring
|
|
184
|
+
app can display candidates and advance a recruiter-selected application, but
|
|
185
|
+
asking Vibe64's assistant to inspect your candidates does not give it access.
|
|
186
|
+
The app owns its hiring screens and policies. Public careers forms, scheduling,
|
|
187
|
+
offer management, file upload, messages and custom fields are not supplied here.
|
|
188
|
+
Live hiring changes, real credentials and generated-app execution were not tested.
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Atlassian assistant MCP
|
|
2
|
+
|
|
3
|
+
Import `atlassianProvider` and `registerAtlassianClient` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/server/atlassian`. This initial fragment connects
|
|
5
|
+
the assistant owner's account to Rovo MCP v2. It uses `tools.list` and explicit
|
|
6
|
+
`tools.call` through the existing OAuth/file runtime and official MCP SDK.
|
|
7
|
+
|
|
8
|
+
## Vibe64 setup
|
|
9
|
+
|
|
10
|
+
Open **Integrations → Add Atlassian**. Choose permissions, set the owning
|
|
11
|
+
application's **Suggested callback URL**, and select **Register client and connect**.
|
|
12
|
+
The editor registers this project’s client and saves its ID in `integrations.json`
|
|
13
|
+
and its secret/callback/recovery ID in development Env. It does not overwrite
|
|
14
|
+
existing Env values. The application must implement its callback and integration
|
|
15
|
+
setup command before consent can finish. If registration has an uncertain result,
|
|
16
|
+
inspect provider registration and project Env before explicitly allowing a retry.
|
|
17
|
+
An existing client can be entered using the manual steps below. Production Env
|
|
18
|
+
is configured on Deploy; copying configuration alone does not copy secrets.
|
|
19
|
+
|
|
20
|
+
## Manual setup
|
|
21
|
+
|
|
22
|
+
1. Choose the assistant host and its exact callback URL. Use HTTPS in a hosted
|
|
23
|
+
environment; an operator's local CLI may use an HTTP loopback callback.
|
|
24
|
+
2. Register a confidential client using the helper below or the equivalent
|
|
25
|
+
HTTP request. The reviewed metadata establishes dynamic registration; these
|
|
26
|
+
instructions do not assume a developer-console form for creating an MCP v2
|
|
27
|
+
client. A Jira REST OAuth client or an old MCP v1 client is not interchangeable.
|
|
28
|
+
3. In Vibe64, open **Integrations → Add Atlassian → Credentials**. Enter the
|
|
29
|
+
returned **Client ID**. Store the returned secret and callback URL through
|
|
30
|
+
Env; enter their names as **Client secret reference** and **Callback URL
|
|
31
|
+
reference**, for example `env:ATLASSIAN_CLIENT_SECRET` and
|
|
32
|
+
`env:ATLASSIAN_CALLBACK_URL`.
|
|
33
|
+
4. Open **Permissions**. Select the products needed by the assistant. Profile,
|
|
34
|
+
account, refresh, Jira read/search and Confluence read/search start selected.
|
|
35
|
+
Writes, deletes, administration and other products start unselected. Save
|
|
36
|
+
configuration. The JSON contains references, never the secret itself.
|
|
37
|
+
5. The host calls `beginAuthorization` and opens its returned URL. Sign into
|
|
38
|
+
the intended Atlassian account and review the products/sites and permissions
|
|
39
|
+
presented by Atlassian. Complete consent. The exact provider consent controls
|
|
40
|
+
were not exercised in this implementation; do not substitute automated
|
|
41
|
+
consent for the account owner's decision.
|
|
42
|
+
6. Handle the callback under the same authenticated assistant owner using
|
|
43
|
+
`completeAuthorization`. The runtime lists tools before saving a grant.
|
|
44
|
+
A connected status, including an empty tool list, does not establish access
|
|
45
|
+
to every product, site or write operation. Request additional permissions
|
|
46
|
+
through a new authorization attempt when the application needs them.
|
|
47
|
+
|
|
48
|
+
[Atlassian OAuth configuration](https://support.atlassian.com/atlassian-ai-gateway/docs/configure-oauth-2-1/)
|
|
49
|
+
describes consent, product permissions and site restrictions. Existing account
|
|
50
|
+
permissions continue to control tool access. If authorization or a tool is
|
|
51
|
+
blocked, have the relevant administrator review product/site access and
|
|
52
|
+
callback restrictions. This fragment does not change administration policies.
|
|
53
|
+
|
|
54
|
+
## Provider registration automation
|
|
55
|
+
|
|
56
|
+
The public [v2 resource metadata](https://mcp.atlassian.com/.well-known/oauth-protected-resource/v2/mcp)
|
|
57
|
+
identifies the resource `https://mcp.atlassian.com/v2/mcp`, its issuer and 32
|
|
58
|
+
supported scopes. The [issuer metadata](https://auth.atlassian.com/.well-known/oauth-authorization-server/VCeDsk8ZHncYF1g234fKtc4lNipbBhu3)
|
|
59
|
+
advertises dynamic registration, S256 PKCE and confidential-client authentication.
|
|
60
|
+
Both documents were read on 9 September 2026 without registering or signing in.
|
|
61
|
+
|
|
62
|
+
An authorized setup script can perform registration:
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
import { registerAtlassianClient } from "@jskit-ai/connectors-catalog/server/atlassian";
|
|
66
|
+
|
|
67
|
+
const client = await registerAtlassianClient({
|
|
68
|
+
clientName: "My assistant",
|
|
69
|
+
callbackUrl: "https://assistant.example/connections/atlassian/callback",
|
|
70
|
+
scopes: ["read:me", "read:jira:agent-interface", "offline_access"]
|
|
71
|
+
});
|
|
72
|
+
// Persist client.clientSecret through the host's existing private secret owner.
|
|
73
|
+
// Write client.clientId into the portable registration. Never log this result.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The helper validates names, callback URLs and unique supported permissions,
|
|
77
|
+
uses the official SDK, and returns `clientId`, `clientSecret` and optional
|
|
78
|
+
`clientSecretExpiresAt`. The caller owns authorization, secure secret storage
|
|
79
|
+
and configuration persistence. Registration runs only when explicitly requested,
|
|
80
|
+
never on file save, startup or every Connect action.
|
|
81
|
+
|
|
82
|
+
For manual registration, use an HTTP client on your own machine:
|
|
83
|
+
|
|
84
|
+
In Vibe64, expand **Set up Atlassian → OAuth client registration**. Set the
|
|
85
|
+
permissions and **Suggested callback URL** first. **Copy registration endpoint**
|
|
86
|
+
and **Copy registration request** supply this project's values before a Client
|
|
87
|
+
ID exists. Copying sends no request. CLI users can prepare the example below
|
|
88
|
+
with their own framework tools.
|
|
89
|
+
|
|
90
|
+
1. Create a **POST** request to
|
|
91
|
+
`https://auth.atlassian.com/VCeDsk8ZHncYF1g234fKtc4lNipbBhu3/dcr/register`.
|
|
92
|
+
This is the registration endpoint, not the `/v2/mcp` tool endpoint.
|
|
93
|
+
2. Set `Content-Type: application/json` and select a raw JSON body. Replace
|
|
94
|
+
the example name and callback below with the owning application's name and
|
|
95
|
+
exact callback shown in Vibe64. Implement that route in the application
|
|
96
|
+
before attempting user consent.
|
|
97
|
+
3. Set the space-delimited `scope` to the permissions selected in Vibe64.
|
|
98
|
+
The example below matches the screen's default profile/account, refresh,
|
|
99
|
+
Jira read/search and Confluence read/search permissions. Remove products
|
|
100
|
+
you do not need from both places.
|
|
101
|
+
4. Send once. Copy the successful response's `client_id` into **Client ID**.
|
|
102
|
+
Store `client_secret` as `ATLASSIAN_CLIENT_SECRET` through the project's
|
|
103
|
+
Env editor and enter `env:ATLASSIAN_CLIENT_SECRET` in **Client secret reference**.
|
|
104
|
+
Store the exact callback as `ATLASSIAN_CALLBACK_URL` and enter
|
|
105
|
+
`env:ATLASSIAN_CALLBACK_URL` in **Callback URL reference**.
|
|
106
|
+
5. An error response, missing credentials or a different returned redirect URI
|
|
107
|
+
is not a usable registration. Keep the response private; do not paste it
|
|
108
|
+
into source, chat or a shared HTTP-client collection.
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"client_name": "My assistant",
|
|
113
|
+
"redirect_uris": ["https://assistant.example/connections/atlassian/callback"],
|
|
114
|
+
"token_endpoint_auth_method": "client_secret_post",
|
|
115
|
+
"grant_types": ["authorization_code", "refresh_token"],
|
|
116
|
+
"response_types": ["code"],
|
|
117
|
+
"scope": "read:me read:account offline_access read:jira:agent-interface search:jira:agent-interface read:confluence:agent-interface search:confluence:agent-interface"
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The HTTP response uses `client_id` and `client_secret`; the JavaScript helper
|
|
122
|
+
returns `clientId` and `clientSecret`. Node applications should reuse the helper
|
|
123
|
+
and its response validation. Other frameworks use their own HTTP and private
|
|
124
|
+
secret-storage tools; they do not need JSKIT installed.
|
|
125
|
+
|
|
126
|
+
The helper checks that returned credentials, authentication method and the
|
|
127
|
+
single redirect URI match its contract. It does not follow redirects or retry
|
|
128
|
+
ambiguous failures. A timeout may leave a client registered; inspect the
|
|
129
|
+
provider before creating another one. Metadata proves the advertised protocol,
|
|
130
|
+
not that a live registration will be accepted for every client policy. Live
|
|
131
|
+
issuance and consent remain untested.
|
|
132
|
+
|
|
133
|
+
AI can prepare this JSON, call the explicit registration operation after
|
|
134
|
+
operator authorization and write the resulting references. It cannot choose a
|
|
135
|
+
user's product access, approve consent or establish provider quotas on its own.
|
|
136
|
+
|
|
137
|
+
## Runtime and portable configuration
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"schemaVersion": 1,
|
|
142
|
+
"registrations": {
|
|
143
|
+
"atlassian": {
|
|
144
|
+
"source": "own",
|
|
145
|
+
"clientId": "assigned-v2-client-id",
|
|
146
|
+
"clientSecretRef": "env:ATLASSIAN_CLIENT_SECRET",
|
|
147
|
+
"callbackUrlRef": "env:ATLASSIAN_CALLBACK_URL"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"integrations": {
|
|
151
|
+
"work": {
|
|
152
|
+
"provider": "atlassian",
|
|
153
|
+
"accountMode": "assistant",
|
|
154
|
+
"scopes": ["read:me", "read:jira:agent-interface", "offline_access"],
|
|
155
|
+
"authentication": { "method": "oauth2", "registrationRef": "atlassian" }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Compose the [OAuth file pattern](../patterns/oauth-connection/PATTERN.md) with
|
|
162
|
+
`providers: [atlassianProvider]`. The shared
|
|
163
|
+
[assistant OAuth pattern](../patterns/assistant-mcp-oauth/PATTERN.md) supplies
|
|
164
|
+
AI wiring guidance. UI and CLI edit the same validated file. The host uses
|
|
165
|
+
encrypted text files for pending attempts and access/refresh grants.
|
|
166
|
+
|
|
167
|
+
Authorization goes to `auth.atlassian.com/authorize`; token exchange and refresh
|
|
168
|
+
go to `auth.atlassian.com/oauth/token`. All three include the v2 resource
|
|
169
|
+
identifier. MCP requests go only to `https://mcp.atlassian.com/v2/mcp?tools=all`.
|
|
170
|
+
The query requests a flat tool catalogue, as documented in the
|
|
171
|
+
[v2 migration guide](https://support.atlassian.com/atlassian-ai-gateway/docs/how-to-upgrade-from-atlassian-rovo-mcp-v1-to-atlassian-rovo-mcp-v2/).
|
|
172
|
+
The resource identifier has no query. No token is sent to an arbitrary address
|
|
173
|
+
supplied by a tool response or authentication challenge.
|
|
174
|
+
|
|
175
|
+
`tools.list` accepts an optional cursor. `tools.call` accepts `name` and
|
|
176
|
+
`arguments`. The host must authorize that exact name and argument ownership,
|
|
177
|
+
including the destination site/project. Tool discovery is not approval to
|
|
178
|
+
execute everything it contains. Product permissions remain enforced by
|
|
179
|
+
Atlassian; returned `isError` must be handled before reporting success. The
|
|
180
|
+
transport grants no sampling/elicitation capability and tries to delete its MCP
|
|
181
|
+
session after work. Cancellation cannot undo an accepted tool mutation.
|
|
182
|
+
Disconnect deletes the local grant; it does not revoke all provider access.
|
|
183
|
+
|
|
184
|
+
## Connection ownership and callbacks
|
|
185
|
+
|
|
186
|
+
This fragment is for an explicitly configured assistant host. That host owns its
|
|
187
|
+
client registration, callback, private credentials and grants; it may be an
|
|
188
|
+
application-owned assistant or an opt-in editor tool. Merely adding the provider
|
|
189
|
+
to a project does not authorize the editor's coding assistant. It does not supply
|
|
190
|
+
published app-user login. The host's callback may differ from the published app's
|
|
191
|
+
domain, but it must match that host's real route and registered redirect URI.
|
|
192
|
+
|
|
193
|
+
Use the owning host's actual callback as the registration helper's `callbackUrl`.
|
|
194
|
+
Persist the resulting credentials in its private Env. Update the registration
|
|
195
|
+
and callback Env if this route changes when moving hosts; retain the runtime's
|
|
196
|
+
identity and stored grants. Separate clients do not establish separate capacity:
|
|
197
|
+
[Atlassian's overview](https://support.atlassian.com/atlassian-ai-gateway/docs/get-started-with-the-atlassian-remote-mcp-server/)
|
|
198
|
+
describes organization-level Rovo credit usage.
|
|
199
|
+
|
|
200
|
+
This fragment does not implement native public-client authentication, app-user
|
|
201
|
+
login, API tokens, REST adapters or automatic assistant attachment. V1 uses a
|
|
202
|
+
different OAuth resource; existing v1 clients/grants must not be silently reused
|
|
203
|
+
for v2.
|
|
204
|
+
|
|
205
|
+
## Focused proof
|
|
206
|
+
|
|
207
|
+
Eight simulated-provider tests exercise registration, PKCE/resource binding,
|
|
208
|
+
refresh after file restart, encrypted state, owner/site isolation, changed
|
|
209
|
+
consent scopes, reduced grants, empty/malformed discovery, provider failures,
|
|
210
|
+
interruption and session cleanup. Editor proof checks product permission
|
|
211
|
+
choices, reference validation and file reload. No live client registration,
|
|
212
|
+
consent, provider tool use or generated application is included.
|
|
213
|
+
|
|
214
|
+
## LIMITATIONS
|
|
215
|
+
|
|
216
|
+
Vibe64's coding assistants do not yet receive these tools automatically. For
|
|
217
|
+
example, connecting Jira here does not let the editor's Codex/OpenCode chat
|
|
218
|
+
retrieve DOG-42. An application-owned assistant can call the runtime's tools
|
|
219
|
+
with its own authorization policy; this bridge to editor chat is deferred.
|
|
220
|
+
|
|
221
|
+
The runtime preserves Jira issue and Confluence page content supplied by tools,
|
|
222
|
+
but the application owns how it presents, summarizes or acts on that content.
|
|
223
|
+
OAuth consent and organization policies still control actual product access.
|
|
224
|
+
No live registration, real Jira/Confluence access or generated-app run was tested.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Attention
|
|
2
|
+
|
|
3
|
+
Import `attentionProvider` from `@jskit-ai/connectors-catalog/server/attention`.
|
|
4
|
+
This adapter verifies an organization key by listing conversations, then provides
|
|
5
|
+
explicit conversation, coaching and organization operations.
|
|
6
|
+
|
|
7
|
+
## Manual provider setup
|
|
8
|
+
|
|
9
|
+
1. Sign into [Attention](https://app.attention.tech) as an organization admin.
|
|
10
|
+
Open the profile avatar at the top left, then **Settings**.
|
|
11
|
+
2. Under **Organization**, select **API Keys**. Choose **+ Create API Key**
|
|
12
|
+
and enter a descriptive name.
|
|
13
|
+
3. Copy the key from **API Key Created**; it is shown only once. Put it in the
|
|
14
|
+
backend environment as `ATTENTION_API_KEY`.
|
|
15
|
+
4. Add Attention in Vibe64 and enter `env:ATTENTION_API_KEY` in **API key
|
|
16
|
+
reference**. Save, choose **Set credential in Env**, save the value there, then return and
|
|
17
|
+
choose **Connect account** or **Verify again**. **Check connection** only reloads
|
|
18
|
+
status; it does not validate a newly entered key.
|
|
19
|
+
5. For rotation, create a replacement, update the binding and verify before
|
|
20
|
+
deleting the old key through its **⋯ → Delete** menu.
|
|
21
|
+
|
|
22
|
+
The dedicated authentication guide requires `Authorization: Bearer <key>`.
|
|
23
|
+
Generated endpoint examples show a generic Authorization placeholder; this
|
|
24
|
+
adapter follows the explicit authentication guide.
|
|
25
|
+
[Authentication and dashboard instructions](https://docs.attention.com/api-authentication).
|
|
26
|
+
|
|
27
|
+
## Portable configuration and runtime
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"schemaVersion": 1,
|
|
32
|
+
"registrations": {},
|
|
33
|
+
"integrations": {
|
|
34
|
+
"calls": {
|
|
35
|
+
"provider": "attention",
|
|
36
|
+
"displayName": "Sales conversations",
|
|
37
|
+
"accountMode": "shared",
|
|
38
|
+
"scopes": [],
|
|
39
|
+
"authentication": { "method": "api-key", "secretRef": "env:ATTENTION_API_KEY" }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Compose `providers: [attentionProvider]` with the
|
|
46
|
+
[API-key pattern](../patterns/api-key-connection/PATTERN.md), an application
|
|
47
|
+
authorization policy and the file connection store. Configuration and runtime
|
|
48
|
+
state are text files; no editor-specific service or database is required by
|
|
49
|
+
the CLI application.
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
await connections.connectApiKey({ context, integrationId: "calls" });
|
|
53
|
+
const page = await connections.invoke({
|
|
54
|
+
context, integrationId: "calls", operation: "conversations.list",
|
|
55
|
+
input: { page: 1, size: 20, "filter[title]": "Review", detailedTranscript: false }
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Requests use `GET https://api.attention.tech/v2/conversations/list`, the current
|
|
60
|
+
optimized listing. Pages start at 1 and the provider limits page size to 50.
|
|
61
|
+
This endpoint can include empty conversations and omits some extracted CRM
|
|
62
|
+
intelligence by default. Results contain `data`, with `links` and `meta` where
|
|
63
|
+
available. Title filtering is a case-insensitive partial match.
|
|
64
|
+
[Conversation listing](https://docs.attention.com/api-reference/conversation/list-conversations-optimized).
|
|
65
|
+
|
|
66
|
+
This fragment defaults to page 1, size 20 and `detailedTranscript: false`.
|
|
67
|
+
It accepts optional `filter[title]` up to 500 characters and
|
|
68
|
+
`filter[hide_internal]` as a boolean. The page cap of 100000 and title bound
|
|
69
|
+
are local choices. Additional list date/team filters and CRM expansion are not implemented;
|
|
70
|
+
retrieve one conversation for full content. False for detailed transcripts does not mean the result
|
|
71
|
+
contains no transcript content; authorize access to the conversation data.
|
|
72
|
+
|
|
73
|
+
The adapter checks the collection and any available numeric page metadata,
|
|
74
|
+
preserves other fields and accepts empty results. It never follows returned
|
|
75
|
+
URLs with credentials. Call the named operation with the next page number
|
|
76
|
+
explicitly. Keys are resolved per request, sent to the fixed HTTPS origin and
|
|
77
|
+
excluded from source. Disconnect removes local state and does not revoke a
|
|
78
|
+
provider key. Provider user identities do not establish an application login.
|
|
79
|
+
|
|
80
|
+
## API provisioning and application ownership
|
|
81
|
+
|
|
82
|
+
Attention documents `POST https://api.attention.tech/v2/api_keys` with required
|
|
83
|
+
`name` and boolean `orgLevel`, authenticated by an existing credential. Its
|
|
84
|
+
response includes the generated key in `value`. An authorized administrator
|
|
85
|
+
can issue a key named for the application, store the response directly in its
|
|
86
|
+
private Env and save only the reference in configuration.
|
|
87
|
+
Initial organization access and the bootstrap credential remain prerequisites.
|
|
88
|
+
[Key-creation API](https://docs.attention.com/api-reference/api-key/create-api-key).
|
|
89
|
+
|
|
90
|
+
An AI can prepare that provisioning request and runtime/configuration wiring.
|
|
91
|
+
The normal conversation adapter deliberately exposes no key-creation action:
|
|
92
|
+
provisioning belongs to the authorized operator and must not return new secrets
|
|
93
|
+
through an ordinary conversation response. This documented automation route
|
|
94
|
+
has not been exercised with live credentials.
|
|
95
|
+
|
|
96
|
+
Separate keys support independent revocation but do not prove independent
|
|
97
|
+
organization capacity. The authentication guide directs organizations to their
|
|
98
|
+
account manager for rate-limit increases. The application owner must verify
|
|
99
|
+
provider capacity arrangements for its usage. Each
|
|
100
|
+
customer organization supplies its own authorized key. No OAuth callback is
|
|
101
|
+
used, so VM subdomains and deployed app domains do not change this flow.
|
|
102
|
+
|
|
103
|
+
## Focused evidence
|
|
104
|
+
|
|
105
|
+
Simulated protocol tests with real temporary JSON state cover the bearer header,
|
|
106
|
+
current endpoint, title encoding, page bounds, detailed-transcript selection,
|
|
107
|
+
partial metadata, empty results, failures, ownership, restart, rotation and
|
|
108
|
+
disconnect. The editor check verifies reference-only saving and reload.
|
|
109
|
+
Live provider requests, key provisioning and sample-app generation are excluded.
|
|
110
|
+
|
|
111
|
+
## Complete app workflows
|
|
112
|
+
|
|
113
|
+
The provider's [OpenAPI contract](https://docs.attention.com/api-reference/openapi.json)
|
|
114
|
+
was inspected on 12 September 2026. All paths below are relative to
|
|
115
|
+
`https://api.attention.tech/v2` and use the same backend-only Bearer key.
|
|
116
|
+
|
|
117
|
+
| Operation | HTTP path | Input and result |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| conversations.get | GET /conversations/{id} | Detailed transcript defaults true; preserves participants, timing, processing status, scorecard results and intelligence. Optional `by: external_id` and metadata flags. |
|
|
120
|
+
| conversations.update | PUT /conversations/{id} | Explicit title and/or labels; omitted fields remain untouched. Labels may replace existing metadata: read before replacing. |
|
|
121
|
+
| conversations.archive | DELETE /conversations/{id} | Archives the selected call. |
|
|
122
|
+
| conversations.import | POST /conversations/import | HTTPS mediaURL and userID; optional title, external source ID/name, timestamp and calculation/export skip flags. Returns a UUID; transcription/analysis may still be pending. |
|
|
123
|
+
| snippets.create | POST /snippets | user_uuid, conversation_id, video start_time/end_time in seconds; internal and notify_views must be chosen explicitly. Returns a link; does not open/fetch it. |
|
|
124
|
+
| analysis.ask | POST /ask_attention/v2 | prompt, conversations_ids and deal_id (empty string when not filtering by deal). Preserves each answer's source conversation and error; check errors before displaying success. |
|
|
125
|
+
| scorecards.list / scorecards.get | GET /scorecards, /scorecards/{id} | Browse templates; preserve returned criteria and identifiers. |
|
|
126
|
+
| scorecardItems.list | GET /scorecards/{id}/items | Page through scoring criteria and their provider-defined ranges. |
|
|
127
|
+
| scorecards.summary | POST /scorecards/summary | Required ISO fromDateTime/toDateTime, scorecardUUID, scorecardsItemsUUIDs, teamUUIDs and userUUIDs. Empty filter arrays are passed explicitly. |
|
|
128
|
+
| scorecardResults.create | POST /createScorecardResult | conversation_uuid, scorecard_uuid, summary and items (scorecard_item_uuid, description, optional integer numeric_result). Choose scores using that template's ranges. |
|
|
129
|
+
| users.list / roles.list / teams.list | GET /organizations/users, /organizations/roles, /organizations/teams | Organization discovery; optional teamUUID for users. |
|
|
130
|
+
| users.create | POST /organizations/users | email, first_name, last_name, roleUUID, teams with uuid/optional primary; explicit seat_type listener or recording. |
|
|
131
|
+
| users.update | PATCH /organizations/users/{id} | Sparse firstName/lastName, roleUUID, seat_type, teamUUIDsToRemove and teamsToAdd. Provider creation/update field spellings differ. |
|
|
132
|
+
| users.delete | DELETE /organizations/users/{id} | Permanent organization-user removal and loss of access. Empty successful response; no automatic retry. |
|
|
133
|
+
| teams.create / teams.update | POST /organizations/teams, PATCH /organizations/teams/{id} | Name and optional parentTeamUUID; update sends only selected changes. |
|
|
134
|
+
|
|
135
|
+
For a coaching dashboard, list calls, retrieve the chosen call with
|
|
136
|
+
`conversations.get`, inspect transcriptStatus, and display the returned transcript,
|
|
137
|
+
participants and existing scorecardResults. Load templates/items before submitting
|
|
138
|
+
reviewer scores; fetch summaries for trends. A successful import UUID is not a
|
|
139
|
+
completed recording. Poll its detail explicitly while processing is pending.
|
|
140
|
+
|
|
141
|
+
The application must authorize organization management separately from viewing
|
|
142
|
+
calls. Seat assignment, media import and AI analysis can consume the customer's
|
|
143
|
+
provider allowance. Creating users is not an app login mechanism. No provider
|
|
144
|
+
operation runs when saving configuration. Writes are never retried automatically:
|
|
145
|
+
a lost response may mean the mutation succeeded. Inspect the provider before
|
|
146
|
+
retrying imports, snippets, users or scorecard results.
|
|
147
|
+
|
|
148
|
+
The same `integrations.json`, Env reference and API-key composition work from CLI
|
|
149
|
+
without Vibe64. Other frameworks use their native HTTP/client, secret storage and
|
|
150
|
+
application authorization against these endpoints; they need no Node service.
|
|
151
|
+
|
|
152
|
+
## LIMITATIONS
|
|
153
|
+
|
|
154
|
+
Editor coding-assistant attachment is deferred. For example, an app can display
|
|
155
|
+
a sales-call transcript and save a manager's coaching score, but configuring this
|
|
156
|
+
connector does not let Vibe64's Codex/OpenCode read those calls from editor chat.
|
|
157
|
+
The app owns its dashboard, permissions, polling and handling of pending/error
|
|
158
|
+
results. This does not supply Attention's recorder, CRM installation, webhooks,
|
|
159
|
+
SCIM, scorecard-template designer or per-user OAuth. Media imports use an accessible
|
|
160
|
+
HTTPS file URL; custom fetch headers and precomputed transcript imports require
|
|
161
|
+
native provider wiring. Public snippet sharing is an explicit caller choice.
|
|
162
|
+
No real organization, live recording, billing action or generated app was exercised.
|