@zackbart/connecta 0.28.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +788 -5
- package/README.md +62 -42
- package/bin/connecta.mjs +110 -139
- package/bin/meta-tool-names.d.mts +2 -0
- package/bin/meta-tool-names.mjs +9 -0
- package/bin/version.mjs +3 -0
- package/dist/access-tokens.js +53 -63
- package/dist/activity-request.js +8 -0
- package/dist/activity.d.ts +76 -42
- package/dist/activity.js +110 -42
- package/dist/auth/clerk-sdk/client.d.ts +65 -0
- package/dist/auth/clerk-sdk/client.js +5 -0
- package/dist/auth/clerk-sdk/generated.js +1845 -0
- package/dist/auth/clerk-transport.js +19 -0
- package/dist/auth/clerk.d.ts +17 -7
- package/dist/auth/clerk.js +189 -107
- package/dist/auth/cloudflare-access.js +25 -26
- package/dist/auth/downstream-client-metadata.d.ts +29 -0
- package/dist/auth/downstream-client-metadata.js +133 -0
- package/dist/auth/downstream-oauth.js +1584 -1580
- package/dist/auth/downstream-revocation.js +106 -0
- package/dist/auth/oauth-token-response.js +231 -0
- package/dist/auth/oauth-v2-migration.js +116 -0
- package/dist/auth/static-oauth.js +93 -71
- package/dist/auth-elicitation.js +283 -0
- package/dist/branding.d.ts +8 -16
- package/dist/branding.js +26 -59
- package/dist/byte-read-response.js +39 -0
- package/dist/call-admission.js +12 -16
- package/dist/catalog-cache.js +739 -0
- package/dist/catalog-drift.d.ts +50 -15
- package/dist/catalog-drift.js +365 -128
- package/dist/catalog-fingerprint.js +2 -4
- package/dist/catalog-freshness.js +13 -0
- package/dist/catalog-limits.js +2 -2
- package/dist/catalog-service.js +368 -224
- package/dist/catalog.js +43 -84
- package/dist/concurrency.js +3 -4
- package/dist/config-defaults.d.ts +39 -0
- package/dist/config-defaults.js +46 -0
- package/dist/config-schema.d.ts +181 -0
- package/dist/config-schema.js +435 -0
- package/dist/config-value-sources.js +102 -0
- package/dist/config.d.ts +631 -0
- package/dist/config.js +503 -0
- package/dist/connector-access.d.ts +1 -0
- package/dist/connector-access.js +13 -15
- package/dist/connector-caller.d.ts +8 -0
- package/dist/connector-caller.js +15 -6
- package/dist/connector-scope.js +1 -1
- package/dist/connectors/api-connector.d.ts +59 -7
- package/dist/connectors/api-connector.js +106 -19
- package/dist/connectors/api.js +4 -1
- package/dist/connectors/guarded-fetch.d.ts +144 -0
- package/dist/connectors/guarded-fetch.js +84 -35
- package/dist/connectors/negotiation-cache.js +46 -0
- package/dist/connectors/option-shapes.js +27 -0
- package/dist/connectors/remote-mcp.d.ts +30 -4
- package/dist/connectors/remote-mcp.js +1774 -320
- package/dist/connectors/resource-uri.js +335 -0
- package/dist/credential-contract.d.ts +10 -0
- package/dist/credential-rules.js +1 -3
- package/dist/credential-url.js +108 -0
- package/dist/credentials.d.ts +6 -1
- package/dist/credentials.js +27 -18
- package/dist/d1.d.ts +130 -0
- package/dist/d1.js +290 -0
- package/dist/describe-config.d.ts +165 -0
- package/dist/describe-config.js +315 -0
- package/dist/described.js +106 -0
- package/dist/downstream-input-context.js +119 -0
- package/dist/downstream-input.js +323 -0
- package/dist/errors.d.ts +97 -20
- package/dist/errors.js +158 -80
- package/dist/execute.js +453 -305
- package/dist/executor-admission.d.ts +1 -0
- package/dist/executor-admission.js +11 -15
- package/dist/executor-contract.d.ts +20 -0
- package/dist/executor-contract.js +48 -0
- package/dist/executor-result.js +24 -9
- package/dist/executors/quickjs-child.js +3 -4
- package/dist/executors/quickjs-runtime.js +147 -59
- package/dist/executors/quickjs.js +29 -35
- package/dist/favicon.js +1 -2
- package/dist/fix-prompt.js +1 -3
- package/dist/guest-runtime.js +188 -0
- package/dist/guest-types.d.ts +176 -0
- package/dist/guest-types.js +1 -0
- package/dist/html-security.js +24 -0
- package/dist/identity.js +1 -3
- package/dist/inbound-credential.js +52 -0
- package/dist/index.d.ts +24 -256
- package/dist/index.js +65 -478
- package/dist/invocation-auth.js +69 -0
- package/dist/invocation.js +230 -73
- package/dist/json-schema.d.ts +1 -1
- package/dist/mcp-client-context.js +35 -0
- package/dist/mcp-result.js +11 -7
- package/dist/meta-output.js +76 -0
- package/dist/meta-tool-names.d.ts +2 -0
- package/dist/meta-tool-names.js +3 -0
- package/dist/meta-tools.js +285 -209
- package/dist/module-contracts.d.ts +8 -23
- package/dist/node.d.ts +0 -2
- package/dist/node.js +2 -2
- package/dist/oauth-callback-outcome.js +1 -3
- package/dist/oauth-handoff.js +117 -0
- package/dist/oauth-sealing.js +20 -0
- package/dist/operator-record.d.ts +137 -0
- package/dist/operator-record.js +420 -0
- package/dist/operator-ui/assets.js +31 -0
- package/dist/operator-ui/contract.d.ts +72 -0
- package/dist/operator-ui/contract.js +1 -0
- package/dist/operator-ui/fix-prompts.d.ts +18 -0
- package/dist/operator-ui/generated.js +5 -4
- package/dist/operator-ui/model.d.ts +12 -87
- package/dist/operator-ui/model.js +2 -9
- package/dist/operator-ui/setup-commands.js +1 -3
- package/dist/operator-ui/view.d.ts +323 -0
- package/dist/operator-ui/view.js +62 -189
- package/dist/page-styles.js +2 -3
- package/dist/program-source.js +14 -2
- package/dist/{exempt-writes.js → program-writes.js} +55 -18
- package/dist/provider.d.ts +142 -0
- package/dist/provider.js +187 -0
- package/dist/providers/_shared/google/result-size.js +57 -0
- package/dist/providers/_shared/google/service-account.d.ts +58 -0
- package/dist/providers/_shared/google/service-account.js +500 -0
- package/dist/providers/_shared/google/workspace.d.ts +276 -0
- package/dist/providers/_shared/google/workspace.js +518 -0
- package/dist/providers/{basecamp.d.ts → basecamp/index.d.ts} +6 -28
- package/dist/providers/basecamp/index.js +997 -0
- package/dist/providers/basecamp/skill.generated.js +9 -0
- package/dist/providers/{breeze.d.ts → breeze/index.d.ts} +2 -2
- package/dist/providers/{breeze.js → breeze/index.js} +184 -140
- package/dist/providers/breeze/skill.generated.js +9 -0
- package/dist/providers/{ccb.d.ts → ccb/index.d.ts} +2 -2
- package/dist/providers/{ccb.js → ccb/index.js} +271 -116
- package/dist/providers/ccb/skill.generated.js +9 -0
- package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
- package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
- package/dist/providers/cloudflare/skill.generated.js +10 -0
- package/dist/providers/docs/index.d.ts +54 -0
- package/dist/providers/docs/index.js +1237 -0
- package/dist/providers/docs/skill.generated.js +9 -0
- package/dist/providers/drive/index.d.ts +53 -0
- package/dist/providers/drive/index.js +1523 -0
- package/dist/providers/drive/skill.generated.js +9 -0
- package/dist/providers/forms/index.d.ts +54 -0
- package/dist/providers/forms/index.js +1217 -0
- package/dist/providers/forms/skill.generated.js +11 -0
- package/dist/providers/github/auth.d.ts +32 -0
- package/dist/providers/github/auth.js +361 -0
- package/dist/providers/github/hosted.js +218 -0
- package/dist/providers/github/index.d.ts +13 -0
- package/dist/providers/github/index.js +140 -0
- package/dist/providers/github/key.js +100 -0
- package/dist/providers/github/rest.js +321 -0
- package/dist/providers/github/scope.d.ts +29 -0
- package/dist/providers/github/scope.js +124 -0
- package/dist/providers/github/skill.generated.js +8 -0
- package/dist/providers/gmail/index.d.ts +51 -0
- package/dist/providers/gmail/index.js +1436 -0
- package/dist/providers/gmail/skill.generated.js +9 -0
- package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
- package/dist/providers/linear/index.js +352 -0
- package/dist/providers/linear/skill.generated.js +8 -0
- package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
- package/dist/providers/mixpanel/index.js +416 -0
- package/dist/providers/mixpanel/skill.generated.js +9 -0
- package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
- package/dist/providers/{notion.js → notion/index.js} +226 -239
- package/dist/providers/notion/skill.generated.js +10 -0
- package/dist/providers/{overflow.d.ts → overflow/index.d.ts} +2 -2
- package/dist/providers/{overflow.js → overflow/index.js} +74 -111
- package/dist/providers/overflow/skill.generated.js +8 -0
- package/dist/providers/{planning-center.d.ts → planning-center/index.d.ts} +2 -2
- package/dist/providers/{planning-center.js → planning-center/index.js} +264 -104
- package/dist/providers/planning-center/skill.generated.js +10 -0
- package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
- package/dist/providers/revenuecat/index.js +557 -0
- package/dist/providers/revenuecat/skill.generated.js +11 -0
- package/dist/providers/sheets/index.d.ts +54 -0
- package/dist/providers/sheets/index.js +1237 -0
- package/dist/providers/sheets/skill.generated.js +10 -0
- package/dist/providers/slides/index.d.ts +53 -0
- package/dist/providers/slides/index.js +2645 -0
- package/dist/providers/slides/skill.generated.js +9 -0
- package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
- package/dist/providers/stripe/index.js +266 -0
- package/dist/providers/stripe/skill.generated.js +11 -0
- package/dist/providers/{tithely.d.ts → tithely/index.d.ts} +2 -2
- package/dist/providers/{tithely.js → tithely/index.js} +60 -91
- package/dist/providers/tithely/skill.generated.js +8 -0
- package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
- package/dist/providers/vercel/index.js +1038 -0
- package/dist/providers/vercel/mcp-ownership.js +212 -0
- package/dist/providers/vercel/skill.generated.js +11 -0
- package/dist/registry.d.ts +108 -171
- package/dist/registry.js +513 -925
- package/dist/request-state.js +21 -0
- package/dist/resource-read.js +100 -0
- package/dist/result-shapes.js +17 -49
- package/dist/retired-toolkits.js +1 -1
- package/dist/routes/access-tokens.js +3 -6
- package/dist/routes/activity-context.js +21 -0
- package/dist/routes/activity-disclosure.js +40 -0
- package/dist/routes/activity.js +59 -21
- package/dist/routes/actor-labels.js +3 -50
- package/dist/routes/connect.js +221 -0
- package/dist/routes/credentials.js +15 -27
- package/dist/routes/mcp.js +356 -130
- package/dist/routes/oauth-client-metadata.js +15 -0
- package/dist/routes/oauth-management.js +45 -107
- package/dist/routes/oauth.js +110 -57
- package/dist/routes/operator.js +3 -3
- package/dist/routes/shared.d.ts +25 -64
- package/dist/routes/shared.js +160 -80
- package/dist/routes/skills.js +30 -0
- package/dist/routes/ui-config.js +225 -0
- package/dist/routes/ui-data.js +40 -35
- package/dist/routes/ui.js +66 -56
- package/dist/runtime/admission.js +4 -2
- package/dist/runtime/call-admission.js +3 -1
- package/dist/runtime/connector-scope.js +1 -4
- package/dist/runtime/run.js +10 -39
- package/dist/runtime/services.js +12 -117
- package/dist/runtime/shared-read.js +1 -3
- package/dist/runtime/storage.js +8 -1
- package/dist/sent-secrets.d.ts +52 -0
- package/dist/sent-secrets.js +474 -0
- package/dist/server.js +28 -71
- package/dist/skills.js +406 -174
- package/dist/sqlite.d.ts +48 -0
- package/dist/sqlite.js +166 -0
- package/dist/storage/keys.js +428 -0
- package/dist/storage/memory.js +7 -0
- package/dist/storage/sql.d.ts +66 -0
- package/dist/storage/sql.js +534 -0
- package/dist/timeout.js +4 -2
- package/dist/tool-name.js +17 -0
- package/dist/tool-safety.d.ts +9 -35
- package/dist/tool-safety.js +20 -40
- package/dist/types.d.ts +320 -54
- package/dist/types.js +0 -1
- package/dist/ui.d.ts +7 -19
- package/dist/ui.js +76 -90
- package/dist/url-safety.js +3 -6
- package/dist/usage-guide.js +137 -0
- package/dist/validate.d.ts +7 -0
- package/dist/validate.js +309 -47
- package/dist/version.d.ts +1 -7
- package/dist/version.js +3 -7
- package/dist/worker.d.ts +11 -0
- package/dist/worker.js +434 -0
- package/documentation/architecture.md +664 -231
- package/documentation/auth.md +936 -546
- package/documentation/code-mode.md +501 -312
- package/documentation/meta-tools.md +449 -200
- package/documentation/operator-tests.md +93 -0
- package/documentation/provider-migration-0.29.md +60 -0
- package/examples/worker/AGENTS.md +34 -12
- package/examples/worker/README.md +286 -255
- package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
- package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
- package/examples/worker/src/connecta.config.ts +151 -0
- package/examples/worker/src/index.ts +14 -197
- package/examples/worker/wrangler.jsonc +15 -35
- package/package.json +120 -54
- package/templates/node/.dockerignore +1 -2
- package/templates/node/.env.example +20 -21
- package/templates/node/AGENTS.md +21 -17
- package/templates/node/Dockerfile +3 -5
- package/templates/node/README.md +133 -58
- package/templates/node/docker-compose.yml +11 -12
- package/templates/node/package.json +4 -2
- package/templates/node/src/connecta.config.ts +119 -0
- package/templates/node/src/index.ts +9 -154
- package/templates/node/src/provision-token.ts +17 -0
- package/AGENTS.md +0 -170
- package/dist/artifacts/connector.d.ts +0 -58
- package/dist/artifacts/connector.js +0 -730
- package/dist/artifacts/document.js +0 -86
- package/dist/artifacts/guide.js +0 -140
- package/dist/artifacts/html-scan.js +0 -329
- package/dist/artifacts/json.js +0 -78
- package/dist/artifacts/kv-store.d.ts +0 -20
- package/dist/artifacts/kv-store.js +0 -140
- package/dist/artifacts/markdown.js +0 -478
- package/dist/artifacts/module.d.ts +0 -37
- package/dist/artifacts/module.js +0 -66
- package/dist/artifacts/operations.d.ts +0 -197
- package/dist/artifacts/operations.js +0 -1002
- package/dist/artifacts/refresh.d.ts +0 -55
- package/dist/artifacts/refresh.js +0 -236
- package/dist/artifacts/routes.js +0 -206
- package/dist/artifacts/types.d.ts +0 -214
- package/dist/artifacts/types.js +0 -22
- package/dist/artifacts/validate.d.ts +0 -62
- package/dist/artifacts/validate.js +0 -651
- package/dist/artifacts.d.ts +0 -6
- package/dist/artifacts.js +0 -9
- package/dist/auth/bearer.d.ts +0 -11
- package/dist/auth/bearer.js +0 -50
- package/dist/providers/basecamp.js +0 -445
- package/dist/providers/linear.js +0 -217
- package/dist/providers/mixpanel.js +0 -247
- package/dist/providers/revenuecat.js +0 -317
- package/dist/providers/stripe.js +0 -253
- package/dist/providers/vercel.js +0 -1253
- package/dist/storage/file.d.ts +0 -15
- package/dist/storage/file.js +0 -455
- package/ethos.md +0 -93
- package/examples/worker/src/cloudflare-kv.ts +0 -43
- package/examples/worker/src/d1-activity-row.ts +0 -155
- package/examples/worker/src/d1-activity.ts +0 -147
- package/examples/worker/src/d1-storage.ts +0 -138
- package/examples/worker/src/r2-artifact-blobs.ts +0 -29
- package/templates/node/src/file-activity.ts +0 -182
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Generated by scripts/generate-providers.mjs; do not edit.
|
|
2
|
+
export const skill = {
|
|
3
|
+
"content": "# Planning Center usage\n\nPlanning Center Online church management — People, Services, Groups, Check-Ins, Calendar, Registrations, Giving, Publishing, Webhooks — for: \n\n## Identity first\n\n- A person id is the join key across every product: the id `search_people` returns is the `personId` for Services schedules, Groups memberships, Giving donations, and Check-Ins. Resolve ids with list tools; never guess one.\n- A person id that used to resolve and now answers `not_found` was most likely merged. Read `/people/v2/person_mergers` with `where[person_to_remove_id]` and follow `person_to_keep_id`.\n- `get_me` names the user this token acts as. Every read and write runs with that user's permissions, product by product; a `provider_permission_denied` means an administrator must grant that user access to the product or record.\n\n## Results and paging\n\n- Records keep Planning Center's own snake_case attribute names; a relationship appears as `<relationship>_id`. Pass `raw: true` for the untouched JSON:API resources and `included`.\n- Lists page by offset: `perPage` up to 100, then pass `page.nextOffset` back as `offset` while `page.hasMore` is true. `page.totalCount` answers \"how many\" without paging — request `perPage: 1`.\n- A bare date in a date filter is the organization's local day; pass a full timestamp for exact bounds. Name filters are exact; end one with `%` for a prefix match.\n- `get_plan` fetches the plan, its items, and its team in one call and sets `itemsTruncated`/`teamMembersTruncated` past 100 rows; page the rest with `pco_api_get`.\n\n## What each product lets the API write\n\n- People: full read/write. `update_person` with `status: inactive` archives reversibly; a DELETE is permanent and only reachable through `pco_api_mutate`. `run_list` can fire list automations.\n- Services: full read/write. A plan's dates come from its plan times. Scheduling needs a team.\n- Groups: memberships and group settings are writable; groups cannot be created, and events and attendance are read-only.\n- Check-Ins and Registrations: read-only. Nobody can be checked in or registered through the API.\n- Calendar: events, instances, and times are read-only; tags, resources, rooms, and folders are writable through `pco_api_mutate`.\n- Giving: the named tools only read, amounts in integer cents. Creating or editing donations, refunds, and committing a batch move money and go through `pco_api_mutate`.\n- Publishing and the `api` product (organization, OAuth applications, personal access tokens) have no named tools; use the hatches.\n\n## The hatches\n\n- `pco_api_get` reaches any GET; `pco_api_mutate` any POST, PATCH, or DELETE, always approval-gated. Paths start `/<app>/v2`, exactly as Planning Center documents them; the connector owns host, auth, content type, and the `X-PCO-API-Version` header.\n- Bodies are JSON:API documents: `{\"data\":{\"type\":\"Email\",\"attributes\":{...}}}`. `null` clears an attribute; an omitted key is left alone.\n- Each product is pinned to a reviewed API version: . Pass `version` only for an endpoint those versions lack.\n- Query parameters are name/value pairs with literal brackets: `where[status]`, `include`, `order`, `filter`, `fields[Person]`. Every list response's `meta` names the `can_query_by`, `can_order_by`, and `can_include` values for that endpoint; an unknown `where` key is ignored rather than refused.\n- File uploads go to a separate host (upload.planningcenteronline.com), which this connection does not reach.\n\n## Rate limits\n\nPlanning Center allows 100 requests per 20 seconds per user, shared by every integration running as that user. This connection admits 100 calls per 20 seconds, five at a time, per runtime — an approximation, not a guarantee. A `rate_limited` failure carries Planning Center's wait. Filter server-side and use `totalCount` rather than paging to count.\n",
|
|
4
|
+
"instructionsHeading": "Organization instructions",
|
|
5
|
+
"fragments": {
|
|
6
|
+
"guide_0": "# Planning Center usage\n\nPlanning Center Online church management — People, Services, Groups, Check-Ins, Calendar, Registrations, Giving, Publishing, Webhooks — for: ",
|
|
7
|
+
"guide_1": "\n\n## Identity first\n\n- A person id is the join key across every product: the id `search_people` returns is the `personId` for Services schedules, Groups memberships, Giving donations, and Check-Ins. Resolve ids with list tools; never guess one.\n- A person id that used to resolve and now answers `not_found` was most likely merged. Read `/people/v2/person_mergers` with `where[person_to_remove_id]` and follow `person_to_keep_id`.\n- `get_me` names the user this token acts as. Every read and write runs with that user's permissions, product by product; a `provider_permission_denied` means an administrator must grant that user access to the product or record.\n\n## Results and paging\n\n- Records keep Planning Center's own snake_case attribute names; a relationship appears as `<relationship>_id`. Pass `raw: true` for the untouched JSON:API resources and `included`.\n- Lists page by offset: `perPage` up to 100, then pass `page.nextOffset` back as `offset` while `page.hasMore` is true. `page.totalCount` answers \"how many\" without paging — request `perPage: 1`.\n- A bare date in a date filter is the organization's local day; pass a full timestamp for exact bounds. Name filters are exact; end one with `%` for a prefix match.\n- `get_plan` fetches the plan, its items, and its team in one call and sets `itemsTruncated`/`teamMembersTruncated` past 100 rows; page the rest with `pco_api_get`.\n\n## What each product lets the API write\n\n- People: full read/write. `update_person` with `status: inactive` archives reversibly; a DELETE is permanent and only reachable through `pco_api_mutate`. `run_list` can fire list automations.\n- Services: full read/write. A plan's dates come from its plan times. Scheduling needs a team.\n- Groups: memberships and group settings are writable; groups cannot be created, and events and attendance are read-only.\n- Check-Ins and Registrations: read-only. Nobody can be checked in or registered through the API.\n- Calendar: events, instances, and times are read-only; tags, resources, rooms, and folders are writable through `pco_api_mutate`.\n- Giving: the named tools only read, amounts in integer cents. Creating or editing donations, refunds, and committing a batch move money and go through `pco_api_mutate`.\n- Publishing and the `api` product (organization, OAuth applications, personal access tokens) have no named tools; use the hatches.\n\n## The hatches\n\n- `pco_api_get` reaches any GET; `pco_api_mutate` any POST, PATCH, or DELETE, always approval-gated. Paths start `/<app>/v2`, exactly as Planning Center documents them; the connector owns host, auth, content type, and the `X-PCO-API-Version` header.\n- Bodies are JSON:API documents: `{\"data\":{\"type\":\"Email\",\"attributes\":{...}}}`. `null` clears an attribute; an omitted key is left alone.\n- Each product is pinned to a reviewed API version: ",
|
|
8
|
+
"guide_2": ". Pass `version` only for an endpoint those versions lack.\n- Query parameters are name/value pairs with literal brackets: `where[status]`, `include`, `order`, `filter`, `fields[Person]`. Every list response's `meta` names the `can_query_by`, `can_order_by`, and `can_include` values for that endpoint; an unknown `where` key is ignored rather than refused.\n- File uploads go to a separate host (upload.planningcenteronline.com), which this connection does not reach.\n\n## Rate limits\n\nPlanning Center allows 100 requests per 20 seconds per user, shared by every integration running as that user. This connection admits 100 calls per 20 seconds, five at a time, per runtime — an approximation, not a guarantee. A `rate_limited` failure carries Planning Center's wait. Filter server-side and use `totalCount` rather than paging to count.\n"
|
|
9
|
+
}
|
|
10
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type RemoteMcpAuth } from "
|
|
2
|
-
import type {
|
|
1
|
+
import { type RemoteMcpAuth } from "../../connectors/remote-mcp.js";
|
|
2
|
+
import type { ConnectorCallAdmissionPolicy } from "../../types.js";
|
|
3
3
|
/** RevenueCat publishes one hosted MCP endpoint, streamable HTTP. */
|
|
4
4
|
export declare const REVENUECAT_MCP_ENDPOINT = "https://mcp.revenuecat.ai/mcp";
|
|
5
5
|
export interface RevenueCatOptions {
|
|
@@ -43,12 +43,7 @@ export interface RevenueCatOptions {
|
|
|
43
43
|
*/
|
|
44
44
|
callAdmission?: ConnectorCallAdmissionPolicy;
|
|
45
45
|
}
|
|
46
|
-
/**
|
|
47
|
-
* One release-reviewed manifest, used both to classify a live tool and as the
|
|
48
|
-
* baseline the drift check compares against, so the annotation a caller gets
|
|
49
|
-
* and the verdict a check reads can never disagree. Names and verdicts only —
|
|
50
|
-
* no schemas are vendored; the live `tools/list` response stays authoritative.
|
|
51
|
-
*/
|
|
52
|
-
export declare const REVENUECAT_VETTED_CATALOG: import("../catalog-drift.js").VettedCatalog;
|
|
53
46
|
/** A maintained RevenueCat hosted-MCP connection. */
|
|
54
|
-
export declare
|
|
47
|
+
export declare const revenuecat: import("../../provider.js").ProviderFactory<RevenueCatOptions>;
|
|
48
|
+
/** @deprecated Read `revenuecat.definition.classify` instead. Kept for existing imports. */
|
|
49
|
+
export declare const REVENUECAT_VETTED_CATALOG: import("../../catalog-drift.js").VettedCatalog;
|
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { skill } from "./skill.generated.js";
|
|
2
|
+
import { remoteMcp, withCredentialDefaults } from "../../connectors/remote-mcp.js";
|
|
3
|
+
import { reviewedCatalog } from "../../catalog-drift.js";
|
|
4
|
+
import { optionsOf } from "../../config-schema.js";
|
|
5
|
+
import { PROVIDER_COMMON, REMOTE_MCP_AUTH } from "../../connectors/option-shapes.js";
|
|
6
|
+
import { defineProvider } from "../../provider.js";
|
|
7
|
+
/** RevenueCat publishes one hosted MCP endpoint, streamable HTTP. */
|
|
8
|
+
export const REVENUECAT_MCP_ENDPOINT = "https://mcp.revenuecat.ai/mcp";
|
|
9
|
+
/**
|
|
10
|
+
* Reviewed in #705's provider audit against https://www.revenuecat.com/docs/tools/mcp/tools-reference.
|
|
11
|
+
* Retains the release-reviewed inventory, including names absent from today's
|
|
12
|
+
* public reference. Live annotations were not reverified without credentials.
|
|
13
|
+
* No schema digest is asserted without a captured schema to review.
|
|
14
|
+
*/
|
|
15
|
+
const REVENUECAT_CLASSIFICATION = {
|
|
16
|
+
tools: {
|
|
17
|
+
"get-account-billing": {
|
|
18
|
+
"verdict": "read",
|
|
19
|
+
"reason": "Retrieves RevenueCat account billing information without changing vendor state.",
|
|
20
|
+
},
|
|
21
|
+
"get-app": { "verdict": "read", "reason": "Retrieves RevenueCat app information without changing vendor state." },
|
|
22
|
+
"get-project-ui-config": {
|
|
23
|
+
"verdict": "read",
|
|
24
|
+
"reason": "Retrieves RevenueCat project ui config information without changing vendor state.",
|
|
25
|
+
},
|
|
26
|
+
"list-account-billing-invoices": {
|
|
27
|
+
"verdict": "read",
|
|
28
|
+
"reason": "Retrieves RevenueCat account billing invoices information without changing vendor state.",
|
|
29
|
+
},
|
|
30
|
+
"list-app-public-api-keys": {
|
|
31
|
+
"verdict": "read",
|
|
32
|
+
"reason": "Retrieves RevenueCat app public api keys information without changing vendor state.",
|
|
33
|
+
},
|
|
34
|
+
"list-apps": {
|
|
35
|
+
"verdict": "read",
|
|
36
|
+
"reason": "Retrieves RevenueCat apps information without changing vendor state.",
|
|
37
|
+
},
|
|
38
|
+
"list-audit-logs": {
|
|
39
|
+
"verdict": "read",
|
|
40
|
+
"reason": "Retrieves RevenueCat audit logs information without changing vendor state.",
|
|
41
|
+
},
|
|
42
|
+
"list-collaborators": {
|
|
43
|
+
"verdict": "read",
|
|
44
|
+
"reason": "Retrieves RevenueCat collaborators information without changing vendor state.",
|
|
45
|
+
},
|
|
46
|
+
"list-projects": {
|
|
47
|
+
"verdict": "read",
|
|
48
|
+
"reason": "Retrieves RevenueCat projects information without changing vendor state.",
|
|
49
|
+
},
|
|
50
|
+
"get-product": {
|
|
51
|
+
"verdict": "read",
|
|
52
|
+
"reason": "Retrieves RevenueCat product information without changing vendor state.",
|
|
53
|
+
},
|
|
54
|
+
"get-product-store-state": {
|
|
55
|
+
"verdict": "read",
|
|
56
|
+
"reason": "Retrieves RevenueCat product store state information without changing vendor state.",
|
|
57
|
+
},
|
|
58
|
+
"get-product-store-state-operation": {
|
|
59
|
+
"verdict": "read",
|
|
60
|
+
"reason": "Retrieves RevenueCat product store state operation information without changing vendor state.",
|
|
61
|
+
},
|
|
62
|
+
"get-product-store-state-plan": {
|
|
63
|
+
"verdict": "read",
|
|
64
|
+
"reason": "Retrieves RevenueCat product store state plan information without changing vendor state.",
|
|
65
|
+
},
|
|
66
|
+
"list-product-store-state-plans": {
|
|
67
|
+
"verdict": "read",
|
|
68
|
+
"reason": "Retrieves RevenueCat product store state plans information without changing vendor state.",
|
|
69
|
+
},
|
|
70
|
+
"list-products": {
|
|
71
|
+
"verdict": "read",
|
|
72
|
+
"reason": "Retrieves RevenueCat products information without changing vendor state.",
|
|
73
|
+
},
|
|
74
|
+
"get-entitlement": {
|
|
75
|
+
"verdict": "read",
|
|
76
|
+
"reason": "Retrieves RevenueCat entitlement information without changing vendor state.",
|
|
77
|
+
},
|
|
78
|
+
"get-products-from-entitlement": {
|
|
79
|
+
"verdict": "read",
|
|
80
|
+
"reason": "Retrieves RevenueCat products from entitlement information without changing vendor state.",
|
|
81
|
+
},
|
|
82
|
+
"list-entitlements": {
|
|
83
|
+
"verdict": "read",
|
|
84
|
+
"reason": "Retrieves RevenueCat entitlements information without changing vendor state.",
|
|
85
|
+
},
|
|
86
|
+
"get-offering": {
|
|
87
|
+
"verdict": "read",
|
|
88
|
+
"reason": "Retrieves RevenueCat offering information without changing vendor state.",
|
|
89
|
+
},
|
|
90
|
+
"get-offering-prices": {
|
|
91
|
+
"verdict": "read",
|
|
92
|
+
"reason": "Retrieves RevenueCat offering prices information without changing vendor state.",
|
|
93
|
+
},
|
|
94
|
+
"list-offerings": {
|
|
95
|
+
"verdict": "read",
|
|
96
|
+
"reason": "Retrieves RevenueCat offerings information without changing vendor state.",
|
|
97
|
+
},
|
|
98
|
+
"list-packages": {
|
|
99
|
+
"verdict": "read",
|
|
100
|
+
"reason": "Retrieves RevenueCat packages information without changing vendor state.",
|
|
101
|
+
},
|
|
102
|
+
"get-audience": {
|
|
103
|
+
"verdict": "read",
|
|
104
|
+
"reason": "Retrieves RevenueCat audience information without changing vendor state.",
|
|
105
|
+
},
|
|
106
|
+
"get-audience-filter-options": {
|
|
107
|
+
"verdict": "read",
|
|
108
|
+
"reason": "Retrieves RevenueCat audience filter options information without changing vendor state.",
|
|
109
|
+
},
|
|
110
|
+
"get-targeting-rule": {
|
|
111
|
+
"verdict": "read",
|
|
112
|
+
"reason": "Retrieves RevenueCat targeting rule information without changing vendor state.",
|
|
113
|
+
},
|
|
114
|
+
"list-audiences": {
|
|
115
|
+
"verdict": "read",
|
|
116
|
+
"reason": "Retrieves RevenueCat audiences information without changing vendor state.",
|
|
117
|
+
},
|
|
118
|
+
"list-targeting-rules": {
|
|
119
|
+
"verdict": "read",
|
|
120
|
+
"reason": "Retrieves RevenueCat targeting rules information without changing vendor state.",
|
|
121
|
+
},
|
|
122
|
+
"get-paywall": {
|
|
123
|
+
"verdict": "read",
|
|
124
|
+
"reason": "Retrieves RevenueCat paywall information without changing vendor state.",
|
|
125
|
+
},
|
|
126
|
+
"list-paywalls": {
|
|
127
|
+
"verdict": "read",
|
|
128
|
+
"reason": "Retrieves RevenueCat paywalls information without changing vendor state.",
|
|
129
|
+
},
|
|
130
|
+
"get-customer": {
|
|
131
|
+
"verdict": "read",
|
|
132
|
+
"reason": "Retrieves RevenueCat customer information without changing vendor state.",
|
|
133
|
+
},
|
|
134
|
+
"get-customer-center-config": {
|
|
135
|
+
"verdict": "read",
|
|
136
|
+
"reason": "Retrieves RevenueCat customer center config information without changing vendor state.",
|
|
137
|
+
},
|
|
138
|
+
"get-refund-request-preferences": {
|
|
139
|
+
"verdict": "read",
|
|
140
|
+
"reason": "Retrieves RevenueCat refund request preferences information without changing vendor state.",
|
|
141
|
+
},
|
|
142
|
+
"get-subscription": {
|
|
143
|
+
"verdict": "read",
|
|
144
|
+
"reason": "Retrieves RevenueCat subscription information without changing vendor state.",
|
|
145
|
+
},
|
|
146
|
+
"list-customer-events": {
|
|
147
|
+
"verdict": "read",
|
|
148
|
+
"reason": "Retrieves RevenueCat customer events information without changing vendor state.",
|
|
149
|
+
},
|
|
150
|
+
"list-customers": {
|
|
151
|
+
"verdict": "read",
|
|
152
|
+
"reason": "Retrieves RevenueCat customers information without changing vendor state.",
|
|
153
|
+
},
|
|
154
|
+
"list-purchases": {
|
|
155
|
+
"verdict": "read",
|
|
156
|
+
"reason": "Retrieves RevenueCat purchases information without changing vendor state.",
|
|
157
|
+
},
|
|
158
|
+
"list-subscriptions": {
|
|
159
|
+
"verdict": "read",
|
|
160
|
+
"reason": "Retrieves RevenueCat subscriptions information without changing vendor state.",
|
|
161
|
+
},
|
|
162
|
+
"list-virtual-currencies-balances": {
|
|
163
|
+
"verdict": "read",
|
|
164
|
+
"reason": "Retrieves RevenueCat virtual currencies balances information without changing vendor state.",
|
|
165
|
+
},
|
|
166
|
+
"get-virtual-currency": {
|
|
167
|
+
"verdict": "read",
|
|
168
|
+
"reason": "Retrieves RevenueCat virtual currency information without changing vendor state.",
|
|
169
|
+
},
|
|
170
|
+
"list-virtual-currencies": {
|
|
171
|
+
"verdict": "read",
|
|
172
|
+
"reason": "Retrieves RevenueCat virtual currencies information without changing vendor state.",
|
|
173
|
+
},
|
|
174
|
+
"get-benchmarks": {
|
|
175
|
+
"verdict": "read",
|
|
176
|
+
"reason": "Retrieves RevenueCat benchmarks information without changing vendor state.",
|
|
177
|
+
},
|
|
178
|
+
"get-chart-data": {
|
|
179
|
+
"verdict": "read",
|
|
180
|
+
"reason": "Retrieves RevenueCat chart data information without changing vendor state.",
|
|
181
|
+
},
|
|
182
|
+
"get-chart-options-schema": {
|
|
183
|
+
"verdict": "read",
|
|
184
|
+
"reason": "Retrieves RevenueCat chart options schema information without changing vendor state.",
|
|
185
|
+
},
|
|
186
|
+
"get-experiment": {
|
|
187
|
+
"verdict": "read",
|
|
188
|
+
"reason": "Retrieves RevenueCat experiment information without changing vendor state.",
|
|
189
|
+
},
|
|
190
|
+
"get-experiment-results": {
|
|
191
|
+
"verdict": "read",
|
|
192
|
+
"reason": "Retrieves RevenueCat experiment results information without changing vendor state.",
|
|
193
|
+
},
|
|
194
|
+
"get-overview-metrics": {
|
|
195
|
+
"verdict": "read",
|
|
196
|
+
"reason": "Retrieves RevenueCat overview metrics information without changing vendor state.",
|
|
197
|
+
},
|
|
198
|
+
"get-revenue-metric": {
|
|
199
|
+
"verdict": "read",
|
|
200
|
+
"reason": "Retrieves RevenueCat revenue metric information without changing vendor state.",
|
|
201
|
+
},
|
|
202
|
+
"list-experiments": {
|
|
203
|
+
"verdict": "read",
|
|
204
|
+
"reason": "Retrieves RevenueCat experiments information without changing vendor state.",
|
|
205
|
+
},
|
|
206
|
+
"get-webhook-integration": {
|
|
207
|
+
"verdict": "read",
|
|
208
|
+
"reason": "Retrieves RevenueCat webhook integration information without changing vendor state.",
|
|
209
|
+
},
|
|
210
|
+
"list-webhook-integrations": {
|
|
211
|
+
"verdict": "read",
|
|
212
|
+
"reason": "Retrieves RevenueCat webhook integrations information without changing vendor state.",
|
|
213
|
+
},
|
|
214
|
+
"list-sdk-feature-gates": {
|
|
215
|
+
"verdict": "read",
|
|
216
|
+
"reason": "Retrieves RevenueCat sdk feature gates information without changing vendor state.",
|
|
217
|
+
},
|
|
218
|
+
"list-sdk-versions": {
|
|
219
|
+
"verdict": "read",
|
|
220
|
+
"reason": "Retrieves RevenueCat sdk versions information without changing vendor state.",
|
|
221
|
+
},
|
|
222
|
+
"get-paywall-ai-task": {
|
|
223
|
+
"verdict": "read",
|
|
224
|
+
"reason": "Retrieves RevenueCat paywall ai task information without changing vendor state.",
|
|
225
|
+
},
|
|
226
|
+
"create-app": {
|
|
227
|
+
"verdict": "write",
|
|
228
|
+
"reason": "create app creates or appends RevenueCat state; it has side effects.",
|
|
229
|
+
},
|
|
230
|
+
"create-project": {
|
|
231
|
+
"verdict": "write",
|
|
232
|
+
"reason": "create project creates or appends RevenueCat state; it has side effects.",
|
|
233
|
+
},
|
|
234
|
+
"update-app": { "verdict": "destructive", "reason": "update app changes existing RevenueCat state or removes it." },
|
|
235
|
+
"update-project-ui-config": {
|
|
236
|
+
"verdict": "destructive",
|
|
237
|
+
"reason": "update project ui config changes existing RevenueCat state or removes it.",
|
|
238
|
+
},
|
|
239
|
+
"validate-app-credentials": {
|
|
240
|
+
"verdict": "write",
|
|
241
|
+
"reason": "validate app credentials creates or appends RevenueCat state; it has side effects.",
|
|
242
|
+
},
|
|
243
|
+
"archive-product": {
|
|
244
|
+
"verdict": "destructive",
|
|
245
|
+
"reason": "archive product changes existing RevenueCat state or removes it.",
|
|
246
|
+
},
|
|
247
|
+
"create-product": {
|
|
248
|
+
"verdict": "write",
|
|
249
|
+
"reason": "create product creates or appends RevenueCat state; it has side effects.",
|
|
250
|
+
},
|
|
251
|
+
"create-product-prices": {
|
|
252
|
+
"verdict": "destructive",
|
|
253
|
+
"reason": "create product prices changes existing RevenueCat state or removes it.",
|
|
254
|
+
},
|
|
255
|
+
"equalize-subscription-prices": {
|
|
256
|
+
"verdict": "write",
|
|
257
|
+
"reason": "equalize subscription prices creates or appends RevenueCat state; it has side effects.",
|
|
258
|
+
},
|
|
259
|
+
"set-product-store-state": {
|
|
260
|
+
"verdict": "destructive",
|
|
261
|
+
"reason": "set product store state changes existing RevenueCat state or removes it.",
|
|
262
|
+
},
|
|
263
|
+
"submit-products-to-store": {
|
|
264
|
+
"verdict": "destructive",
|
|
265
|
+
"reason": "submit products to store changes existing RevenueCat state or removes it.",
|
|
266
|
+
},
|
|
267
|
+
"unarchive-product": {
|
|
268
|
+
"verdict": "destructive",
|
|
269
|
+
"reason": "unarchive product changes existing RevenueCat state or removes it.",
|
|
270
|
+
},
|
|
271
|
+
"update-product": {
|
|
272
|
+
"verdict": "destructive",
|
|
273
|
+
"reason": "update product changes existing RevenueCat state or removes it.",
|
|
274
|
+
},
|
|
275
|
+
"upload-product-store-state-screenshot": {
|
|
276
|
+
"verdict": "write",
|
|
277
|
+
"reason": "upload product store state screenshot creates or appends RevenueCat state; it has side effects.",
|
|
278
|
+
},
|
|
279
|
+
"create-product-store-state-plan": {
|
|
280
|
+
"verdict": "write",
|
|
281
|
+
"reason": "create product store state plan creates or appends RevenueCat state; it has side effects.",
|
|
282
|
+
},
|
|
283
|
+
"plan-product-store-state-plan": {
|
|
284
|
+
"verdict": "destructive",
|
|
285
|
+
"reason": "Advances a store-state plan workflow and can create asynchronous task state.",
|
|
286
|
+
},
|
|
287
|
+
"apply-product-store-state-plan": {
|
|
288
|
+
"verdict": "destructive",
|
|
289
|
+
"reason": "Applies a plan to store configuration and can change existing products.",
|
|
290
|
+
},
|
|
291
|
+
"update-product-store-state-plan": {
|
|
292
|
+
"verdict": "destructive",
|
|
293
|
+
"reason": "update product store state plan changes existing RevenueCat state or removes it.",
|
|
294
|
+
},
|
|
295
|
+
"discard-product-store-state-plan": {
|
|
296
|
+
"verdict": "destructive",
|
|
297
|
+
"reason": "discard product store state plan changes existing RevenueCat state or removes it.",
|
|
298
|
+
},
|
|
299
|
+
"archive-entitlement": {
|
|
300
|
+
"verdict": "destructive",
|
|
301
|
+
"reason": "archive entitlement changes existing RevenueCat state or removes it.",
|
|
302
|
+
},
|
|
303
|
+
"attach-products-to-entitlement": {
|
|
304
|
+
"verdict": "write",
|
|
305
|
+
"reason": "attach products to entitlement creates or appends RevenueCat state; it has side effects.",
|
|
306
|
+
},
|
|
307
|
+
"create-entitlement": {
|
|
308
|
+
"verdict": "write",
|
|
309
|
+
"reason": "create entitlement creates or appends RevenueCat state; it has side effects.",
|
|
310
|
+
},
|
|
311
|
+
"detach-products-from-entitlement": {
|
|
312
|
+
"verdict": "destructive",
|
|
313
|
+
"reason": "detach products from entitlement changes existing RevenueCat state or removes it.",
|
|
314
|
+
},
|
|
315
|
+
"unarchive-entitlement": {
|
|
316
|
+
"verdict": "destructive",
|
|
317
|
+
"reason": "unarchive entitlement changes existing RevenueCat state or removes it.",
|
|
318
|
+
},
|
|
319
|
+
"update-entitlement": {
|
|
320
|
+
"verdict": "destructive",
|
|
321
|
+
"reason": "update entitlement changes existing RevenueCat state or removes it.",
|
|
322
|
+
},
|
|
323
|
+
"archive-offering": {
|
|
324
|
+
"verdict": "destructive",
|
|
325
|
+
"reason": "archive offering changes existing RevenueCat state or removes it.",
|
|
326
|
+
},
|
|
327
|
+
"attach-products-to-package": {
|
|
328
|
+
"verdict": "write",
|
|
329
|
+
"reason": "attach products to package creates or appends RevenueCat state; it has side effects.",
|
|
330
|
+
},
|
|
331
|
+
"create-offering": {
|
|
332
|
+
"verdict": "write",
|
|
333
|
+
"reason": "create offering creates or appends RevenueCat state; it has side effects.",
|
|
334
|
+
},
|
|
335
|
+
"create-packages": {
|
|
336
|
+
"verdict": "write",
|
|
337
|
+
"reason": "create packages creates or appends RevenueCat state; it has side effects.",
|
|
338
|
+
},
|
|
339
|
+
"delete-package-from-offering": {
|
|
340
|
+
"verdict": "destructive",
|
|
341
|
+
"reason": "delete package from offering changes existing RevenueCat state or removes it.",
|
|
342
|
+
},
|
|
343
|
+
"detach-products-from-package": {
|
|
344
|
+
"verdict": "destructive",
|
|
345
|
+
"reason": "detach products from package changes existing RevenueCat state or removes it.",
|
|
346
|
+
},
|
|
347
|
+
"unarchive-offering": {
|
|
348
|
+
"verdict": "destructive",
|
|
349
|
+
"reason": "unarchive offering changes existing RevenueCat state or removes it.",
|
|
350
|
+
},
|
|
351
|
+
"update-offering": {
|
|
352
|
+
"verdict": "destructive",
|
|
353
|
+
"reason": "update offering changes existing RevenueCat state or removes it.",
|
|
354
|
+
},
|
|
355
|
+
"create-audience": {
|
|
356
|
+
"verdict": "write",
|
|
357
|
+
"reason": "create audience creates or appends RevenueCat state; it has side effects.",
|
|
358
|
+
},
|
|
359
|
+
"update-audience": {
|
|
360
|
+
"verdict": "destructive",
|
|
361
|
+
"reason": "update audience changes existing RevenueCat state or removes it.",
|
|
362
|
+
},
|
|
363
|
+
"create-targeting-rule": {
|
|
364
|
+
"verdict": "write",
|
|
365
|
+
"reason": "create targeting rule creates or appends RevenueCat state; it has side effects.",
|
|
366
|
+
},
|
|
367
|
+
"update-targeting-rule": {
|
|
368
|
+
"verdict": "destructive",
|
|
369
|
+
"reason": "update targeting rule changes existing RevenueCat state or removes it.",
|
|
370
|
+
},
|
|
371
|
+
"delete-targeting-rule": {
|
|
372
|
+
"verdict": "destructive",
|
|
373
|
+
"reason": "delete targeting rule changes existing RevenueCat state or removes it.",
|
|
374
|
+
},
|
|
375
|
+
"attach-offering-to-paywall": {
|
|
376
|
+
"verdict": "destructive",
|
|
377
|
+
"reason": "attach offering to paywall changes existing RevenueCat state or removes it.",
|
|
378
|
+
},
|
|
379
|
+
"detach-offering-from-paywall": {
|
|
380
|
+
"verdict": "destructive",
|
|
381
|
+
"reason": "detach offering from paywall changes existing RevenueCat state or removes it.",
|
|
382
|
+
},
|
|
383
|
+
"duplicate-paywall": {
|
|
384
|
+
"verdict": "write",
|
|
385
|
+
"reason": "duplicate paywall creates or appends RevenueCat state; it has side effects.",
|
|
386
|
+
},
|
|
387
|
+
"publish-paywall": {
|
|
388
|
+
"verdict": "destructive",
|
|
389
|
+
"reason": "publish paywall changes existing RevenueCat state or removes it.",
|
|
390
|
+
},
|
|
391
|
+
"unpublish-paywall": {
|
|
392
|
+
"verdict": "destructive",
|
|
393
|
+
"reason": "unpublish paywall changes existing RevenueCat state or removes it.",
|
|
394
|
+
},
|
|
395
|
+
"duplicate-offering": {
|
|
396
|
+
"verdict": "write",
|
|
397
|
+
"reason": "duplicate offering creates or appends RevenueCat state; it has side effects.",
|
|
398
|
+
},
|
|
399
|
+
"create-experiment": {
|
|
400
|
+
"verdict": "write",
|
|
401
|
+
"reason": "create experiment creates or appends RevenueCat state; it has side effects.",
|
|
402
|
+
},
|
|
403
|
+
"pause-experiment": {
|
|
404
|
+
"verdict": "destructive",
|
|
405
|
+
"reason": "pause experiment changes existing RevenueCat state or removes it.",
|
|
406
|
+
},
|
|
407
|
+
"resume-experiment": {
|
|
408
|
+
"verdict": "destructive",
|
|
409
|
+
"reason": "resume experiment changes existing RevenueCat state or removes it.",
|
|
410
|
+
},
|
|
411
|
+
"start-experiment": {
|
|
412
|
+
"verdict": "destructive",
|
|
413
|
+
"reason": "start experiment changes existing RevenueCat state or removes it.",
|
|
414
|
+
},
|
|
415
|
+
"stop-experiment": {
|
|
416
|
+
"verdict": "destructive",
|
|
417
|
+
"reason": "stop experiment changes existing RevenueCat state or removes it.",
|
|
418
|
+
},
|
|
419
|
+
"update-experiment": {
|
|
420
|
+
"verdict": "destructive",
|
|
421
|
+
"reason": "update experiment changes existing RevenueCat state or removes it.",
|
|
422
|
+
},
|
|
423
|
+
"assign-customer-offering": {
|
|
424
|
+
"verdict": "destructive",
|
|
425
|
+
"reason": "assign customer offering changes existing RevenueCat state or removes it.",
|
|
426
|
+
},
|
|
427
|
+
"grant-customer-entitlement": {
|
|
428
|
+
"verdict": "destructive",
|
|
429
|
+
"reason": "grant customer entitlement changes existing RevenueCat state or removes it.",
|
|
430
|
+
},
|
|
431
|
+
"archive-virtual-currency": {
|
|
432
|
+
"verdict": "destructive",
|
|
433
|
+
"reason": "archive virtual currency changes existing RevenueCat state or removes it.",
|
|
434
|
+
},
|
|
435
|
+
"create-virtual-currency": {
|
|
436
|
+
"verdict": "write",
|
|
437
|
+
"reason": "create virtual currency creates or appends RevenueCat state; it has side effects.",
|
|
438
|
+
},
|
|
439
|
+
"unarchive-virtual-currency": {
|
|
440
|
+
"verdict": "destructive",
|
|
441
|
+
"reason": "unarchive virtual currency changes existing RevenueCat state or removes it.",
|
|
442
|
+
},
|
|
443
|
+
"update-virtual-currency": {
|
|
444
|
+
"verdict": "destructive",
|
|
445
|
+
"reason": "update virtual currency changes existing RevenueCat state or removes it.",
|
|
446
|
+
},
|
|
447
|
+
"create-webhook-integration": {
|
|
448
|
+
"verdict": "destructive",
|
|
449
|
+
"reason": "Starts delivering customer events to a caller-supplied URL; omitted filters deliver every customer event in the project. Destructive by consequence even though it creates a new integration.",
|
|
450
|
+
},
|
|
451
|
+
"delete-webhook-integration": {
|
|
452
|
+
"verdict": "destructive",
|
|
453
|
+
"reason": "delete webhook integration changes existing RevenueCat state or removes it.",
|
|
454
|
+
},
|
|
455
|
+
"update-webhook-integration": {
|
|
456
|
+
"verdict": "destructive",
|
|
457
|
+
"reason": "update webhook integration changes existing RevenueCat state or removes it.",
|
|
458
|
+
},
|
|
459
|
+
"create-paywall-ai": {
|
|
460
|
+
"verdict": "write",
|
|
461
|
+
"reason": "create paywall ai creates or appends RevenueCat state; it has side effects.",
|
|
462
|
+
},
|
|
463
|
+
"edit-paywall-ai": {
|
|
464
|
+
"verdict": "destructive",
|
|
465
|
+
"reason": "edit paywall ai changes existing RevenueCat state or removes it.",
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
/** The catalog's summary bound; a longer declared value throws (`src/registry.ts`). */
|
|
470
|
+
const SUMMARY_BUDGET = 120;
|
|
471
|
+
/**
|
|
472
|
+
* Fit a purpose-bearing summary inside the catalog's bound.
|
|
473
|
+
*
|
|
474
|
+
* Stripe and Mixpanel declare static summaries because their routing fact is
|
|
475
|
+
* an enumerable variant. RevenueCat's is not: two `sk_` connectors have the
|
|
476
|
+
* same title, the same endpoint, and the same catalog, and differ only by the
|
|
477
|
+
* project the operator says each key reaches. So the summary carries that, and
|
|
478
|
+
* clipping is this function's job rather than the operator's.
|
|
479
|
+
*/
|
|
480
|
+
function boundedSummary(prefix, purpose) {
|
|
481
|
+
const full = `${prefix}${purpose}`;
|
|
482
|
+
if (full.length <= SUMMARY_BUDGET)
|
|
483
|
+
return full;
|
|
484
|
+
return `${full.slice(0, SUMMARY_BUDGET - 1).trimEnd()}…`;
|
|
485
|
+
}
|
|
486
|
+
function sharedUsageGuide() {
|
|
487
|
+
return skill.fragments.guide_0;
|
|
488
|
+
}
|
|
489
|
+
function oauthUsageGuide(purpose, instructions) {
|
|
490
|
+
const projectInstructions = instructions?.trim();
|
|
491
|
+
return `${skill.fragments.guide_1}${purpose}${skill.fragments.guide_2}${sharedUsageGuide()}${projectInstructions ? `\n## ${skill.instructionsHeading}\n\n${projectInstructions}\n` : ""}`;
|
|
492
|
+
}
|
|
493
|
+
function keyUsageGuide(purpose, instructions) {
|
|
494
|
+
const projectInstructions = instructions?.trim();
|
|
495
|
+
return `# RevenueCat usage
|
|
496
|
+
|
|
497
|
+
Single-project connection: ${purpose}${skill.fragments.guide_3}${sharedUsageGuide()}${projectInstructions ? `\n## ${skill.instructionsHeading}\n\n${projectInstructions}\n` : ""}`;
|
|
498
|
+
}
|
|
499
|
+
/** The closed options revenuecat() accepts; see `assertKnownOptions`. */
|
|
500
|
+
const REVENUECAT_OPTIONS = optionsOf()({ ...PROVIDER_COMMON, auth: REMOTE_MCP_AUTH });
|
|
501
|
+
/** A maintained RevenueCat hosted-MCP connection. */
|
|
502
|
+
export const revenuecat = defineProvider({
|
|
503
|
+
name: "revenuecat",
|
|
504
|
+
title: "RevenueCat",
|
|
505
|
+
kind: "mcp",
|
|
506
|
+
readme: "RevenueCat",
|
|
507
|
+
bundle: { "baselineGzip": 128548, "maxGzip": 188548 },
|
|
508
|
+
skill,
|
|
509
|
+
options: REVENUECAT_OPTIONS,
|
|
510
|
+
classify: REVENUECAT_CLASSIFICATION,
|
|
511
|
+
create: revenuecatConnector,
|
|
512
|
+
});
|
|
513
|
+
function revenuecatConnector(id, options, provider) {
|
|
514
|
+
const purpose = options.purpose.trim();
|
|
515
|
+
const auth = withCredentialDefaults(options.auth ?? { type: "oauth" }, {
|
|
516
|
+
credential: {
|
|
517
|
+
label: "API v2 secret key",
|
|
518
|
+
description: "A RevenueCat API v2 secret key. It reaches exactly one project, which is why two projects are two connectors; it is stored encrypted and never displayed.",
|
|
519
|
+
placeholder: "sk_…",
|
|
520
|
+
},
|
|
521
|
+
});
|
|
522
|
+
// Both static shapes reach one project. Where the key came from — the
|
|
523
|
+
// deployment file or the operator page — changes nothing an agent must know
|
|
524
|
+
// about scope, so the title, description, and guide follow the scope alone.
|
|
525
|
+
const scoped = auth.type !== "oauth";
|
|
526
|
+
const connector = remoteMcp(id, {
|
|
527
|
+
url: REVENUECAT_MCP_ENDPOINT,
|
|
528
|
+
...provider.connectorOptions,
|
|
529
|
+
// The scope shape rides the title because browse-time discovery renders
|
|
530
|
+
// the title and the guide summary and nothing else, and reaching one
|
|
531
|
+
// project versus every project the account has is the fact an agent must
|
|
532
|
+
// not get wrong between two RevenueCat connections.
|
|
533
|
+
title: options.title ?? (scoped ? "RevenueCat (single project)" : "RevenueCat"),
|
|
534
|
+
description: scoped
|
|
535
|
+
? `RevenueCat subscriptions and revenue (one project, static key) — ${purpose}`
|
|
536
|
+
: `RevenueCat subscriptions and revenue (every project the account can reach) — ${purpose}`,
|
|
537
|
+
auth,
|
|
538
|
+
requireHttps: true,
|
|
539
|
+
classify: provider.classify,
|
|
540
|
+
usageGuide: {
|
|
541
|
+
content: scoped ? keyUsageGuide(purpose, options.instructions) : oauthUsageGuide(purpose, options.instructions),
|
|
542
|
+
// Explicit rather than derived, and purpose-bearing rather than static:
|
|
543
|
+
// the derived summary would cut the scoping sentence mid-clause at 120
|
|
544
|
+
// characters, and two static summaries would leave two `sk_` connectors
|
|
545
|
+
// indistinguishable in the one field search returns (P3).
|
|
546
|
+
summary: scoped
|
|
547
|
+
? boundedSummary("One project only: ", purpose)
|
|
548
|
+
: boundedSummary("All account projects; list-projects first: ", purpose),
|
|
549
|
+
// Not `required`. RevenueCat's own schemas describe each call; the guide
|
|
550
|
+
// carries the project-resolution sequence, which is worth reading before
|
|
551
|
+
// a run rather than before every call.
|
|
552
|
+
},
|
|
553
|
+
});
|
|
554
|
+
return connector;
|
|
555
|
+
}
|
|
556
|
+
/** @deprecated Read `revenuecat.definition.classify` instead. Kept for existing imports. */
|
|
557
|
+
export const REVENUECAT_VETTED_CATALOG = reviewedCatalog(revenuecat.definition.classify, 'defineProvider("revenuecat")');
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Generated by scripts/generate-providers.mjs; do not edit.
|
|
2
|
+
export const skill = {
|
|
3
|
+
"content": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- Store changes ride the plan workflow, not the deprecated direct tools: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. RevenueCat gates parts of its MCP catalog by plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `render-paywall-screenshot` is unclassified on purpose because RevenueCat's reference gives it no access column. An explicit, uncontradicted live read annotation qualifies it as a read; otherwise it fails closed as a write. The public reference alone cannot establish that rendering has no side effects.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Treat every create, update, archive, unarchive, attach, detach, delete, publish, unpublish, grant, assign, and submit operation as a write. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: \n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n. RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key is issued read-only or write-enabled, and connecta cannot tell which this one is. It does not filter writes for a read-only key: every write is offered, reaches RevenueCat, and fails there in RevenueCat's own words. Read that refusal as \"this key cannot write\" rather than as a bad argument, and route the write to a connector configured with a write-enabled key.\n",
|
|
4
|
+
"instructionsHeading": "Project instructions",
|
|
5
|
+
"fragments": {
|
|
6
|
+
"guide_0": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- Store changes ride the plan workflow, not the deprecated direct tools: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. RevenueCat gates parts of its MCP catalog by plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `render-paywall-screenshot` is unclassified on purpose because RevenueCat's reference gives it no access column. An explicit, uncontradicted live read annotation qualifies it as a read; otherwise it fails closed as a write. The public reference alone cannot establish that rendering has no side effects.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Treat every create, update, archive, unarchive, attach, detach, delete, publish, unpublish, grant, assign, and submit operation as a write. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n",
|
|
7
|
+
"guide_1": "# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: ",
|
|
8
|
+
"guide_2": "\n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n",
|
|
9
|
+
"guide_3": ". RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key is issued read-only or write-enabled, and connecta cannot tell which this one is. It does not filter writes for a read-only key: every write is offered, reaches RevenueCat, and fails there in RevenueCat's own words. Read that refusal as \"this key cannot write\" rather than as a bad argument, and route the write to a connector configured with a write-enabled key.\n"
|
|
10
|
+
}
|
|
11
|
+
};
|