Catalog integrity

MCP does not invent component source. It copies published catalog files and stamps a header. Privacy, terms, cookies, and licence pages are not added to that tree — they arrive separately via get_site_profile. If a catalog file would leave our hands changed in any other way, delivery is refused.

What we check before a file is sent

  1. Allowlist. MCP may name component ids that exist in this registry, a project name, and a repo name. Unknown ids are rejected. Extra MCP fields are ignored.
  2. Source lock. Each component file is copied from the published catalog. After we strip our stamp the bytes must match the catalog SHA-256 below. If they do not, we do not return the build.
  3. Mutation allowlist. Catalog files may only gain a stamp header. INTEGRITY.json is generated, not cloned, and is listed as such. Dashboard legal copy is not part of this tree.
  4. No payload execution. We never eval MCP arguments. Subscriber licence and GDPR text is returned only through get_site_profile as document bodies, not spliced into catalog component source.

How you check a clone

  1. Open the public catalog at github.com/botkelp or copy a file from a component page here.
  2. SHA-256 the file. If it is generated output, strip the BotKelp header first (or paste it below — we strip it for you).
  3. Compare that digest to the table. A generated project also includes INTEGRITY.json with the same hashes and a pass/fail verdict from the delivery check.

Matching a hash means those bytes are the catalog we publish. It is not a security audit of the component’s dependencies or of code you add later.

Check a file

Published SHA-256

248 files in botkelp/components. Hashes are of the catalog bytes as published, before a per-delivery stamp.

angular-base

  • .browserslistrcsha256:67d5bec2b6bc337e
  • .gitignoresha256:bfc94fbd89511ff0
  • angular.jsonsha256:ab7ba8ba4b01b411
  • package.jsonsha256:2c3c5346543e7663
  • README.mdsha256:71c570d307e6f4b5
  • src/app/app.component.htmlsha256:9377ed54151e472f
  • src/app/app.component.tssha256:5fa39aa441fe253c
  • src/app/app.config.tssha256:79a9d4fe653d0629
  • src/app/app.routes.tssha256:9e994862a25f31af
  • src/environments/environment.prod.tssha256:8c16f4222dfe8446
  • src/environments/environment.tssha256:4a1326dae6974d42
  • src/index.htmlsha256:dc43174658e8a086
  • src/main.tssha256:d6abd407535bea38
  • src/styles.csssha256:39550531eab023d6
  • tsconfig.app.jsonsha256:203cbf2af924b5c2
  • tsconfig.jsonsha256:ebce8b4fbc17602c
  • tsconfig.spec.jsonsha256:ea9479f12dac7ecd

gcp-hosting

  • .dockerignoresha256:70bcc2e98c95efe3
  • Dockerfilesha256:3dfb3b1dcf232ec8
  • GCP_README.mdsha256:16a44a30e7b1bfb2

aws-hosting

  • .ebextensions/nextjs.configsha256:32e773ea88d15b48
  • AWS_README.mdsha256:875b07efbd2d63f5

django-base

  • .env.examplesha256:552a87cc6e36d0f0
  • .gitignoresha256:637d70e8395dcf4b
  • docker-compose.ymlsha256:504815aad9688908
  • Dockerfilesha256:77e9e25f896848a5
  • manage.pysha256:d8619d45b81b0817
  • myapp/admin.pysha256:ba604c5b406bd8aa
  • myapp/apps.pysha256:658a3e533bd59061
  • myapp/models.pysha256:7c0e260f675456ad
  • myapp/urls.pysha256:db418ca66fe45936
  • myapp/views.pysha256:b9ad89a27edd3a4b
  • myproject/asgi.pysha256:9e4906adc45dfc17
  • myproject/settings.pysha256:338438a0d89305c3
  • myproject/urls.pysha256:ed6eaf225e1fd068
  • myproject/wsgi.pysha256:0a6e1de4b9ddfa62
  • README.mdsha256:15b35ae305755f9e
  • requirements-dev.txtsha256:b987ceeafb05994b
  • requirements.txtsha256:3e7a59112bfe11b7

express

  • .env.examplesha256:2175edbf0d7a1e36
  • .gitignoresha256:1871816a1d48681f
  • docker-compose.ymlsha256:882440b3dadad54f
  • Dockerfilesha256:0bebda11d6d2db65
  • package.jsonsha256:2578a3657da1599a
  • README.mdsha256:a73655c0912322d1
  • src/config/index.tssha256:1db85d4d80490e93
  • src/middleware/errorHandler.tssha256:2545ae017f4afc5a
  • src/middleware/requestLogger.tssha256:fac84738e175cd14
  • src/routes/health.tssha256:f4136540993f2ea2
  • src/routes/index.tssha256:15722a02b482ee05
  • src/server.tssha256:768c78dffbb35fce
  • tsconfig.jsonsha256:1cd02ce4911e4858

