better-supabase 0.5.1 → 0.6.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/README.md +187 -46
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/{actor-DaJjqD5R.d.ts → actor-CQTlc1Hh.d.ts} +1 -1
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-C_A-KEAz.js → doctor-B4JOm_ox.js} +991 -317
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-DMa6M7hV.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect-BKlaIu_M.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-Bo_NLT5n.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BCtlgDQx.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-Bv7gvfzC.d.ts → config-D44Y7PAv.d.ts} +406 -214
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-CFPX0Qft.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-BiJZ4t49.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/{impersonation-BgSHAYLf.js → impersonation-DcqaTBHx.js} +21 -6
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/mfa-Daak8ukG.d.ts +54 -0
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bn6HNKUe.js → resolve-D_IcnvFd.js} +248 -240
- package/dist/{impersonation-BmePsuxz.d.ts → resolve-KW8nCeL6.d.ts} +29 -69
- package/dist/{resource-mqfJW4YF.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-DNRFP7KR.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -22
- package/dist/server/index.js +46 -14
- package/dist/{respond-BR1fJWOB.d.ts → server-CeVeeXwz.d.ts} +224 -85
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +313 -212
- package/dist/sql/index.js +34872 -6579
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-wHnK6zp-.js → support-BivNqSpK.js} +32 -11
- package/dist/{support-view-B8SlToQX.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +315 -41
- package/dist/testing/index.js +1046 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DOYTYwHP.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-CbgObAeb.d.ts → view-DbxLNu8L.d.ts} +22 -5
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +461 -20
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +20 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +47 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-CIdSQZad.js +0 -2
- package/dist/cli/gen-CjElD1Vw.js +0 -2241
- package/dist/cli/read-sets-VQcPgxU9.js +0 -436
- package/dist/cli/sql-CVx-1O8G.js +0 -373
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/index-CWMDdEr4.d.ts +0 -50
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dp2VDwog.d.ts +0 -161
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/mfa-Cu96oJdw.d.ts +0 -30
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-B1mZ7CgQ.js +0 -660
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-CEPwlw2G.d.ts +0 -89
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -122
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as BetterSupabase } from "../define-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { L as TableKey, a as AnyModels, i as AnyFunctions } from "../types-6BdhkmZe.js";
|
|
2
|
+
import { t as BetterSupabase } from "../define-CJJkkr1-.js";
|
|
3
|
+
import { i as ServerContext, o as ServerOptions, t as BetterServer } from "../server-CeVeeXwz.js";
|
|
4
|
+
import { r as GuardOptions } from "../respond-DoBijysA.js";
|
|
5
|
+
import { i as ResourceOperation } from "../index-Bxih3l0u.js";
|
|
6
|
+
import { a as ResourceRouteOptions } from "../resource-D6Uc7Sk7.js";
|
|
6
7
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
7
8
|
//#region src/mcp/mcp.d.ts
|
|
8
9
|
export declare const MCP_PROTOCOL_VERSION: string;
|
|
@@ -39,7 +40,7 @@ interface McpTool<M extends AnyModels, F extends AnyFunctions, E, C = unknown, P
|
|
|
39
40
|
/** What the `authorize` and `visible` hooks see of a tool. */
|
|
40
41
|
interface ToolRef {
|
|
41
42
|
readonly info: ToolInfo;
|
|
42
|
-
/** The tool's `meta`, e.g. a
|
|
43
|
+
/** The tool's `meta`, e.g. a permission. For table tools, the resource's `meta` for that operation. */
|
|
43
44
|
readonly meta: unknown;
|
|
44
45
|
}
|
|
45
46
|
/** The outcome of `authorize`. `scopes` turns a refusal into an OAuth challenge. */
|
|
@@ -70,7 +71,7 @@ interface ToolDefinition<M extends AnyModels, F extends AnyFunctions, E, I, C =
|
|
|
70
71
|
/** A table's tools: the REST resource options, plus `meta` per operation for `authorize` and `visible`. */
|
|
71
72
|
type ToolResourceOptions<M extends AnyModels, T extends TableKey<M>> = ResourceRouteOptions<M, T> & {
|
|
72
73
|
/**
|
|
73
|
-
* Opaque data per operation, e.g. a
|
|
74
|
+
* Opaque data per operation, e.g. a permission, passed to
|
|
74
75
|
* `authorize` and `visible` as the table tool's `meta`. Never sent to
|
|
75
76
|
* clients. An operation without an entry gets `undefined`.
|
|
76
77
|
*/
|
|
@@ -88,10 +89,14 @@ interface McpOptions<M extends AnyModels, F extends AnyFunctions, E, C = unknown
|
|
|
88
89
|
readonly tools?: readonly McpTool<M, F, E, C, P>[];
|
|
89
90
|
/**
|
|
90
91
|
* Canonical URL of this MCP server (RFC 9728 `resource`). Defaults to the
|
|
91
|
-
* request URL without query
|
|
92
|
+
* request URL without query; on Supabase Edge Functions, to the public
|
|
93
|
+
* `<origin>/functions/v1/<slug>` the gateway forwards.
|
|
92
94
|
*/
|
|
93
95
|
readonly resource?: string | ((request: Request) => string);
|
|
94
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Defaults to Supabase Auth of `env.url` (`<url>/auth/v1`); on Supabase Edge
|
|
98
|
+
* Functions, to Auth on the public origin.
|
|
99
|
+
*/
|
|
95
100
|
readonly authorizationServers?: readonly string[];
|
|
96
101
|
/**
|
|
97
102
|
* Scopes the tools need, published as RFC 9728 `scopes_supported` and in
|
|
@@ -99,15 +104,32 @@ interface McpOptions<M extends AnyModels, F extends AnyFunctions, E, C = unknown
|
|
|
99
104
|
* tokens are between the client and the authorization server.
|
|
100
105
|
*/
|
|
101
106
|
readonly advertisedScopes?: readonly string[];
|
|
102
|
-
/** @deprecated Use `advertisedScopes`; `requiredScopes` is what `guard` enforces. */
|
|
103
|
-
readonly scopes?: readonly string[];
|
|
104
107
|
/**
|
|
105
108
|
* Scopes a delegated token (an OAuth client or an `act` chain) needs to call
|
|
106
109
|
* the server at all. A missing one answers 403 `insufficient_scope`.
|
|
107
110
|
*/
|
|
108
111
|
readonly requiredScopes?: readonly string[];
|
|
112
|
+
/**
|
|
113
|
+
* Roles a signed-in user needs to call the server at all, read from a
|
|
114
|
+
* claim (`app_metadata.role` by default; a string or an array of
|
|
115
|
+
* strings). Users without one get 403; service-role callers pass.
|
|
116
|
+
*
|
|
117
|
+
* ```ts
|
|
118
|
+
* requiredRoles: { roles: ['admin', 'support'], claim: 'app_metadata.roles' }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
readonly requiredRoles?: readonly string[] | {
|
|
122
|
+
readonly roles: readonly string[];
|
|
123
|
+
readonly claim?: string;
|
|
124
|
+
};
|
|
109
125
|
/** Origins allowed to call the server (DNS rebinding protection). Defaults to any. */
|
|
110
126
|
readonly allowedOrigins?: readonly string[];
|
|
127
|
+
/**
|
|
128
|
+
* Answers CORS preflights and adds `Access-Control-*` headers, so browser
|
|
129
|
+
* MCP clients can call the server. The allowed origin is `allowedOrigins`
|
|
130
|
+
* when set, any origin otherwise. Defaults to true.
|
|
131
|
+
*/
|
|
132
|
+
readonly cors?: boolean;
|
|
111
133
|
/**
|
|
112
134
|
* Hostnames the `Host` header may name, without the port (DNS rebinding
|
|
113
135
|
* protection). List the production, preview and local hosts. Defaults to any.
|
|
@@ -119,6 +141,11 @@ interface McpOptions<M extends AnyModels, F extends AnyFunctions, E, C = unknown
|
|
|
119
141
|
readonly json?: Readonly<Record<string, unknown>>;
|
|
120
142
|
/** Include internal error messages in tool results. Defaults to `NODE_ENV === 'development'`. */
|
|
121
143
|
readonly exposeErrors?: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Keeps the invocation alive for event sink sends a tool started, e.g.
|
|
146
|
+
* `EdgeRuntime.waitUntil` or Next's `after`.
|
|
147
|
+
*/
|
|
148
|
+
readonly waitUntil?: (promise: Promise<unknown>) => void;
|
|
122
149
|
/**
|
|
123
150
|
* Decides each `tools/call` after the arguments are validated and before
|
|
124
151
|
* `run`. `args` are the validated arguments (raw for table tools, which
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { n as dbError } from "../errors-
|
|
1
|
+
import { n as dbError } from "../errors-B11Duf73.js";
|
|
2
2
|
import { t as base64ToText } from "../base64-D2gsioCY.js";
|
|
3
|
-
import {
|
|
4
|
-
import { a as problemResponse, o as toProblem } from "../problem-
|
|
5
|
-
import { t as SPEC_PINS } from "../spec-pins
|
|
6
|
-
import { t as buildJsonSchema } from "../json-schema-
|
|
7
|
-
import {
|
|
8
|
-
import { t as
|
|
9
|
-
import {
|
|
3
|
+
import { n as validate } from "../standard-BK0cqJ7y.js";
|
|
4
|
+
import { a as problemResponse, o as toProblem } from "../problem-BreOl8b8.js";
|
|
5
|
+
import { t as SPEC_PINS } from "../spec-pins--j6mTok4.js";
|
|
6
|
+
import { t as buildJsonSchema } from "../json-schema-CvER4kgT.js";
|
|
7
|
+
import { c as extendServer, l as withExtra, n as flushEvents, s as createServer } from "../adapter-Bc1o3zyy.js";
|
|
8
|
+
import { n as jsonResponse, t as jsonReplacer } from "../json-CEnpTHlZ.js";
|
|
9
|
+
import { o as settle, r as guard, t as defaultExpose } from "../respond-BUgsXNgk.js";
|
|
10
|
+
import { t as defineResource } from "../resource-BsvzCMlX.js";
|
|
11
|
+
import { r as hasRole } from "../kit-Fm-Fv7q5.js";
|
|
12
|
+
import { a as withCors, i as metadataPreflight, n as endpointPreflight, r as isMetadataRequest, t as discovery } from "../http-DdYadv-o.js";
|
|
13
|
+
import { resourceMetadataResponse, unauthorizedResponse } from "@supabase/server/oauth-protected-resource";
|
|
10
14
|
//#region src/mcp/mcp.ts
|
|
11
15
|
const MCP_PROTOCOL_VERSION = SPEC_PINS.mcp;
|
|
12
|
-
const WELL_KNOWN = "/.well-known/oauth-protected-resource";
|
|
13
16
|
/** Revisions before 2026-07-28 open with an `initialize` handshake. */
|
|
14
17
|
const LEGACY_VERSIONS = [
|
|
15
18
|
"2025-11-25",
|
|
@@ -17,9 +20,8 @@ const LEGACY_VERSIONS = [
|
|
|
17
20
|
"2025-03-26"
|
|
18
21
|
];
|
|
19
22
|
const SUPPORTED_VERSIONS = [MCP_PROTOCOL_VERSION, ...LEGACY_VERSIONS];
|
|
20
|
-
/** The
|
|
21
|
-
function hostAllowed(
|
|
22
|
-
const host = request.headers.get("host");
|
|
23
|
+
/** The host's hostname is in the list; a missing or malformed host is not. */
|
|
24
|
+
function hostAllowed(host, allowed) {
|
|
23
25
|
if (!host) return false;
|
|
24
26
|
try {
|
|
25
27
|
return allowed.includes(new URL(`http://${host}`).hostname);
|
|
@@ -27,6 +29,16 @@ function hostAllowed(request, allowed) {
|
|
|
27
29
|
return false;
|
|
28
30
|
}
|
|
29
31
|
}
|
|
32
|
+
/** The refusal for a caller without one of `required`'s roles. */
|
|
33
|
+
function missingRole(auth, required) {
|
|
34
|
+
if (!required || auth.kind === "service") return void 0;
|
|
35
|
+
const { roles, claim } = "roles" in required ? required : {
|
|
36
|
+
roles: required,
|
|
37
|
+
claim: void 0
|
|
38
|
+
};
|
|
39
|
+
if (roles.length === 0 || hasRole(auth, roles, claim)) return void 0;
|
|
40
|
+
return dbError("forbidden", `This server needs the role ${roles.join(" or ")}`, { code: "MISSING_ROLE" });
|
|
41
|
+
}
|
|
30
42
|
/** A custom tool. Pass it in `createMcp({ tools: [...] })`. */
|
|
31
43
|
function defineTool(definition) {
|
|
32
44
|
if (!/^[A-Za-z0-9_.-]{1,64}$/.test(definition.name)) throw new TypeError(`Invalid tool name "${definition.name}": use 1-64 letters, digits, "_", "-" or "."`);
|
|
@@ -184,6 +196,8 @@ const META_CAPABILITIES = "io.modelcontextprotocol/clientCapabilities";
|
|
|
184
196
|
const META_SERVER_INFO = "io.modelcontextprotocol/serverInfo";
|
|
185
197
|
/** How long clients may cache `tools/list` and `server/discover` (per token). */
|
|
186
198
|
const LIST_TTL_MS = 3e5;
|
|
199
|
+
/** Callers whose visible tool lists are kept; the oldest goes first. */
|
|
200
|
+
const VISIBLE_LISTS_MAX = 1e3;
|
|
187
201
|
function rpcError(id, code, message, status = 200, data) {
|
|
188
202
|
return Response.json({
|
|
189
203
|
jsonrpc: "2.0",
|
|
@@ -221,10 +235,6 @@ function textResult(value, isError = false) {
|
|
|
221
235
|
...isError ? { isError: true } : {}
|
|
222
236
|
};
|
|
223
237
|
}
|
|
224
|
-
function canonical(request) {
|
|
225
|
-
const url = new URL(request.url);
|
|
226
|
-
return `${url.origin}${url.pathname.replace(/\/$/, "")}`;
|
|
227
|
-
}
|
|
228
238
|
/**
|
|
229
239
|
* An MCP server (Streamable HTTP, stateless) whose tools run as the caller:
|
|
230
240
|
* the Bearer token from the MCP client is verified and every query goes
|
|
@@ -240,10 +250,13 @@ function createMcp(betterSupabase, options) {
|
|
|
240
250
|
})["$defs"];
|
|
241
251
|
const registry = /* @__PURE__ */ new Map();
|
|
242
252
|
let allTools;
|
|
253
|
+
/** Bumped on every registration, so cached visible lists built before it miss. */
|
|
254
|
+
let generation = 0;
|
|
243
255
|
const register = (entry) => {
|
|
244
256
|
if (registry.has(entry.info.name)) throw new TypeError(`Duplicate MCP tool "${entry.info.name}"`);
|
|
245
257
|
registry.set(entry.info.name, entry);
|
|
246
258
|
allTools = void 0;
|
|
259
|
+
generation++;
|
|
247
260
|
};
|
|
248
261
|
const failure = (error) => textResult(toProblem(error, { expose }), true);
|
|
249
262
|
const refused = async (tool, args, ctx) => {
|
|
@@ -308,25 +321,38 @@ function createMcp(betterSupabase, options) {
|
|
|
308
321
|
};
|
|
309
322
|
for (const tool of options.tools ?? []) addTool(tool);
|
|
310
323
|
const listTools = () => allTools ??= [...registry.values()].map((entry) => entry.info);
|
|
324
|
+
/**
|
|
325
|
+
* A user's visible list per token, for as long as clients may cache it
|
|
326
|
+
* (`ttlMs`). `tools/call` still checks `visible` on every call.
|
|
327
|
+
*/
|
|
328
|
+
const visibleLists = /* @__PURE__ */ new Map();
|
|
311
329
|
/** Without a `visible` hook every caller sees the same list, built once. */
|
|
312
330
|
const visibleTools = async (context) => {
|
|
313
331
|
if (!options.visible) return listTools();
|
|
314
332
|
const ctx = context();
|
|
333
|
+
const token = ctx.auth.kind === "user" ? ctx.auth.token : void 0;
|
|
334
|
+
const now = Date.now();
|
|
335
|
+
const cached = token === void 0 ? void 0 : visibleLists.get(token);
|
|
336
|
+
if (cached && cached.until > now && cached.generation === generation) return cached.tools;
|
|
315
337
|
const entries = [...registry.values()];
|
|
316
338
|
const shown = await Promise.all(entries.map((entry) => isVisible(entry, ctx)));
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
339
|
+
const tools = entries.filter((_, index) => shown[index]).map((e) => e.info);
|
|
340
|
+
if (token !== void 0) {
|
|
341
|
+
visibleLists.delete(token);
|
|
342
|
+
if (visibleLists.size >= VISIBLE_LISTS_MAX) {
|
|
343
|
+
const oldest = visibleLists.keys().next();
|
|
344
|
+
if (!oldest.done) visibleLists.delete(oldest.value);
|
|
345
|
+
}
|
|
346
|
+
visibleLists.set(token, {
|
|
347
|
+
tools,
|
|
348
|
+
until: now + LIST_TTL_MS,
|
|
349
|
+
generation
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return tools;
|
|
329
353
|
};
|
|
354
|
+
const urls = discovery(options, () => server.env.url);
|
|
355
|
+
const { metadataUrl } = urls;
|
|
330
356
|
const invoke = async (name, args, ctx, checkVisible = true) => {
|
|
331
357
|
const entry = registry.get(name);
|
|
332
358
|
try {
|
|
@@ -341,7 +367,7 @@ function createMcp(betterSupabase, options) {
|
|
|
341
367
|
const outcome = await invoke(name, args, ctx);
|
|
342
368
|
return isRefusal(outcome) ? failure(dbError("forbidden", outcome.refusal)) : outcome;
|
|
343
369
|
};
|
|
344
|
-
const scopes = (options.advertisedScopes ??
|
|
370
|
+
const scopes = (options.advertisedScopes ?? []).filter((scope) => scope !== "offline_access");
|
|
345
371
|
const serverInfo = {
|
|
346
372
|
name: options.name,
|
|
347
373
|
version: options.version,
|
|
@@ -390,19 +416,28 @@ function createMcp(betterSupabase, options) {
|
|
|
390
416
|
if (sent === null || headerName(sent) !== name) return mismatch(`Mcp-Name must be ${name}`);
|
|
391
417
|
}
|
|
392
418
|
};
|
|
419
|
+
const cors = options.cors ?? true;
|
|
393
420
|
const endpoint = async (request) => {
|
|
421
|
+
const response = await answer(request);
|
|
422
|
+
flushEvents(server, options.waitUntil);
|
|
423
|
+
return cors ? withCors(response, request, options.allowedOrigins) : response;
|
|
424
|
+
};
|
|
425
|
+
const answer = async (request) => {
|
|
394
426
|
const origin = request.headers.get("origin");
|
|
395
427
|
if (origin && options.allowedOrigins && !options.allowedOrigins.includes(origin)) return rpcError(null, INVALID_REQUEST, "Origin not allowed", 403);
|
|
396
|
-
if (options.allowedHosts && !hostAllowed(request, options.allowedHosts)) return rpcError(null, INVALID_REQUEST, "Host not allowed", 403);
|
|
428
|
+
if (options.allowedHosts && !hostAllowed(urls.host(request), options.allowedHosts)) return rpcError(null, INVALID_REQUEST, "Host not allowed", 403);
|
|
429
|
+
if (request.method === "OPTIONS" && cors) return endpointPreflight(request, options.allowedOrigins);
|
|
397
430
|
if (request.method !== "POST") return new Response(null, {
|
|
398
431
|
status: 405,
|
|
399
|
-
headers: { allow: "POST" }
|
|
432
|
+
headers: { allow: cors ? "POST, OPTIONS" : "POST" }
|
|
400
433
|
});
|
|
401
434
|
const header = request.headers.get("mcp-protocol-version");
|
|
402
435
|
if (header && !SUPPORTED_VERSIONS.includes(header)) return unsupportedVersion(null, header);
|
|
403
436
|
const ctx = await server.context(request, { cookies: false });
|
|
404
437
|
const denied = guard(ctx.auth, options.allow, options.aal, options.requiredScopes);
|
|
405
438
|
if (denied) return refuse(request, denied);
|
|
439
|
+
const roleDenied = missingRole(ctx.auth, options.requiredRoles);
|
|
440
|
+
if (roleDenied) return refuse(request, roleDenied);
|
|
406
441
|
let message;
|
|
407
442
|
try {
|
|
408
443
|
message = await request.json();
|
|
@@ -470,13 +505,21 @@ function createMcp(betterSupabase, options) {
|
|
|
470
505
|
default: return notFound();
|
|
471
506
|
}
|
|
472
507
|
};
|
|
473
|
-
const metadata = (request) =>
|
|
474
|
-
resource
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
508
|
+
const metadata = (request) => {
|
|
509
|
+
const resource = urls.resource(request);
|
|
510
|
+
const authorizationServers = [...urls.authorizationServers(request)];
|
|
511
|
+
if (scopes.length === 0 && options.resourceDocumentation === void 0) return resourceMetadataResponse(request, {
|
|
512
|
+
resource,
|
|
513
|
+
authorizationServers
|
|
514
|
+
});
|
|
515
|
+
return Response.json({
|
|
516
|
+
resource,
|
|
517
|
+
authorization_servers: authorizationServers,
|
|
518
|
+
bearer_methods_supported: ["header"],
|
|
519
|
+
...scopes.length > 0 ? { scopes_supported: scopes } : {},
|
|
520
|
+
...options.resourceDocumentation === void 0 ? {} : { resource_documentation: options.resourceDocumentation }
|
|
521
|
+
}, { headers: { "access-control-allow-origin": "*" } });
|
|
522
|
+
};
|
|
480
523
|
const mcp = extendServer(server, {
|
|
481
524
|
get tools() {
|
|
482
525
|
return [...listTools()];
|
|
@@ -489,14 +532,7 @@ function createMcp(betterSupabase, options) {
|
|
|
489
532
|
endpoint,
|
|
490
533
|
metadata,
|
|
491
534
|
fetch(request) {
|
|
492
|
-
|
|
493
|
-
if (pathname.startsWith(WELL_KNOWN)) return Promise.resolve(request.method === "OPTIONS" ? new Response(null, {
|
|
494
|
-
status: 204,
|
|
495
|
-
headers: {
|
|
496
|
-
"access-control-allow-origin": "*",
|
|
497
|
-
"access-control-allow-methods": "GET"
|
|
498
|
-
}
|
|
499
|
-
}) : metadata(request));
|
|
535
|
+
if (isMetadataRequest(request)) return Promise.resolve(request.method === "OPTIONS" ? metadataPreflight() : metadata(request));
|
|
500
536
|
return endpoint(request);
|
|
501
537
|
}
|
|
502
538
|
});
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { a as AnyModels, i as AnyFunctions } from "../../types-6BdhkmZe.js";
|
|
2
|
+
import { r as AuthState } from "../../resolve-KW8nCeL6.js";
|
|
3
|
+
import { t as BetterSupabase } from "../../define-CJJkkr1-.js";
|
|
4
|
+
import { i as ServerContext$1, o as ServerOptions, t as BetterServer } from "../../server-CeVeeXwz.js";
|
|
5
|
+
import { r as GuardOptions, t as AllowedCaller } from "../../respond-DoBijysA.js";
|
|
6
|
+
import { AuthInfo, CallToolResult, Icon, InputRequiredResult, OAuthTokenVerifier, RegisteredTool, ScopeChallengeHandler, ServerContext, StandardSchemaWithJSON, ToolAnnotations } from "@modelcontextprotocol/server";
|
|
7
|
+
//#region src/mcp/sdk/sdk.d.ts
|
|
8
|
+
interface McpAuthOptions extends ServerOptions, Omit<GuardOptions, "scopes"> {
|
|
9
|
+
/**
|
|
10
|
+
* The MCP endpoint's public URL, the RFC 9728 `resource`. Defaults to the
|
|
11
|
+
* request URL without a trailing slash, and on Supabase Edge Functions to
|
|
12
|
+
* the public `<origin>/functions/v1/<slug>`; pass it when a proxy rewrites
|
|
13
|
+
* the host or path.
|
|
14
|
+
*/
|
|
15
|
+
readonly resource?: string | ((request: Request) => string);
|
|
16
|
+
/** Defaults to the project's Supabase Auth issuer. */
|
|
17
|
+
readonly authorizationServers?: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* Answers CORS preflights in `serve` and adds `Access-Control-*` headers
|
|
20
|
+
* (any origin), so browser MCP clients can call the server. Defaults to true.
|
|
21
|
+
*/
|
|
22
|
+
readonly cors?: boolean;
|
|
23
|
+
/** Scopes published as `scopes_supported`; `offline_access` is never listed. */
|
|
24
|
+
readonly advertisedScopes?: readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* Scopes a delegated token (an OAuth client) needs; one without them gets a
|
|
27
|
+
* 403 `insufficient_scope` challenge. The user's own session is not limited.
|
|
28
|
+
*/
|
|
29
|
+
readonly requiredScopes?: readonly string[];
|
|
30
|
+
/** Published as `resource_documentation`. */
|
|
31
|
+
readonly resourceDocumentation?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Keeps the invocation alive for event sink sends a tool started, e.g.
|
|
34
|
+
* `EdgeRuntime.waitUntil` or Next's `after`.
|
|
35
|
+
*/
|
|
36
|
+
readonly waitUntil?: (promise: Promise<unknown>) => void;
|
|
37
|
+
}
|
|
38
|
+
/** A fetch handler that takes verified auth, like the SDK's `createMcpHandler(...)`. */
|
|
39
|
+
interface McpFetchHandler {
|
|
40
|
+
fetch(request: Request, options?: {
|
|
41
|
+
readonly authInfo?: AuthInfo;
|
|
42
|
+
}): Promise<Response>;
|
|
43
|
+
}
|
|
44
|
+
interface BetterMcpAuth<M extends AnyModels = AnyModels, F extends AnyFunctions = AnyFunctions, E = unknown, C = unknown, P = unknown> extends BetterServer<M, F, E, C, P> {
|
|
45
|
+
/** An `OAuthTokenVerifier` for the SDK's bearer helpers; it verifies the token locally. */
|
|
46
|
+
readonly verifier: OAuthTokenVerifier;
|
|
47
|
+
/** The RFC 9728 Protected Resource Metadata document. */
|
|
48
|
+
metadata(request: Request): Response;
|
|
49
|
+
/** Where the metadata is served, for `WWW-Authenticate` challenges. */
|
|
50
|
+
metadataUrl(request: Request): string;
|
|
51
|
+
/**
|
|
52
|
+
* A fetch handler that serves the metadata, refuses callers without a
|
|
53
|
+
* valid bearer token (401 or 403 with an RFC 9728 challenge), then calls
|
|
54
|
+
* `handler.fetch(request, { authInfo })`.
|
|
55
|
+
*/
|
|
56
|
+
serve(handler: McpFetchHandler): (request: Request) => Promise<Response>;
|
|
57
|
+
/** The caller's context for a tool call, from `ctx.http.authInfo`. */
|
|
58
|
+
contextOf(ctx: ServerContext): Promise<ServerContext$1<M, F, E, C, P>>;
|
|
59
|
+
}
|
|
60
|
+
/** What `withBetterSupabaseMcp` adds to the SDK's tool context. */
|
|
61
|
+
interface BetterToolExtra<M extends AnyModels = AnyModels, F extends AnyFunctions = AnyFunctions, E = unknown, C = unknown, P = unknown> {
|
|
62
|
+
/** Repositories bound to the verified caller, with RLS. */
|
|
63
|
+
readonly db: ServerContext$1<M, F, E, C, P>["db"];
|
|
64
|
+
readonly auth: AuthState<C, P>;
|
|
65
|
+
/** The full server context: `db`, `auth`, `supabase` and the rest. */
|
|
66
|
+
readonly bs: ServerContext$1<M, F, E, C, P>;
|
|
67
|
+
}
|
|
68
|
+
type BetterToolContext<M extends AnyModels = AnyModels, F extends AnyFunctions = AnyFunctions, E = unknown, C = unknown, P = unknown> = ServerContext & BetterToolExtra<M, F, E, C, P>;
|
|
69
|
+
interface BetterToolConfig<InputArgs extends StandardSchemaWithJSON | undefined, OutputArgs extends StandardSchemaWithJSON | undefined> {
|
|
70
|
+
readonly title?: string;
|
|
71
|
+
readonly description?: string;
|
|
72
|
+
readonly inputSchema?: InputArgs;
|
|
73
|
+
readonly outputSchema?: OutputArgs;
|
|
74
|
+
readonly annotations?: ToolAnnotations;
|
|
75
|
+
readonly icons?: Icon[];
|
|
76
|
+
readonly scopeChallenge?: ScopeChallengeHandler;
|
|
77
|
+
readonly _meta?: Record<string, unknown>;
|
|
78
|
+
/** Extra keys for wrappers registered in between, such as an authorization library's `permission`. */
|
|
79
|
+
readonly [key: string]: unknown;
|
|
80
|
+
}
|
|
81
|
+
type ToolReturn = CallToolResult | InputRequiredResult | Promise<CallToolResult | InputRequiredResult>;
|
|
82
|
+
type BetterToolCallback<InputArgs extends StandardSchemaWithJSON | undefined, Ctx> = InputArgs extends StandardSchemaWithJSON ? (args: StandardSchemaWithJSON.InferOutput<InputArgs>, ctx: Ctx) => ToolReturn : (ctx: Ctx) => ToolReturn;
|
|
83
|
+
/** An SDK server whose tool callbacks also get `db`, `auth` and `bs`. */
|
|
84
|
+
type BetterMcpServer<S, M extends AnyModels = AnyModels, F extends AnyFunctions = AnyFunctions, E = unknown, C = unknown, P = unknown> = Omit<S, "registerTool"> & {
|
|
85
|
+
registerTool<OutputArgs extends StandardSchemaWithJSON | undefined = undefined, InputArgs extends StandardSchemaWithJSON | undefined = undefined>(name: string, config: BetterToolConfig<InputArgs, OutputArgs>, cb: BetterToolCallback<InputArgs, BetterToolContext<M, F, E, C, P>>): RegisteredTool;
|
|
86
|
+
};
|
|
87
|
+
/** The structural part of `McpServer` (or a wrapper of it) that `withBetterSupabaseMcp` needs. */
|
|
88
|
+
interface ToolRegistrar {
|
|
89
|
+
registerTool(name: string, config: never, cb: (...params: never[]) => unknown): unknown;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Bearer auth for an MCP server built on the official SDK
|
|
93
|
+
* (`@modelcontextprotocol/server` 2.3 or later). Verifies Supabase access
|
|
94
|
+
* tokens locally, serves the RFC 9728 metadata, and binds repositories to
|
|
95
|
+
* the caller. Pair it with `withBetterSupabaseMcp` and `createMcpHandler`.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createMcpAuth<M extends AnyModels, D, F extends AnyFunctions, E, C = unknown, P = unknown>(betterSupabase: BetterSupabase<M, D, F, E, C, P>, options?: McpAuthOptions): BetterMcpAuth<M, F, E, C, P>;
|
|
98
|
+
/**
|
|
99
|
+
* Wraps `server.registerTool` so every tool callback gets `db`, `auth` and
|
|
100
|
+
* `bs` for the caller on its context. Wrap after an authorization wrapper
|
|
101
|
+
* so permissions are checked before the context is built.
|
|
102
|
+
*/
|
|
103
|
+
export declare function withBetterSupabaseMcp<S extends ToolRegistrar, M extends AnyModels, F extends AnyFunctions, E, C, P>(server: S, auth: Pick<BetterMcpAuth<M, F, E, C, P>, "contextOf">): BetterMcpServer<S, M, F, E, C, P>;
|
|
104
|
+
//#endregion
|
|
105
|
+
export type { AllowedCaller, BetterMcpAuth, BetterMcpServer, BetterToolCallback, BetterToolConfig, BetterToolContext, BetterToolExtra, GuardOptions, McpAuthOptions, McpFetchHandler, ToolRegistrar };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { o as delegationOf } from "../../impersonation-DcqaTBHx.js";
|
|
2
|
+
import { c as extendServer, i as resolveToken, l as withExtra, n as flushEvents, s as createServer } from "../../adapter-Bc1o3zyy.js";
|
|
3
|
+
import { r as guard } from "../../respond-BUgsXNgk.js";
|
|
4
|
+
import { a as withCors, i as metadataPreflight, n as endpointPreflight, r as isMetadataRequest, t as discovery } from "../../http-DdYadv-o.js";
|
|
5
|
+
import { OAuthError, bearerAuthChallengeResponse, verifyBearerToken } from "@modelcontextprotocol/server";
|
|
6
|
+
//#region src/mcp/sdk/sdk.ts
|
|
7
|
+
const STATE_KEY = "betterSupabase";
|
|
8
|
+
function claimString(claims, key) {
|
|
9
|
+
const value = claims[key];
|
|
10
|
+
return typeof value === "string" ? value : void 0;
|
|
11
|
+
}
|
|
12
|
+
function isUserState(value, verified) {
|
|
13
|
+
return typeof value === "object" && value !== null && verified.has(value) && "kind" in value && value.kind === "user";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Bearer auth for an MCP server built on the official SDK
|
|
17
|
+
* (`@modelcontextprotocol/server` 2.3 or later). Verifies Supabase access
|
|
18
|
+
* tokens locally, serves the RFC 9728 metadata, and binds repositories to
|
|
19
|
+
* the caller. Pair it with `withBetterSupabaseMcp` and `createMcpHandler`.
|
|
20
|
+
*/
|
|
21
|
+
function createMcpAuth(betterSupabase, options = {}) {
|
|
22
|
+
const server = createServer(betterSupabase, options);
|
|
23
|
+
/** Auth states this instance verified and guarded; any other `AuthInfo.extra` is ignored. */
|
|
24
|
+
const verified = /* @__PURE__ */ new WeakSet();
|
|
25
|
+
const allow = options.allow ?? ["user"];
|
|
26
|
+
const scopes = options.requiredScopes ?? [];
|
|
27
|
+
const advertised = (options.advertisedScopes ?? []).filter((scope) => scope !== "offline_access");
|
|
28
|
+
const urls = discovery(options, () => server.env.url);
|
|
29
|
+
const { metadataUrl } = urls;
|
|
30
|
+
const cors = options.cors ?? true;
|
|
31
|
+
const metadata = (request) => Response.json({
|
|
32
|
+
resource: urls.resource(request),
|
|
33
|
+
authorization_servers: [...urls.authorizationServers(request)],
|
|
34
|
+
bearer_methods_supported: ["header"],
|
|
35
|
+
...advertised.length > 0 ? { scopes_supported: advertised } : {},
|
|
36
|
+
...options.resourceDocumentation === void 0 ? {} : { resource_documentation: options.resourceDocumentation }
|
|
37
|
+
}, { headers: { "access-control-allow-origin": "*" } });
|
|
38
|
+
const verifier = { async verifyAccessToken(token) {
|
|
39
|
+
const auth = await resolveToken(server, token);
|
|
40
|
+
if (auth.kind !== "user") throw new OAuthError("invalid_token", "The access token is not valid");
|
|
41
|
+
const denied = guard(auth, allow, options.aal, scopes);
|
|
42
|
+
if (denied) throw new OAuthError(denied.kind === "unauthorized" ? "invalid_token" : "insufficient_scope", denied.message);
|
|
43
|
+
verified.add(auth);
|
|
44
|
+
const exp = auth.claims.exp;
|
|
45
|
+
return {
|
|
46
|
+
token,
|
|
47
|
+
clientId: claimString(auth.claims, "client_id") ?? claimString(auth.claims, "azp") ?? "",
|
|
48
|
+
scopes: [...delegationOf(auth.claims)?.scopes ?? []],
|
|
49
|
+
...auth.expiresAt === null ? typeof exp === "number" ? { expiresAt: exp } : {} : { expiresAt: auth.expiresAt },
|
|
50
|
+
extra: { [STATE_KEY]: auth }
|
|
51
|
+
};
|
|
52
|
+
} };
|
|
53
|
+
const anon = {
|
|
54
|
+
kind: "anon",
|
|
55
|
+
reason: "none"
|
|
56
|
+
};
|
|
57
|
+
const contextOf = async (ctx) => {
|
|
58
|
+
const info = ctx.http?.authInfo;
|
|
59
|
+
const state = info?.extra?.[STATE_KEY];
|
|
60
|
+
if (isUserState(state, verified)) return server.contextFor(state);
|
|
61
|
+
if (info?.token) {
|
|
62
|
+
const auth = await resolveToken(server, info.token);
|
|
63
|
+
const allowed = auth.kind === "user" && guard(auth, allow, options.aal, scopes) === void 0;
|
|
64
|
+
return server.contextFor(allowed ? auth : anon);
|
|
65
|
+
}
|
|
66
|
+
return server.contextFor(anon);
|
|
67
|
+
};
|
|
68
|
+
const serve = (handler) => async (request) => {
|
|
69
|
+
if (isMetadataRequest(request)) return request.method === "OPTIONS" ? metadataPreflight() : metadata(request);
|
|
70
|
+
if (cors && request.method === "OPTIONS") return endpointPreflight(request);
|
|
71
|
+
const response = await answer(handler, request);
|
|
72
|
+
flushEvents(server, options.waitUntil);
|
|
73
|
+
return cors ? withCors(response, request) : response;
|
|
74
|
+
};
|
|
75
|
+
const answer = async (handler, request) => {
|
|
76
|
+
const header = request.headers.get("authorization");
|
|
77
|
+
if (!header && allow.includes("anon")) return handler.fetch(request);
|
|
78
|
+
const resourceMetadataUrl = metadataUrl(request);
|
|
79
|
+
try {
|
|
80
|
+
const authInfo = await verifyBearerToken(header, {
|
|
81
|
+
verifier,
|
|
82
|
+
resourceMetadataUrl
|
|
83
|
+
});
|
|
84
|
+
return await handler.fetch(request, { authInfo });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (!(error instanceof OAuthError)) throw error;
|
|
87
|
+
return bearerAuthChallengeResponse(error, {
|
|
88
|
+
resourceMetadataUrl,
|
|
89
|
+
...scopes.length > 0 || advertised.length > 0 ? { requiredScopes: [.../* @__PURE__ */ new Set([...advertised, ...scopes])] } : {}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return extendServer(server, {
|
|
94
|
+
verifier,
|
|
95
|
+
metadata,
|
|
96
|
+
metadataUrl,
|
|
97
|
+
serve,
|
|
98
|
+
contextOf
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Wraps `server.registerTool` so every tool callback gets `db`, `auth` and
|
|
103
|
+
* `bs` for the caller on its context. Wrap after an authorization wrapper
|
|
104
|
+
* so permissions are checked before the context is built.
|
|
105
|
+
*/
|
|
106
|
+
function withBetterSupabaseMcp(server, auth) {
|
|
107
|
+
const register = server.registerTool.bind(server);
|
|
108
|
+
const registerTool = (name, config, cb) => register(name, config, async (...params) => {
|
|
109
|
+
const ctx = params.at(-1);
|
|
110
|
+
const bs = await auth.contextOf(ctx);
|
|
111
|
+
const extended = withExtra(ctx, {
|
|
112
|
+
db: bs.db,
|
|
113
|
+
auth: bs.auth,
|
|
114
|
+
bs
|
|
115
|
+
});
|
|
116
|
+
return cb(...params.slice(0, -1), extended);
|
|
117
|
+
});
|
|
118
|
+
Object.defineProperty(server, "registerTool", {
|
|
119
|
+
value: registerTool,
|
|
120
|
+
configurable: true,
|
|
121
|
+
writable: true
|
|
122
|
+
});
|
|
123
|
+
return server;
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
export { createMcpAuth, withBetterSupabaseMcp };
|