@zackbart/connecta 0.36.0 → 0.36.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/CHANGELOG.md +42 -0
- package/README.md +1 -1
- package/bin/version.mjs +1 -1
- package/dist/http/hatch-paging.js +2 -2
- package/dist/http/paging.js +3 -88
- package/dist/http/provider.js +1 -2
- package/dist/http/tools.js +1 -23
- package/dist/program-writes.js +0 -1
- package/dist/providers/_shared/sensitive-fields.js +0 -16
- package/dist/providers/breeze/api.js +2 -2
- package/dist/providers/ccb/api.js +1 -1
- package/dist/providers/cloudflare/api.js +8 -8
- package/dist/providers/cloudflare/lib/config.d.ts +2 -1
- package/dist/providers/docs/api.js +1 -1
- package/dist/providers/drive/api.js +1 -1
- package/dist/providers/drive/lib/hatch.js +1 -1
- package/dist/providers/drive/tools.js +1 -1
- package/dist/providers/forms/api.js +1 -1
- package/dist/providers/forms/lib/hatch.js +1 -1
- package/dist/providers/forms/tools.js +1 -1
- package/dist/providers/github/api.js +1 -1
- package/dist/providers/github/lib/discovery.js +2 -2
- package/dist/providers/gmail/api.js +1 -1
- package/dist/providers/granola/api.js +155 -0
- package/dist/providers/granola/index.d.ts +10 -0
- package/dist/providers/granola/index.js +68 -0
- package/dist/providers/granola/openapi.generated.js +30 -0
- package/dist/providers/granola/safety.js +37 -0
- package/dist/providers/granola/skill.generated.js +5 -0
- package/dist/providers/granola/tools.js +2 -0
- package/dist/providers/overflow/api.js +26 -26
- package/dist/providers/planning-center/api.js +4 -4
- package/dist/providers/planning-center/lib/constants.d.ts +1 -1
- package/dist/providers/planning-center/lib/json-api.js +2 -2
- package/dist/providers/quickbooks/lib/query.js +1 -1
- package/dist/providers/quickbooks/safety.js +1 -1
- package/dist/providers/sheets/api.js +1 -1
- package/dist/providers/sheets/lib/hatch.js +2 -2
- package/dist/providers/sheets/lib/requests.js +1 -1
- package/dist/providers/slides/api.js +1 -1
- package/dist/providers/stripe/api.js +7 -7
- package/dist/providers/tithely/api.js +2 -2
- package/dist/providers/vercel/api.js +12 -12
- package/dist/providers/vercel/lib/pin.js +1 -1
- package/dist/routes/mcp.js +1 -1
- package/dist/runtime/admission.js +0 -12
- package/dist/storage/keys.js +2 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/documentation/architecture.md +124 -74
- package/documentation/auth.md +9 -2
- package/documentation/code-mode.md +6 -6
- package/documentation/meta-tools.md +5 -2
- package/documentation/operator-tests.md +11 -2
- package/documentation/operator-ui.md +1 -2
- package/documentation/providers.md +110 -0
- package/package.json +6 -2
- package/templates/node/package.json +1 -1
|
@@ -190,8 +190,17 @@ OAuth provider validates the code exchange and PKCE. Credential Test calls a
|
|
|
190
190
|
loopback downstream endpoint. Operator APIs, cookie/bearer admission, CSRF,
|
|
191
191
|
assets, handoffs, callbacks, and encrypted storage use production code.
|
|
192
192
|
|
|
193
|
-
The flows cover Clerk sign-in/reload/sign-out
|
|
194
|
-
|
|
193
|
+
The flows use a real SQLite file and cover Clerk sign-in/reload/sign-out,
|
|
194
|
+
actual Settings provenance and asset cache validators; OAuth
|
|
195
|
+
connect/consent/callback/connected reread/disconnect; and credential
|
|
196
|
+
save/test/replace/remove. They close and reopen the app, database and vault
|
|
197
|
+
before rereading OAuth and credential state. A rejected SQL replacement leaves
|
|
198
|
+
the previous secret usable downstream after restart. Trigger rows read from an
|
|
199
|
+
independent SQL connection require one save, one replacement and one removal;
|
|
200
|
+
reads and the rejected save commit no credential writes. Actual MCP calls
|
|
201
|
+
check that credential edits preserve a reader pool's read access and refusal. Activity renders
|
|
202
|
+
successful calls recorded before the SQLite restart without exposing either
|
|
203
|
+
credential value. They collect
|
|
195
204
|
CSP violations across every document and popup, and fail on unexpected network
|
|
196
205
|
traffic. No credentials enter visual fixtures or screenshot baselines.
|
|
197
206
|
|
|
@@ -644,8 +644,7 @@ and each personal connector's exact `manage`;
|
|
|
644
644
|
The Overview's map and attention rows are pure functions of the contract in
|
|
645
645
|
[connection-map.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/connection-map.ts)
|
|
646
646
|
and [overview.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/overview.ts),
|
|
647
|
-
|
|
648
|
-
`test/operator-overview.test.ts`; `src/operator-ui/styles/overview.css` holds
|
|
647
|
+
exercised in Chromium by `test/browser/operator-overview.spec.ts`; `src/operator-ui/styles/overview.css` holds
|
|
649
648
|
the page's styles.
|
|
650
649
|
|
|
651
650
|
`src/operator-ui/config-summary.ts` maps the snapshot and its provenance to
|
|
@@ -7,6 +7,95 @@ roster](./integrating.md#add-or-remove-a-connector) covers the general
|
|
|
7
7
|
procedure and the providers not listed here. Agent guidance for each
|
|
8
8
|
provider ships with its connection's usage guide, not here.
|
|
9
9
|
|
|
10
|
+
## Granola
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { granola } from "@zackbart/connecta/providers/granola";
|
|
14
|
+
|
|
15
|
+
const notes = granola("granola", { purpose: "Shared workspace meeting notes" });
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use a **workspace API key**, created by a Business or Enterprise workspace
|
|
19
|
+
admin in Granola desktop Settings → Connectors → Workspace API keys → Create
|
|
20
|
+
new key. Save it in this connection's credential slot through the operator UI;
|
|
21
|
+
configure an encrypted vault as described in [shared credentials](./auth.md#connect-a-shared-credential).
|
|
22
|
+
The shared, single-secret field is `value`. The provider fixes the origin to
|
|
23
|
+
`https://public-api.granola.ai`, uses bearer authentication, and exposes reads
|
|
24
|
+
only. It accepts `purpose`, optional `title`, `instructions`, and
|
|
25
|
+
`maxResultBytes` and the common `readOnly` restriction. Even `readOnly: false`
|
|
26
|
+
exposes only the five reviewed reads; it accepts no inline secret, origin override, personal auth
|
|
27
|
+
scope, or option enabling writes.
|
|
28
|
+
|
|
29
|
+
Workspace keys belong to the workspace, survive their creator leaving and do
|
|
30
|
+
not expire; an admin can revoke them. They reach public notes and spaces with
|
|
31
|
+
Granola API access enabled. For an existing space an admin uses Integrations →
|
|
32
|
+
Granola API → Allow access with a workspace API key. Folders inherit the space
|
|
33
|
+
setting. Workspace ownership does not grant unrelated private notes or the
|
|
34
|
+
owner's private handwritten notes. Discover accessible IDs before filtering.
|
|
35
|
+
Only notes with a generated summary and transcript are returned; a 404 does
|
|
36
|
+
not prove absence. A successful credential test confirms accessible spaces,
|
|
37
|
+
not the key's ownership type or access to every meeting. Granola enforces
|
|
38
|
+
these permissions; Connecta cannot infer workspace versus personal key type
|
|
39
|
+
from the secret. Do not substitute a personal API key or MCP OAuth token.
|
|
40
|
+
|
|
41
|
+
The REST surface is `granola_api_search`, `granola_api_details`, and
|
|
42
|
+
`granola_api_read`. Search discovers API operations, not meeting content.
|
|
43
|
+
Reads cover `/v1/notes`, `/v1/notes/{note_id}`,
|
|
44
|
+
`/v1/notes/{note_id}/transcript`, `/v1/folders`, and `/v1/spaces`. Use API IDs
|
|
45
|
+
(`not_`, `fol_`, `spa_`), not UUIDs copied from web links. Date/folder/space
|
|
46
|
+
filters and response `fields` narrowing follow the reviewed operation details.
|
|
47
|
+
Audit, legal holds, webhook management and writes are refused, even if their
|
|
48
|
+
contracts appear in operation discovery.
|
|
49
|
+
|
|
50
|
+
Omit `query.cursor` on the first read. Continue with `page.nextCursor` as the
|
|
51
|
+
top-level `cursor`, retaining the path and query filters. Continuations are
|
|
52
|
+
bound to that request and are not raw Granola tokens. The vendor uses
|
|
53
|
+
`query.page_size`: notes/folders/spaces default to 10 with maximum 30;
|
|
54
|
+
transcripts default to 50 with maximum 100. Empty pages can have more data.
|
|
55
|
+
No total count is inferred. HTTP 413 when using `include: "transcript"`
|
|
56
|
+
requires a new note-detail read without include and paged transcript reads;
|
|
57
|
+
the provider sends no hidden fallback requests. Photo download URLs grant
|
|
58
|
+
unauthenticated access and are always withheld. Meeting text and sent
|
|
59
|
+
credentials cross the same value-safety boundary before selection or paging.
|
|
60
|
+
|
|
61
|
+
Granola documents 25 requests per 5-second burst and 5 requests/second
|
|
62
|
+
sustained, shared across the workspace key's scope. The default per-runtime
|
|
63
|
+
admission is 25 calls in a rolling 5-second window with concurrency 2. Other
|
|
64
|
+
processes and integrations share the vendor allowance; the local counter
|
|
65
|
+
cannot enforce a workspace-wide limit. A 429 returns `rate_limited` and
|
|
66
|
+
Retry-After when supplied (otherwise a 5-second hint); calls are not retried
|
|
67
|
+
automatically. Requests have a 30-second deadline and 4 MiB response ceiling.
|
|
68
|
+
Oversized responses fail without presenting a partial success; inline result
|
|
69
|
+
cuts retain the standard `truncated` paths.
|
|
70
|
+
|
|
71
|
+
For hosted Granola MCP, use a distinct generic `remoteMcp()` connection to
|
|
72
|
+
`https://mcp.granola.ai/mcp` with its user OAuth or enterprise-managed
|
|
73
|
+
authorization. Granola MCP does not accept workspace API keys or service
|
|
74
|
+
accounts. Its natural-language search is not a REST-provider capability.
|
|
75
|
+
See [Granola's workspace-key guide](https://docs.granola.ai/help-center/sharing/integrations/granola-api#workspace-api-keys)
|
|
76
|
+
and [API overview](https://docs.granola.ai/introduction).
|
|
77
|
+
|
|
78
|
+
### Migrate a deployment-local Granola API adapter
|
|
79
|
+
|
|
80
|
+
Replace the local `api("granola", …)` construction with
|
|
81
|
+
`granola("granola", { purpose: "Shared workspace meeting notes" })`, retaining
|
|
82
|
+
the same encrypted vault, encryption key, connector ID, shared owner and
|
|
83
|
+
single-secret `value` field. The provider reuses that credential without
|
|
84
|
+
copying it. Existing addresses `granola.granola_api_search`,
|
|
85
|
+
`granola.granola_api_details`, and `granola.granola_api_read` remain stable.
|
|
86
|
+
Keep existing pool references to `granola`. A differently named or personal
|
|
87
|
+
credential field requires the operator to save a workspace key in the shared
|
|
88
|
+
slot; do not read out or copy stored secrets through an agent.
|
|
89
|
+
|
|
90
|
+
Compare local argument contracts before replacing the factory: the maintained
|
|
91
|
+
search is operation discovery, details uses an indexed operation, and read
|
|
92
|
+
uses a relative path and query. Replace raw `query.cursor` continuations with
|
|
93
|
+
the bound top-level `cursor`, and start new pagination sequences after the
|
|
94
|
+
upgrade. Responses use `{ status, data, page? }`. Remove local write tools or
|
|
95
|
+
natural-language-search assumptions; do not keep duplicate factories with the
|
|
96
|
+
same connector ID. If a local adapter used other tool names, update its
|
|
97
|
+
callers explicitly. No data migration or downstream write is required.
|
|
98
|
+
|
|
10
99
|
## API sources and tool inventory
|
|
11
100
|
|
|
12
101
|
Maintained providers pair reviewed API contracts and indexes with Connecta's
|
|
@@ -143,6 +232,20 @@ discovery for your deployment's catalog.
|
|
|
143
232
|
|
|
144
233
|
</details>
|
|
145
234
|
|
|
235
|
+
<details>
|
|
236
|
+
<summary>Granola (3 tools)</summary>
|
|
237
|
+
|
|
238
|
+
[Setup](#granola). **API source:** [Upstream OpenAPI](https://docs.granola.ai/api-reference/openapi.json).
|
|
239
|
+
|
|
240
|
+
- **Named reads:** None.
|
|
241
|
+
- **Named writes:** None.
|
|
242
|
+
- **API reads:** `granola_api_details`, `granola_api_read`, `granola_api_search`.
|
|
243
|
+
- **API writes:** None.
|
|
244
|
+
|
|
245
|
+
**Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/granola).
|
|
246
|
+
|
|
247
|
+
</details>
|
|
248
|
+
|
|
146
249
|
<details>
|
|
147
250
|
<summary>Overflow (17 tools)</summary>
|
|
148
251
|
|
|
@@ -1318,6 +1421,13 @@ would change existing payment settings. Deletes, voids, delivery, payment
|
|
|
1318
1421
|
execution, batch and other accounting writes remain unavailable. The API hatch
|
|
1319
1422
|
refuses POSTs even when named writes are enabled.
|
|
1320
1423
|
|
|
1424
|
+
Sparse field preservation, a current SyncToken and requestid do not establish
|
|
1425
|
+
that an invoice update cannot send email. For example, changing only DueDate
|
|
1426
|
+
on an invoice with NeedToSend and enabled card/ACH payments retains those
|
|
1427
|
+
settings; omitting email fields does not disable them. Do not reset delivery or
|
|
1428
|
+
payment settings to work around the unavailable update, or replace the invoice
|
|
1429
|
+
with a new one. No unsent-only update tool is currently exposed either.
|
|
1430
|
+
|
|
1321
1431
|
Each write requires `requestId`, a stable identifier for the exact intent,
|
|
1322
1432
|
unique across all requests/tools for this company: 1–50 ASCII letters, digits,
|
|
1323
1433
|
underscores or hyphens, beginning with a letter or digit. It is sent as Intuit's
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zackbart/connecta",
|
|
3
|
-
"version": "0.36.
|
|
3
|
+
"version": "0.36.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind a code-first surface of six meta-tools.",
|
|
@@ -107,6 +107,10 @@
|
|
|
107
107
|
"types": "./dist/providers/gmail/index.d.ts",
|
|
108
108
|
"import": "./dist/providers/gmail/index.js"
|
|
109
109
|
},
|
|
110
|
+
"./providers/granola": {
|
|
111
|
+
"types": "./dist/providers/granola/index.d.ts",
|
|
112
|
+
"import": "./dist/providers/granola/index.js"
|
|
113
|
+
},
|
|
110
114
|
"./providers/overflow": {
|
|
111
115
|
"types": "./dist/providers/overflow/index.d.ts",
|
|
112
116
|
"import": "./dist/providers/overflow/index.js"
|
|
@@ -191,7 +195,7 @@
|
|
|
191
195
|
"preeval:outcomes": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
|
|
192
196
|
"eval:perf": "tsx eval/run-perf.ts",
|
|
193
197
|
"eval:report": "tsx eval/report.ts",
|
|
194
|
-
"check:static": "
|
|
198
|
+
"check:static": "pnpm run format:check && pnpm run check:providers-generated && pnpm run check:docs && pnpm run check:changes && pnpm run check:operator-ui && pnpm run check:clerk-sdk && pnpm run check:lint && pnpm run check:unused && pnpm run typecheck",
|
|
195
199
|
"check:build": "pnpm run build && pnpm run check:declarations && pnpm run check:bundle",
|
|
196
200
|
"check:fast": "pnpm run check:static && vitest run --config vitest.config.node.ts --changed origin/main --passWithNoTests",
|
|
197
201
|
"check": "pnpm run check:static && pnpm run test && pnpm run check:build",
|