fastapi-base

  • .env.examplesha256:c55ef498d1a09e87
  • .gitignoresha256:ef7421cbc5d18ddc
  • app/__init__.pysha256:497958c0643b1683
  • app/api/__init__.pysha256:b82afa893ac24b3e
  • app/api/v1/__init__.pysha256:f3cac53c58864122
  • app/api/v1/endpoints/__init__.pysha256:35cf3de85252560f
  • app/api/v1/endpoints/examples.pysha256:63407529c95b2162
  • app/api/v1/endpoints/health.pysha256:daf575087e936b62
  • app/core/__init__.pysha256:a433e1a3fbecac50
  • app/core/config.pysha256:50748b94c2461b99
  • app/core/security.pysha256:1947c2901de7b93f
  • app/models/__init__.pysha256:d181a9d0e02aa91a
  • app/models/base.pysha256:6e3f58858b01c9d8
  • app/models/example.pysha256:77bfa93c28a027d0
  • app/routers/__init__.pysha256:62723fe9c5f5ed71
  • app/routers/v1.pysha256:bcff95e20f5603e3
  • docker-compose.ymlsha256:c99e728c0179ebe7
  • Dockerfilesha256:d8c27d2193f92257
  • main.pysha256:4c8cb01b28d33713
  • README.mdsha256:9304648f5e12220b
  • requirements-dev.txtsha256:c21803112e794c24
  • requirements.txtsha256:5168fbf648f3630e

laravel-base

  • .env.examplesha256:4be8ba2c103a2b29
  • .gitignoresha256:1c11bd3e89e331ce
  • app/Http/Controllers/Controller.phpsha256:493645e3da73e34e
  • app/Http/Controllers/ExampleController.phpsha256:fd92ca474e035c7a
  • app/Models/Example.phpsha256:b10e245444b7f17d
  • app/Providers/AppServiceProvider.phpsha256:a149a0f3e22a9d90
  • app/Providers/RouteServiceProvider.phpsha256:56194ec744eed969
  • artisansha256:da7d4fbf0a74d751
  • bootstrap/app.phpsha256:b6cab66cf1312e8e
  • bootstrap/providers.phpsha256:06a15033f811d60f
  • composer.jsonsha256:72cc03ce600ac562
  • config/app.phpsha256:25bf5864c1859eef
  • config/cors.phpsha256:37b4f9b2c0782f1f
  • config/database.phpsha256:1ca47c6c3ddfb4d3
  • database/migrations/2024_01_01_000000_create_examples_table.phpsha256:541e5c25b06aca0e
  • docker-compose.ymlsha256:5450209041802999
  • Dockerfilesha256:af6beebdd2750766
  • public/index.phpsha256:bfce6ea8c5d0d567
  • README.mdsha256:9b5622eb553166cb
  • routes/api.phpsha256:28455c210440688c
  • routes/web.phpsha256:f584da221bf00295

mongodb

  • .env.examplesha256:d201ffa896b3432f
  • docker-compose.ymlsha256:463a89fc97473a1c
  • lib/mongodb.tssha256:cec91ef3bbf2e0f4

mysql

  • .env.examplesha256:9d4f3daf3fb8f68a
  • docker-compose.ymlsha256:0fe44c0bf6bbc3eb
  • prisma/schema.prismasha256:26f05b3b6f61aa13

nestjs

  • .env.examplesha256:c7fa8c5f826306bd
  • .eslintrc.jsonsha256:cae7ee71337a3282
  • .gitignoresha256:36e3bfba21da66a2
  • .prettierrcsha256:b98870dc42235618
  • docker-compose.ymlsha256:9728fdc70c770745
  • Dockerfilesha256:a4b1c6c34ae04e33
  • nest-cli.jsonsha256:b0939e7146755f7f
  • package.jsonsha256:40946f5417461226
  • README.mdsha256:4f42bd796e96a9f0
  • src/app.controller.tssha256:6d2a351b3694ef93
  • src/app.module.tssha256:43bed2d85b989a50
  • src/app.service.tssha256:dd39ec0e3d1dafd5
  • src/common/filter/http-exception.filter.tssha256:495cf39eb6b95c84
  • src/config/configuration.tssha256:b77e5787c81fe90c
  • src/main.tssha256:b19283b7404158b6
  • tsconfig.build.jsonsha256:1dbfaff44276ff8c
  • tsconfig.jsonsha256:d9e1268bbdf39009

