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
- 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.
- 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.
- Mutation allowlist. Catalog files may only gain a stamp header.
INTEGRITY.jsonis generated, not cloned, and is listed as such. Dashboard legal copy is not part of this tree. - 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
- Open the public catalog at github.com/botkelp or copy a file from a component page here.
- SHA-256 the file. If it is generated output, strip the BotKelp header first (or paste it below — we strip it for you).
- Compare that digest to the table. A generated project also includes
INTEGRITY.jsonwith 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…