postgres

  • .env.examplesha256:e3b7463e4e10967e
  • docker-compose.ymlsha256:754f92e815e73f9d

sqlite

  • .env.examplesha256:cb57c42a21834b69
  • prisma/schema.prismasha256:53829e38403d1018

sqlserver

  • .env.examplesha256:47835768b6b4d017
  • docker-compose.ymlsha256:dfb6eb2bcf9da393

svelte-base

  • .env.examplesha256:41d57ced0bafb48d
  • .gitignoresha256:d1c3be014e62262f
  • package.jsonsha256:51f54f3ab6eeec4f
  • README.mdsha256:3c16b7a393d747ed
  • src/app.csssha256:bab4ba3d87c4dbb4
  • src/app.htmlsha256:56d8fd2f5cca0482
  • src/lib/counter.tssha256:69015794577eb7ad
  • src/routes/+layout.sveltesha256:12376251f9d068df
  • src/routes/+page.sveltesha256:bcdd0720e1cfe712
  • svelte.config.jssha256:1ea0ba9ca9c963f9
  • tsconfig.jsonsha256:d1eb6bdd354e4d95
  • vite.config.tssha256:182457098fa1b812

vue-base

  • .env.examplesha256:053c867e9a97ec12
  • .eslintrc.cjssha256:80863e69716c33b6
  • .gitignoresha256:5bf41e52993e5dd4
  • .prettierrcsha256:ebe733191f06a29f
  • docker-compose.ymlsha256:10f290adeb344578
  • Dockerfilesha256:c97c5f4dcefee5fa
  • index.htmlsha256:6f23ee2f6e6fa9bb
  • package.jsonsha256:189147434bc2a909
  • README.mdsha256:b462119bfdb5af64
  • src/App.vuesha256:9756fe0dc2c0a438
  • src/assets/main.csssha256:c0d861fb34d3759c
  • src/main.tssha256:e38fa2f754383bbf
  • src/router/index.tssha256:f17a73f5a5cd152e
  • src/stores/counter.tssha256:2e33c547737fa7da
  • src/stores/index.tssha256:280d5aa5a16c758a
  • src/style.csssha256:7cddc9ca08816eb4
  • src/views/About/AboutView.vuesha256:d43dd032ed0fbd7e
  • src/views/Home/HomeView.vuesha256:e61b5c24f8e75d46
  • tsconfig.app.jsonsha256:a4edcdc0feff0398
  • tsconfig.jsonsha256:e8fbe7f1e119cad9
  • tsconfig.node.jsonsha256:1cc1a584ff98e06e
  • vite.config.tssha256:99e813b470ee600e
  • vitest.config.tssha256:4808ce3e159e6109

nextjs-base

  • .github/workflows/ci.ymlsha256:c0cbf4bec21a2809
  • .gitignoresha256:219d43fa77cc15c2
  • app/globals.csssha256:e8d027de5eeb93f9
  • app/layout.tsxsha256:1e2bd9c676f44df4
  • app/page.tsxsha256:fd00642e9111c4c4
  • eslint.config.mjssha256:5c697206f302dadc
  • next-env.d.tssha256:1862ac4bbbc5192d
  • next.config.tssha256:fd7f644239b43eca
  • package.jsonsha256:57c04bccbd088194
  • README.mdsha256:da4d9d246a139452
  • tsconfig.jsonsha256:8d3cfecc924ff54c

aspnet-base

  • .gitignoresha256:2af8ed94ac191b02
  • <%= projectName || 'AspNetCoreApp' %>.csprojsha256:68f71edad80f17a0
  • appsettings.Development.jsonsha256:18546567dfee1fcf
  • appsettings.jsonsha256:29560e564a46c7ff
  • Controllers/ExampleController.cssha256:a5bab356f00fbccd
  • docker-compose.ymlsha256:08b27169345f64e6
  • Dockerfilesha256:062436f71cd71a37
  • Models/AppDbContext.cssha256:4cc6e8b5080844de
  • Models/Example.cssha256:8ef3fe80ed23a5f3
  • Program.cssha256:b01b6f91c8b7ceee
  • Properties/launchSettings.jsonsha256:8273ee20811170fd
  • README.mdsha256:26c27dc5d0d76460

prettier-eslint-config

  • .prettierignoresha256:9f8db0ef469e5891
  • .prettierrc.jsonsha256:ebe733191f06a29f
  • eslint.config.mjssha256:5c2ffb5ca11bd7c3

railway-hosting

  • .railwayignoresha256:7ac6b11df0fe2509
  • RAILWAY_README.mdsha256:f253a571c5dd828c
  • railway.tomlsha256:0e74aca6c64152fa

render-hosting

  • .renderignoresha256:97ff1962033fef05
  • RENDER_README.mdsha256:6958b3ddeb66f507
  • render.yamlsha256:0342eac4f1671180

cloudflare-hosting

  • .wranglerignoresha256:28734e3ce2a11e74
  • CLOUDFLARE_README.mdsha256:6bddfee1827e57a5
  • wrangler.tomlsha256:2aff5aa735324a53

authjs

  • app/api/auth/[...nextauth]/route.tssha256:23ed938053fb9656
  • app/login/page.tsxsha256:ef7ac9e42f3a4f4f
  • auth.tssha256:f7a3a3e28c0f4163
  • proxy.tssha256:781701636e5c4592

paddle

  • app/api/checkout/paddle/route.tssha256:337729ee842528df
  • app/api/webhooks/paddle/route.tssha256:f2aff11b038db802
  • components/paddle-checkout-button.tsxsha256:4d6657394226a890
  • lib/paddle.tssha256:19c2f74cce1c3985

stripe

  • app/api/checkout/route.tssha256:08e04717426192d9
  • app/api/webhooks/stripe/route.tssha256:cc0416bc82eddcbf
  • components/checkout-button.tsxsha256:fdf8340498ab11f4
  • lib/stripe.tssha256:9f74eba1c2070bbb

clerk

  • app/api/webhooks/clerk/route.tssha256:339d39cdb4d9e25d
  • app/sign-in/[[...sign-in]]/page.tsxsha256:eade6b11cbc5c3d0
  • app/sign-up/[[...sign-up]]/page.tsxsha256:cd0d59a7e3924a3e
  • providers.tsxsha256:32f593ed38a24fa7
  • proxy.tssha256:d15f0350783056df

supabase-auth-ui

  • app/auth/callback/route.tssha256:b7d8f41bc3f4e95c
  • app/login/page.tsxsha256:e7fe10fcd959a1e4

tailwind

  • app/globals.csssha256:5b7f520cdb6d9ae6
  • postcss.config.mjssha256:9ca55411b62b2c9c

auth0

  • app/login/page.tsxsha256:309d192f16ecdfa2
  • lib/auth0.tssha256:cf204e57e1b3b94c
  • proxy.tssha256:929e7aa2d2b10e69

azure-hosting

  • AZURE_README.mdsha256:f94d06301ce742f8

aos

  • components/aos-init.tsxsha256:2ca584e2ad429186
  • lib/aos.tssha256:46921f22e842e745
  • types/aos.d.tssha256:ac7e6a75f7d06f4b

footer

  • components/footer.tsxsha256:bc949d55dace9273

navbar

  • components/navbar.tsxsha256:0119fc4aa8be0746

paypal

  • components/paypal-buttons.tsxsha256:46483cf47eee8934
  • components/paypal-provider.tsxsha256:cba8f76b0b331767
  • lib/paypal/client.tssha256:2555b449b45921c9

recaptcha

  • components/recaptcha-script.tsxsha256:a6c2b1957a8f8757
  • components/recaptcha-widget.tsxsha256:700cbe52437b204e

supabase-client

  • components/supabase-provider.tsxsha256:e4f62b93da23a92d
  • lib/supabase/client.tssha256:0de5a242433e2a71
  • lib/supabase/server.tssha256:eba830270332434f

swiper

  • components/swiper-slider.tsxsha256:9ca6dbb5b696bc52
  • lib/swiper.tssha256:d9dea30a9c881fc3

shadcn-ui

  • components/ui/button.tsxsha256:a754057f531b691a
  • components/ui/card.tsxsha256:d2b4f64d5718e90f
  • lib/utils.tssha256:d6cf1d2c25e92eba

braintree

  • lib/braintree/client.tssha256:57be8c4005f16402
  • lib/braintree/hosted-fields.tssha256:17a0d5def5cee2b1
  • types/braintree-web.d.tssha256:2aa9a111b4dcf610

core-js

  • lib/core-js.tssha256:df2140f2187325bb

day-js

  • lib/dayjs.tssha256:5143e6361ea414dd
  • types/dayjs.d.tssha256:a1fbd09596c1961e

firebase

  • lib/firebase.tssha256:977b8bbeeeeeacaa

jquery

  • lib/jquery.tssha256:7973dede67e672b0

prisma

  • lib/prisma.tssha256:612ecc5a5cf2a5d0
  • prisma.config.tssha256:77a6b2aac97b7001
  • prisma/schema.prismasha256:b6edf01b2cd8c5f3