shmakk 1.1.0 → 1.2.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.
Files changed (450) hide show
  1. package/README.md +16 -1
  2. package/package.json +6 -3
  3. package/scripts/import-skills.js +536 -0
  4. package/scripts/install-skills.js +64 -0
  5. package/skills/ai-elements.md +482 -0
  6. package/skills/architecture.md +151 -0
  7. package/skills/backend-adapter-aws-lambda.md +204 -0
  8. package/skills/backend-adapter-express.md +177 -0
  9. package/skills/backend-adapter-fastify.md +222 -0
  10. package/skills/backend-adapter-fetch.md +200 -0
  11. package/skills/backend-api-docs.md +22 -0
  12. package/skills/backend-aspire.md +232 -0
  13. package/skills/backend-aspnet-core.md +62 -0
  14. package/skills/backend-build-chatgpt-app.md +321 -0
  15. package/skills/backend-build-mcp-app.md +393 -0
  16. package/skills/backend-build-mcp-server.md +222 -0
  17. package/skills/backend-build-mcpb.md +200 -0
  18. package/skills/backend-building-ai-agent-on-cloudflare.md +401 -0
  19. package/skills/backend-caching.md +206 -0
  20. package/skills/backend-chatgpt-app-submission.md +157 -0
  21. package/skills/backend-chatgpt-apps.md +321 -0
  22. package/skills/backend-client-setup.md +318 -0
  23. package/skills/backend-containerize-aspnet-framework.md +455 -0
  24. package/skills/backend-create-spring-boot-java-project.md +164 -0
  25. package/skills/backend-create-spring-boot-kotlin-project.md +148 -0
  26. package/skills/backend-csharp-async.md +50 -0
  27. package/skills/backend-csharp-docs.md +63 -0
  28. package/skills/backend-csharp-mcp-server-generator.md +60 -0
  29. package/skills/backend-dotenv.md +201 -0
  30. package/skills/backend-dotenvx.md +119 -0
  31. package/skills/backend-env-vars.md +259 -0
  32. package/skills/backend-error-handling.md +254 -0
  33. package/skills/backend-fastapi.md +437 -0
  34. package/skills/backend-go-mcp-server-generator.md +335 -0
  35. package/skills/backend-java-mcp-server-generator.md +757 -0
  36. package/skills/backend-kotlin-mcp-server-generator.md +450 -0
  37. package/skills/backend-middlewares.md +243 -0
  38. package/skills/backend-multi-stage-dockerfile.md +47 -0
  39. package/skills/backend-nestjs.md +192 -0
  40. package/skills/backend-next-forge.md +375 -0
  41. package/skills/backend-nextjs.md +746 -0
  42. package/skills/backend-openapi-to-application-code.md +113 -0
  43. package/skills/backend-php-mcp-server-generator.md +523 -0
  44. package/skills/backend-python-mcp-server-generator.md +106 -0
  45. package/skills/backend-routing-middleware.md +251 -0
  46. package/skills/backend-ruby-mcp-server-generator.md +661 -0
  47. package/skills/backend-rust-mcp-server-generator.md +578 -0
  48. package/skills/backend-semantic-kernel.md +57 -0
  49. package/skills/backend-server-setup.md +379 -0
  50. package/skills/backend-server-side-calls.md +250 -0
  51. package/skills/backend-subscriptions.md +407 -0
  52. package/skills/backend-swift-mcp-server-generator.md +670 -0
  53. package/skills/backend-trpc-router.md +152 -0
  54. package/skills/backend-typescript-mcp-server-generator.md +91 -0
  55. package/skills/backend-validators.md +229 -0
  56. package/skills/backend.md +76 -0
  57. package/skills/backup.md +165 -0
  58. package/skills/budget.md +140 -0
  59. package/skills/business-gtm-0-to-1-launch.md +322 -0
  60. package/skills/business-gtm-operating-cadence.md +421 -0
  61. package/skills/business-gtm-positioning-strategy.md +439 -0
  62. package/skills/business-gtm-product-led-growth.md +340 -0
  63. package/skills/calendar.md +95 -0
  64. package/skills/code-review.md +130 -0
  65. package/skills/compliance.md +168 -0
  66. package/skills/contracts.md +130 -0
  67. package/skills/daily-job-run.md +46 -0
  68. package/skills/daily-webdesign.md +187 -0
  69. package/skills/database-bigquery-pipeline-audit.md +130 -0
  70. package/skills/database-cosmosdb-datamodeling.md +1046 -0
  71. package/skills/database-durable-objects.md +187 -0
  72. package/skills/database-ef-core.md +76 -0
  73. package/skills/database-fabric-lakehouse.md +107 -0
  74. package/skills/database-neon-postgres-egress-optimizer.md +213 -0
  75. package/skills/database-neon-postgres.md +218 -0
  76. package/skills/database-postgresql-code-review.md +213 -0
  77. package/skills/database-postgresql-optimization.md +405 -0
  78. package/skills/database-sql-code-review.md +302 -0
  79. package/skills/database-sql-optimization.md +297 -0
  80. package/skills/dependency-audit.md +165 -0
  81. package/skills/design-kami-landing.md +234 -0
  82. package/skills/design.md +221 -0
  83. package/skills/dev-acquire-codebase-knowledge.md +175 -0
  84. package/skills/dev-add-educational-comments.md +129 -0
  85. package/skills/dev-add-model-descriptions.md +74 -0
  86. package/skills/dev-adr-review.md +56 -0
  87. package/skills/dev-boost-prompt.md +26 -0
  88. package/skills/dev-build-run-debug.md +130 -0
  89. package/skills/dev-chunk.md +49 -0
  90. package/skills/dev-claude-md-improver.md +180 -0
  91. package/skills/dev-code-exemplars-blueprint-generator.md +127 -0
  92. package/skills/dev-code-tour.md +434 -0
  93. package/skills/dev-comment-code-generate-a-tutorial.md +27 -0
  94. package/skills/dev-commit.md +81 -0
  95. package/skills/dev-context-map.md +53 -0
  96. package/skills/dev-conventional-commit.md +73 -0
  97. package/skills/dev-create-architectural-decision-record.md +98 -0
  98. package/skills/dev-create-draft-pr.md +17 -0
  99. package/skills/dev-create-pr.md +17 -0
  100. package/skills/dev-create-readme.md +22 -0
  101. package/skills/dev-csharp-mstest.md +479 -0
  102. package/skills/dev-csharp-nunit.md +72 -0
  103. package/skills/dev-csharp-tunit.md +101 -0
  104. package/skills/dev-csharp-xunit.md +69 -0
  105. package/skills/dev-debug-failing-test.md +90 -0
  106. package/skills/dev-diff-analyze.md +32 -0
  107. package/skills/dev-diffs.md +24 -0
  108. package/skills/dev-dotnet-best-practices.md +86 -0
  109. package/skills/dev-dotnet-design-pattern-review.md +43 -0
  110. package/skills/dev-dotnet-timezone.md +110 -0
  111. package/skills/dev-dotnet-upgrade.md +117 -0
  112. package/skills/dev-doublecheck.md +278 -0
  113. package/skills/dev-explain-error.md +15 -0
  114. package/skills/dev-finding-discovery.md +164 -0
  115. package/skills/dev-fix-finding.md +111 -0
  116. package/skills/dev-full-file-edit.md +25 -0
  117. package/skills/dev-git-commit.md +125 -0
  118. package/skills/dev-git-flow-branch-creator.md +293 -0
  119. package/skills/dev-git-workflow.md +46 -0
  120. package/skills/dev-github-automation.md +64 -0
  121. package/skills/dev-github-code-review.md +1140 -0
  122. package/skills/dev-github-issues.md +202 -0
  123. package/skills/dev-gpt-5-4-prompting.md +55 -0
  124. package/skills/dev-investigation-mode.md +277 -0
  125. package/skills/dev-java-add-graalvm-native-image-support.md +450 -0
  126. package/skills/dev-java-docs.md +24 -0
  127. package/skills/dev-java-refactoring-extract-method.md +105 -0
  128. package/skills/dev-java-refactoring-remove-parameter.md +85 -0
  129. package/skills/dev-merge.md +73 -0
  130. package/skills/dev-migrate-create.md +36 -0
  131. package/skills/dev-migrate-validate.md +36 -0
  132. package/skills/dev-my-issues.md +9 -0
  133. package/skills/dev-my-pull-requests.md +15 -0
  134. package/skills/dev-planning-oracle-to-postgres-migration-integration-testing.md +45 -0
  135. package/skills/dev-playwright-generate-test.md +18 -0
  136. package/skills/dev-playwright.md +148 -0
  137. package/skills/dev-prompt-builder.md +142 -0
  138. package/skills/dev-pytest-coverage.md +29 -0
  139. package/skills/dev-python-manager-discovery.md +330 -0
  140. package/skills/dev-python-pypi-package-builder.md +445 -0
  141. package/skills/dev-readme-blueprint-generator.md +79 -0
  142. package/skills/dev-refactor-method-complexity-reduce.md +99 -0
  143. package/skills/dev-refactor-plan.md +66 -0
  144. package/skills/dev-refactor.md +646 -0
  145. package/skills/dev-review-and-refactor.md +16 -0
  146. package/skills/dev-reviewing-oracle-to-postgres-migration.md +68 -0
  147. package/skills/dev-ruff-recursive-fix.md +201 -0
  148. package/skills/dev-run-e2e-tests.md +126 -0
  149. package/skills/dev-run-pre-commit-checks.md +133 -0
  150. package/skills/dev-run-smoke-tests.md +127 -0
  151. package/skills/dev-scaffolding-oracle-to-postgres-migration-test-project.md +55 -0
  152. package/skills/dev-spring-boot-testing.md +190 -0
  153. package/skills/dev-sync-upstream.md +32 -0
  154. package/skills/dev-sync.md +74 -0
  155. package/skills/dev-tdd-workflow.md +23 -0
  156. package/skills/dev-terraform-azurerm-set-diff-analyzer.md +49 -0
  157. package/skills/dev-test-driven-development.md +372 -0
  158. package/skills/dev-test-gaps.md +18 -0
  159. package/skills/dev-test-triage.md +55 -0
  160. package/skills/dev-typer.md +267 -0
  161. package/skills/dev-typescript-setup.md +25 -0
  162. package/skills/dev-unified-diff-edit.md +16 -0
  163. package/skills/dev-unit-test-vue-pinia.md +198 -0
  164. package/skills/dev-using-git-worktrees.md +216 -0
  165. package/skills/dev-validation.md +99 -0
  166. package/skills/dev-verification.md +168 -0
  167. package/skills/dev-webapp-testing.md +134 -0
  168. package/skills/dev-write-coding-standards-from-file.md +317 -0
  169. package/skills/dev-write-tests.md +16 -0
  170. package/skills/devops-appinsights-instrumentation.md +49 -0
  171. package/skills/devops-az-cost-optimize.md +306 -0
  172. package/skills/devops-chronicle.md +154 -0
  173. package/skills/devops-deployments-cicd.md +331 -0
  174. package/skills/devops-devops-rollout-plan.md +118 -0
  175. package/skills/devops-geistdocs.md +276 -0
  176. package/skills/devops-observability.md +774 -0
  177. package/skills/devops-observe-metrics.md +35 -0
  178. package/skills/devops-observe-trace.md +30 -0
  179. package/skills/devops-phoenix-cli.md +163 -0
  180. package/skills/devops-phoenix-tracing.md +140 -0
  181. package/skills/devops-publish-to-pages.md +108 -0
  182. package/skills/devops-telemetry.md +87 -0
  183. package/skills/devops-update-avm-modules-in-bicep.md +61 -0
  184. package/skills/devops.md +81 -0
  185. package/skills/diagrams-canvas.md +204 -0
  186. package/skills/diagrams-draw-io-diagram-generator.md +463 -0
  187. package/skills/diagrams-excalidraw-diagram-generator.md +614 -0
  188. package/skills/diagrams-graphify.md +1277 -0
  189. package/skills/docs-bear-notes.md +108 -0
  190. package/skills/docs-create-llms.md +211 -0
  191. package/skills/docs-doc-gen.md +20 -0
  192. package/skills/docs-documentation-writer.md +46 -0
  193. package/skills/docs-llm-config.md +33 -0
  194. package/skills/docs-mkdocs-translations.md +109 -0
  195. package/skills/docs-obsidian-vault-maintainer.md +14 -0
  196. package/skills/docs-obsidian.md +82 -0
  197. package/skills/docs-prose.md +324 -0
  198. package/skills/docs-update-llms.md +217 -0
  199. package/skills/docs-update-markdown-file-index.md +77 -0
  200. package/skills/docs-wiki-maintainer.md +20 -0
  201. package/skills/documents.md +120 -0
  202. package/skills/email.md +113 -0
  203. package/skills/expenses.md +140 -0
  204. package/skills/file-ops.md +149 -0
  205. package/skills/files-convert-plaintext-to-md.md +363 -0
  206. package/skills/files-doc.md +81 -0
  207. package/skills/files-docx.md +594 -0
  208. package/skills/files-markdown-to-html.md +917 -0
  209. package/skills/files-nano-pdf.md +39 -0
  210. package/skills/files-pdf.md +315 -0
  211. package/skills/files-pdftk-server.md +163 -0
  212. package/skills/files-pptx-html-fidelity-audit.md +255 -0
  213. package/skills/files-pptx.md +231 -0
  214. package/skills/files-xlsx.md +301 -0
  215. package/skills/find-jobs.md +78 -0
  216. package/skills/format-conversion.md +157 -0
  217. package/skills/frontend-ai-elements.md +483 -0
  218. package/skills/frontend-ai-gateway.md +563 -0
  219. package/skills/frontend-ai-generation-persistence.md +242 -0
  220. package/skills/frontend-ai-sdk.md +799 -0
  221. package/skills/frontend-ai-visibility.md +127 -0
  222. package/skills/frontend-angular-developer.md +130 -0
  223. package/skills/frontend-aspnet-minimal-api-openapi.md +42 -0
  224. package/skills/frontend-bencium-innovative-ux-designer.md +719 -0
  225. package/skills/frontend-chat-sdk.md +666 -0
  226. package/skills/frontend-chrome-devtools.md +98 -0
  227. package/skills/frontend-frontend-app-builder.md +186 -0
  228. package/skills/frontend-frontend-design.md +43 -0
  229. package/skills/frontend-frontend-testing-debugging.md +143 -0
  230. package/skills/frontend-gsap-framer-scroll-animation.md +152 -0
  231. package/skills/frontend-internal-linking.md +109 -0
  232. package/skills/frontend-json-render.md +335 -0
  233. package/skills/frontend-keyword-clustering.md +118 -0
  234. package/skills/frontend-next-intl-add-language.md +20 -0
  235. package/skills/frontend-on-page-seo.md +112 -0
  236. package/skills/frontend-premium-frontend-ui.md +114 -0
  237. package/skills/frontend-react-best-practices.md +143 -0
  238. package/skills/frontend-schema-markup.md +160 -0
  239. package/skills/frontend-seo-audit.md +110 -0
  240. package/skills/frontend-swr.md +215 -0
  241. package/skills/frontend-technical-seo.md +162 -0
  242. package/skills/frontend-use-dom.md +418 -0
  243. package/skills/frontend-web-coder.md +564 -0
  244. package/skills/frontend-web-design-reviewer.md +369 -0
  245. package/skills/frontend-web-perf.md +202 -0
  246. package/skills/frontend.md +125 -0
  247. package/skills/general-adapter-standalone.md +199 -0
  248. package/skills/general-auth.md +356 -0
  249. package/skills/general-containerize-aspnetcore.md +393 -0
  250. package/skills/general-create-technical-spike.md +231 -0
  251. package/skills/general-cron-jobs.md +72 -0
  252. package/skills/general-ddd-aggregate.md +52 -0
  253. package/skills/general-ddd-context.md +46 -0
  254. package/skills/general-ddd-validate.md +51 -0
  255. package/skills/general-dependency-check.md +26 -0
  256. package/skills/general-email-marketing.md +86 -0
  257. package/skills/general-healthcheck.md +246 -0
  258. package/skills/general-import-infrastructure-as-code.md +368 -0
  259. package/skills/general-init.md +49 -0
  260. package/skills/general-java-junit.md +64 -0
  261. package/skills/general-java-springboot.md +66 -0
  262. package/skills/general-javascript-typescript-jest.md +45 -0
  263. package/skills/general-kotlin-springboot.md +71 -0
  264. package/skills/general-make-repo-contribution.md +91 -0
  265. package/skills/general-market-research.md +78 -0
  266. package/skills/general-marketplace.md +468 -0
  267. package/skills/general-model-recommendation.md +673 -0
  268. package/skills/general-payments.md +352 -0
  269. package/skills/general-quality-playbook.md +480 -0
  270. package/skills/general-run-integration-tests.md +113 -0
  271. package/skills/general-superjson.md +274 -0
  272. package/skills/general-swiftpm-macos.md +51 -0
  273. package/skills/general-threat-model.md +61 -0
  274. package/skills/invoices.md +167 -0
  275. package/skills/licenses.md +159 -0
  276. package/skills/logs.md +156 -0
  277. package/skills/marketing.md +139 -0
  278. package/skills/media-image-manipulation-image-magick.md +253 -0
  279. package/skills/media-imagegen.md +357 -0
  280. package/skills/media-openai-whisper-api.md +63 -0
  281. package/skills/media-openai-whisper.md +39 -0
  282. package/skills/media-peekaboo.md +191 -0
  283. package/skills/media-screenshot.md +268 -0
  284. package/skills/media-speech.md +145 -0
  285. package/skills/media-transcribe.md +82 -0
  286. package/skills/media-video-frames.md +47 -0
  287. package/skills/mobile-android-emulator-qa.md +81 -0
  288. package/skills/mobile-android-performance.md +280 -0
  289. package/skills/mobile-building-mcp-server-on-cloudflare.md +267 -0
  290. package/skills/mobile-building-native-ui.md +322 -0
  291. package/skills/mobile-expo-api-routes.md +369 -0
  292. package/skills/mobile-expo-cicd-workflows.md +92 -0
  293. package/skills/mobile-expo-deployment.md +191 -0
  294. package/skills/mobile-expo-dev-client.md +165 -0
  295. package/skills/mobile-expo-module.md +177 -0
  296. package/skills/mobile-expo-tailwind-setup.md +481 -0
  297. package/skills/mobile-expo-ui-jetpack-compose.md +41 -0
  298. package/skills/mobile-expo-ui-swift-ui.md +40 -0
  299. package/skills/mobile-ios-app-intents.md +78 -0
  300. package/skills/mobile-ios-debugger-agent.md +52 -0
  301. package/skills/mobile-ios-ettrace-performance.md +198 -0
  302. package/skills/mobile-ios-memgraph-leaks.md +77 -0
  303. package/skills/mobile-native-data-fetching.md +508 -0
  304. package/skills/mobile-packaging-notarization.md +48 -0
  305. package/skills/mobile-react-native-architecture.md +672 -0
  306. package/skills/mobile-react-native-mobile-design.md +438 -0
  307. package/skills/mobile-signing-entitlements.md +59 -0
  308. package/skills/mobile-swiftui-liquid-glass.md +91 -0
  309. package/skills/mobile-swiftui-patterns.md +210 -0
  310. package/skills/mobile-swiftui-performance-audit.md +108 -0
  311. package/skills/mobile-swiftui-ui-patterns.md +97 -0
  312. package/skills/mobile-swiftui-view-refactor.md +204 -0
  313. package/skills/mobile-upgrading-expo.md +134 -0
  314. package/skills/mobile.md +183 -0
  315. package/skills/notes.md +106 -0
  316. package/skills/planning-adr-create.md +62 -0
  317. package/skills/planning-adr-index.md +67 -0
  318. package/skills/planning-architecture-blueprint-generator.md +323 -0
  319. package/skills/planning-brainstorming.md +165 -0
  320. package/skills/planning-breakdown-epic-arch.md +67 -0
  321. package/skills/planning-breakdown-epic-pm.md +59 -0
  322. package/skills/planning-breakdown-feature-implementation.md +129 -0
  323. package/skills/planning-breakdown-feature-prd.md +62 -0
  324. package/skills/planning-breakdown-plan.md +510 -0
  325. package/skills/planning-breakdown-test.md +366 -0
  326. package/skills/planning-cloud-design-patterns.md +63 -0
  327. package/skills/planning-content-brief.md +128 -0
  328. package/skills/planning-content-strategy.md +138 -0
  329. package/skills/planning-content-translation.md +143 -0
  330. package/skills/planning-create-github-action-workflow-specification.md +277 -0
  331. package/skills/planning-create-github-issues-feature-from-implementation-plan.md +29 -0
  332. package/skills/planning-create-github-issues-for-unmet-specification-requirements.md +36 -0
  333. package/skills/planning-create-github-pull-request-from-specification.md +25 -0
  334. package/skills/planning-create-implementation-plan.md +158 -0
  335. package/skills/planning-create-specification.md +128 -0
  336. package/skills/planning-first-ask.md +31 -0
  337. package/skills/planning-folder-structure-blueprint-generator.md +406 -0
  338. package/skills/planning-gen-specs-as-issues.md +166 -0
  339. package/skills/planning-generate-snapshot.md +144 -0
  340. package/skills/planning-generate-status-report.md +336 -0
  341. package/skills/planning-metric-pack-designer.md +27 -0
  342. package/skills/planning-pm-spec.md +53 -0
  343. package/skills/planning-prd.md +144 -0
  344. package/skills/planning-project-assessment.md +182 -0
  345. package/skills/planning-project-setup-info-local.md +128 -0
  346. package/skills/planning-project-workflow-analysis-blueprint-generator.md +294 -0
  347. package/skills/planning-service-oriented-architecture.md +248 -0
  348. package/skills/planning-spec-to-backlog.md +544 -0
  349. package/skills/planning-technology-stack-blueprint-generator.md +243 -0
  350. package/skills/planning-update-implementation-plan.md +158 -0
  351. package/skills/planning-update-specification.md +128 -0
  352. package/skills/planning-what-context-needed.md +40 -0
  353. package/skills/planning-writing-plans.md +153 -0
  354. package/skills/prepare-application.md +81 -0
  355. package/skills/productivity-apple-notes.md +78 -0
  356. package/skills/productivity-apple-reminders.md +119 -0
  357. package/skills/productivity-capture-tasks-from-meeting-notes.md +680 -0
  358. package/skills/productivity-daily-prep.md +156 -0
  359. package/skills/productivity-email-drafter.md +101 -0
  360. package/skills/productivity-hr-onboarding.md +53 -0
  361. package/skills/productivity-things-mac.md +87 -0
  362. package/skills/productivity-update.md +169 -0
  363. package/skills/reminders.md +109 -0
  364. package/skills/research-dossier-collect.md +71 -0
  365. package/skills/research-kg-extract.md +37 -0
  366. package/skills/research-openai-docs.md +89 -0
  367. package/skills/research-research-add-items.md +31 -0
  368. package/skills/research-research-report.md +94 -0
  369. package/skills/research-research-synthesize.md +63 -0
  370. package/skills/research-summarize.md +88 -0
  371. package/skills/research-transformers-js.md +635 -0
  372. package/skills/research.md +119 -0
  373. package/skills/security-ai-prompt-engineering-safety-review.md +231 -0
  374. package/skills/security-attack-path-analysis.md +182 -0
  375. package/skills/security-gdpr-compliant.md +284 -0
  376. package/skills/security-mcp-security-audit.md +279 -0
  377. package/skills/security-pii-detect.md +31 -0
  378. package/skills/security-secret-scanning.md +243 -0
  379. package/skills/security-security-best-practices.md +87 -0
  380. package/skills/security-security-ownership-map.md +207 -0
  381. package/skills/security-security-review.md +169 -0
  382. package/skills/security-security-scan.md +138 -0
  383. package/skills/security-security-threat-model.md +82 -0
  384. package/skills/security-threat-model-analyst.md +76 -0
  385. package/skills/sysmon.md +181 -0
  386. package/skills/system-arch-linux-triage.md +32 -0
  387. package/skills/system-centos-linux-triage.md +32 -0
  388. package/skills/system-debian-linux-triage.md +32 -0
  389. package/skills/system-fedora-linux-triage.md +32 -0
  390. package/skills/system-geofeed-tuner.md +865 -0
  391. package/skills/system-iot-anomalies.md +15 -0
  392. package/skills/system-iot-firmware.md +16 -0
  393. package/skills/system-iot-fleet.md +14 -0
  394. package/skills/system-iot-register.md +19 -0
  395. package/skills/system-iot-witness-verify.md +15 -0
  396. package/skills/system-tmux.md +171 -0
  397. package/skills/system-window-management.md +228 -0
  398. package/skills/task-management.md +90 -0
  399. package/skills/tasks.md +102 -0
  400. package/skills/test-coverage.md +188 -0
  401. package/skills/ux-ui.md +128 -0
  402. package/skills/web.md +186 -0
  403. package/skills/workflow-act-on-feedback.md +15 -0
  404. package/skills/workflow-automate-this.md +245 -0
  405. package/skills/workflow-autoresearch.md +276 -0
  406. package/skills/workflow-coding-agent.md +317 -0
  407. package/skills/workflow-deep-research.md +44 -0
  408. package/skills/workflow-dispatching-parallel-agents.md +183 -0
  409. package/skills/workflow-eval-driven-dev.md +148 -0
  410. package/skills/workflow-executing-plans.md +71 -0
  411. package/skills/workflow-mentoring-juniors.md +311 -0
  412. package/skills/workflow-receiving-code-review.md +214 -0
  413. package/skills/workflow-repo-story-time.md +155 -0
  414. package/skills/workflow-requesting-code-review.md +104 -0
  415. package/skills/workflow-session-report.md +43 -0
  416. package/skills/workflow-structured-autonomy-generate.md +126 -0
  417. package/skills/workflow-subagent-driven-development.md +280 -0
  418. package/skills/writing.md +106 -0
  419. package/src/agent.js +0 -0
  420. package/src/browser.js +297 -0
  421. package/src/cli.js +25 -4
  422. package/src/code-reviewer.js +119 -0
  423. package/src/completions.js +1 -1
  424. package/src/control.js +222 -30
  425. package/src/coordinator.js +303 -0
  426. package/src/correction.js +29 -8
  427. package/src/edit-tracker.js +21 -0
  428. package/src/edit-viewer.js +414 -0
  429. package/src/endpoints.js +64 -15
  430. package/src/index.js +45 -11
  431. package/src/llm.js +86 -2
  432. package/src/mcp-client.js +416 -0
  433. package/src/memory.js +182 -0
  434. package/src/planner.js +216 -0
  435. package/src/rules.js +90 -0
  436. package/src/self-commands.js +757 -0
  437. package/src/services/voice.js +10 -7
  438. package/src/session-search.js +427 -0
  439. package/src/session.js +487 -99
  440. package/src/shmakk-server.js +91 -0
  441. package/src/skills.js +410 -3
  442. package/src/subagent.js +4 -1
  443. package/src/system-prompt.js +13 -5
  444. package/src/task-file.js +114 -0
  445. package/src/taskClassifier.js +246 -0
  446. package/src/team.js +752 -0
  447. package/src/tools.js +142 -21
  448. package/src/web.js +35 -5
  449. package/src/workflows.js +261 -0
  450. package/src/workspace-index.js +25 -6
@@ -0,0 +1,393 @@
1
+ ---
2
+ name: build-mcp-app
3
+ description: This skill should be used when the user wants to build an "MCP app", add "interactive UI" or "widgets" to an MCP server, "render components in chat", build "MCP UI resources", make a tool that shows a "form", "picker", "dashboard" or "confirmation dialog" inline in the conversation, or mentions "apps SDK" in the context of MCP. Use AFTER the build-mcp-server skill has settled the deployment model, or when the user already knows they want UI widgets.
4
+ version: 0.1.0
5
+ category: backend
6
+ ---
7
+
8
+ # Build an MCP App (Interactive UI Widgets)
9
+
10
+ An MCP app is a standard MCP server that **also serves UI resources** — interactive components rendered inline in the chat surface. Build once, runs in Claude *and* ChatGPT and any other host that implements the apps surface.
11
+
12
+ The UI layer is **additive**. Under the hood it's still tools, resources, and the same wire protocol. If you haven't built a plain MCP server before, the `build-mcp-server` skill covers the base layer. This skill adds widgets on top.
13
+
14
+ > **Testing in Claude:** Add the server as a custom connector in claude.ai (via a Cloudflare tunnel for local dev) — this exercises the real iframe sandbox and `hostContext`. See https://claude.com/docs/connectors/building/testing.
15
+
16
+ ## Claude host specifics
17
+
18
+ | `_meta.ui.*` key | Where | Effect |
19
+ |---|---|---|
20
+ | `resourceUri` | tool | Which `ui://` resource the host renders for this tool's results. |
21
+ | `visibility: ["app"]` | tool | Hide a widget-only helper tool (e.g. geometry/image fetcher called via `callServerTool`) from Claude's tool list. |
22
+ | `prefersBorder: false` | resource | Drop the host's outer card border (mobile). |
23
+ | `csp.{connectDomains, resourceDomains, baseUriDomains}` | resource | Declare external origins; default is block-all. `frameDomains` is currently restricted in Claude. |
24
+
25
+ - `hostContext.safeAreaInsets: {top, right, bottom, left}` (px) — honor these for notches and the composer overlay.
26
+ - Directory submission requires OAuth or **authless** (`none`) — static bearer is private-deploy only and blocks listing — plus tool `annotations` and 3–5 PNG screenshots; see `references/directory-checklist.md`.
27
+
28
+ ---
29
+
30
+ ## When a widget beats plain text
31
+
32
+ Don't add UI for its own sake — most tools are fine returning text or JSON. Add a widget when one of these is true:
33
+
34
+ | Signal | Widget type |
35
+ |---|---|
36
+ | Tool needs structured input Claude can't reliably infer | Form |
37
+ | User must pick from a list Claude can't rank (files, contacts, records) | Picker / table |
38
+ | Destructive or billable action needs explicit confirmation | Confirm dialog |
39
+ | Output is spatial or visual (charts, maps, diffs, previews) | Display widget |
40
+ | Long-running job the user wants to watch | Progress / live status |
41
+
42
+ If none apply, skip the widget. Text is faster to build and faster for the user.
43
+
44
+ ---
45
+
46
+ ## Widgets vs Elicitation — route correctly
47
+
48
+ Before building a widget, check if **elicitation** covers it. Elicitation is spec-native, zero UI code, works in any compliant host.
49
+
50
+ | Need | Elicitation | Widget |
51
+ |---|---|---|
52
+ | Confirm yes/no | ✅ | overkill |
53
+ | Pick from short enum | ✅ | overkill |
54
+ | Fill a flat form (name, email, date) | ✅ | overkill |
55
+ | Pick from a large/searchable list | ❌ (no scroll/search) | ✅ |
56
+ | Visual preview before choosing | ❌ | ✅ |
57
+ | Chart / map / diff view | ❌ | ✅ |
58
+ | Live-updating progress | ❌ | ✅ |
59
+
60
+ If elicitation covers it, use it. See `../build-mcp-server/references/elicitation.md`.
61
+
62
+ ---
63
+
64
+ ## Architecture: two deployment shapes
65
+
66
+ ### Remote MCP app (most common)
67
+
68
+ Hosted streamable-HTTP server. Widget templates are served as **resources**; tool results reference them. The host fetches the resource, renders it in an iframe sandbox, and brokers messages between the widget and Claude.
69
+
70
+ ```
71
+ ┌──────────┐ tools/call ┌────────────┐
72
+ │ Claude │─────────────> │ MCP server │
73
+ │ host │<── result ────│ (remote) │
74
+ │ │ + widget ref │ │
75
+ │ │ │ │
76
+ │ │ resources/read│ │
77
+ │ │─────────────> │ widget │
78
+ │ ┌──────┐ │<── template ──│ HTML/JS │
79
+ │ │iframe│ │ └────────────┘
80
+ │ │widget│ │
81
+ │ └──────┘ │
82
+ └──────────┘
83
+ ```
84
+
85
+ ### MCPB-packaged MCP app (local + UI)
86
+
87
+ Same widget mechanism, but the server runs locally inside an MCPB bundle. Use this when the widget needs to drive a **local** application — e.g., a file picker that browses the actual local disk, a dialog that controls a desktop app.
88
+
89
+ For MCPB packaging mechanics, defer to the **`build-mcpb`** skill. Everything below applies to both shapes.
90
+
91
+ ---
92
+
93
+ ## How widgets attach to tools
94
+
95
+ A widget-enabled tool has **two separate registrations**:
96
+
97
+ 1. **The tool** declares a UI resource via `_meta.ui.resourceUri`. Its handler returns plain text/JSON — NOT the HTML.
98
+ 2. **The resource** is registered separately and serves the HTML.
99
+
100
+ When Claude calls the tool, the host sees `_meta.ui.resourceUri`, fetches that resource, renders it in an iframe, and pipes the tool's return value into the iframe via the `ontoolresult` event.
101
+
102
+ ```typescript
103
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
104
+ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE }
105
+ from "@modelcontextprotocol/ext-apps/server";
106
+ import { z } from "zod";
107
+
108
+ const server = new McpServer({ name: "contacts", version: "1.0.0" });
109
+
110
+ // 1. The tool — returns DATA, declares which UI to show
111
+ registerAppTool(server, "pick_contact", {
112
+ description: "Open an interactive contact picker",
113
+ annotations: { title: "Pick Contact", readOnlyHint: true },
114
+ inputSchema: { filter: z.string().optional() },
115
+ _meta: { ui: { resourceUri: "ui://widgets/contact-picker.html" } },
116
+ }, async ({ filter }) => {
117
+ const contacts = await db.contacts.search(filter);
118
+ // Plain JSON — the widget receives this via ontoolresult
119
+ return { content: [{ type: "text", text: JSON.stringify(contacts) }] };
120
+ });
121
+
122
+ // 2. The resource — serves the HTML
123
+ registerAppResource(
124
+ server,
125
+ "Contact Picker",
126
+ "ui://widgets/contact-picker.html",
127
+ {},
128
+ async () => ({
129
+ contents: [{
130
+ uri: "ui://widgets/contact-picker.html",
131
+ mimeType: RESOURCE_MIME_TYPE,
132
+ text: pickerHtml, // your HTML string
133
+ }],
134
+ }),
135
+ );
136
+ ```
137
+
138
+ The URI scheme `ui://` is convention. The mime type MUST be `RESOURCE_MIME_TYPE` (`"text/html;profile=mcp-app"`) — this is how the host knows to render it as an interactive iframe, not just display the source.
139
+
140
+ ---
141
+
142
+ ## Widget runtime — the `App` class
143
+
144
+ Inside the iframe, your script talks to the host via the `App` class from `@modelcontextprotocol/ext-apps`. This is a **persistent bidirectional connection** — the widget stays alive as long as the conversation is active, receiving new tool results and sending user actions.
145
+
146
+ ```html
147
+ <script type="module">
148
+ /* ext-apps bundle inlined at build time → globalThis.ExtApps */
149
+ /*__EXT_APPS_BUNDLE__*/
150
+ const { App } = globalThis.ExtApps;
151
+
152
+ const app = new App({ name: "ContactPicker", version: "1.0.0" }, {});
153
+
154
+ // Set handlers BEFORE connecting
155
+ app.ontoolresult = ({ content }) => {
156
+ const contacts = JSON.parse(content[0].text);
157
+ render(contacts);
158
+ };
159
+
160
+ await app.connect();
161
+
162
+ // Later, when the user clicks something:
163
+ function onPick(contact) {
164
+ app.sendMessage({
165
+ role: "user",
166
+ content: [{ type: "text", text: `Selected contact: ${contact.id}` }],
167
+ });
168
+ }
169
+ </script>
170
+ ```
171
+
172
+ The `/*__EXT_APPS_BUNDLE__*/` placeholder gets replaced by the server at startup with the contents of `@modelcontextprotocol/ext-apps/app-with-deps` — see `references/iframe-sandbox.md` for why this is necessary and the rewrite snippet. **Do not** `import { App } from "https://esm.sh/..."`; the iframe's CSP blocks the transitive dependency fetches and the widget renders blank.
173
+
174
+ | Method | Direction | Use for |
175
+ |---|---|---|
176
+ | `app.ontoolresult = fn` | Host → widget | Receive the tool's return value |
177
+ | `app.ontoolinput = fn` | Host → widget | Receive the tool's input args (what Claude passed) |
178
+ | `app.sendMessage({...})` | Widget → host | Inject a message into the conversation |
179
+ | `app.updateModelContext({...})` | Widget → host | Update context silently (no visible message) |
180
+ | `app.callServerTool({name, arguments})` | Widget → server | Call another tool on your server |
181
+ | `app.openLink({url})` | Widget → host | Open a URL in a new tab (sandbox blocks `window.open`) |
182
+ | `app.getHostContext()` / `app.onhostcontextchanged` | Host → widget | Theme, host CSS vars, `containerDimensions`, `displayMode`, `deviceCapabilities` |
183
+ | `app.requestDisplayMode({mode})` | Widget → host | Ask for `inline` / `pip` / `fullscreen` |
184
+ | `app.downloadFile({name, mimeType, content})` | Widget → host | Host-mediated download (base64 content) |
185
+ | `new App(info, caps, {autoResize: true})` | — | Iframe height tracks rendered content |
186
+
187
+ `sendMessage` is the typical "user picked something, tell Claude" path. `updateModelContext` is for state that Claude should know about but shouldn't clutter the chat. `openLink` is **required** for any outbound navigation — `window.open` and `<a target="_blank">` are blocked by the sandbox attribute.
188
+
189
+ **What widgets cannot do:**
190
+ - Access the host page's DOM, cookies, or storage
191
+ - Make network calls to arbitrary origins (CSP-restricted — route through `callServerTool`)
192
+ - Open popups or navigate directly — use `app.openLink({url})`
193
+ - Load remote images reliably — inline as `data:` URLs server-side
194
+
195
+ Keep widgets **small and single-purpose**. A picker picks. A chart displays. Don't build a whole sub-app inside the iframe — split it into multiple tools with focused widgets.
196
+
197
+ ---
198
+
199
+ ## Scaffold: minimal picker widget
200
+
201
+ **Install:**
202
+
203
+ ```bash
204
+ npm install @modelcontextprotocol/sdk @modelcontextprotocol/ext-apps zod express
205
+ ```
206
+
207
+ **Server (`src/server.ts`):**
208
+
209
+ ```typescript
210
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
211
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
212
+ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE }
213
+ from "@modelcontextprotocol/ext-apps/server";
214
+ import express from "express";
215
+ import { readFileSync } from "node:fs";
216
+ import { createRequire } from "node:module";
217
+ import { z } from "zod";
218
+
219
+ const require = createRequire(import.meta.url);
220
+ const server = new McpServer({ name: "contact-picker", version: "1.0.0" });
221
+
222
+ // Inline the ext-apps browser bundle into the widget HTML.
223
+ // The iframe CSP blocks CDN script fetches — bundling is mandatory.
224
+ const bundle = readFileSync(
225
+ require.resolve("@modelcontextprotocol/ext-apps/app-with-deps"), "utf8",
226
+ ).replace(/export\{([^}]+)\};?\s*$/, (_, body) =>
227
+ "globalThis.ExtApps={" +
228
+ body.split(",").map((p) => {
229
+ const [local, exported] = p.split(" as ").map((s) => s.trim());
230
+ return `${exported ?? local}:${local}`;
231
+ }).join(",") + "};",
232
+ );
233
+ const pickerHtml = readFileSync("./widgets/picker.html", "utf8")
234
+ .replace("/*__EXT_APPS_BUNDLE__*/", () => bundle);
235
+
236
+ registerAppTool(server, "pick_contact", {
237
+ description: "Open an interactive contact picker. User selects one contact.",
238
+ annotations: { title: "Pick Contact", readOnlyHint: true },
239
+ inputSchema: { filter: z.string().optional().describe("Name/email prefix filter") },
240
+ _meta: { ui: { resourceUri: "ui://widgets/picker.html" } },
241
+ }, async ({ filter }) => {
242
+ const contacts = await db.contacts.search(filter ?? "");
243
+ return { content: [{ type: "text", text: JSON.stringify(contacts) }] };
244
+ });
245
+
246
+ registerAppResource(server, "Contact Picker", "ui://widgets/picker.html", {},
247
+ async () => ({
248
+ contents: [{ uri: "ui://widgets/picker.html", mimeType: RESOURCE_MIME_TYPE, text: pickerHtml }],
249
+ }),
250
+ );
251
+
252
+ const app = express();
253
+ app.use(express.json());
254
+ app.post("/mcp", async (req, res) => {
255
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
256
+ res.on("close", () => transport.close());
257
+ await server.connect(transport);
258
+ await transport.handleRequest(req, res, req.body);
259
+ });
260
+ app.listen(process.env.PORT ?? 3000);
261
+ ```
262
+
263
+ For local-only widget apps (driving a desktop app, reading local files), swap the transport to `StdioServerTransport` and package via the `build-mcpb` skill.
264
+
265
+ **Widget (`widgets/picker.html`):**
266
+
267
+ ```html
268
+ <!doctype html>
269
+ <meta charset="utf-8" />
270
+ <style>
271
+ body { font: 14px system-ui; margin: 0; }
272
+ ul { list-style: none; padding: 0; margin: 0; max-height: 300px; overflow-y: auto; }
273
+ li { padding: 10px 14px; cursor: pointer; border-bottom: 1px solid #eee; }
274
+ li:hover { background: #f5f5f5; }
275
+ .sub { color: #666; font-size: 12px; }
276
+ </style>
277
+ <ul id="list"></ul>
278
+ <script type="module">
279
+ /*__EXT_APPS_BUNDLE__*/
280
+ const { App } = globalThis.ExtApps;
281
+ (async () => {
282
+ const app = new App({ name: "ContactPicker", version: "1.0.0" }, {});
283
+ const ul = document.getElementById("list");
284
+
285
+ app.ontoolresult = ({ content }) => {
286
+ const contacts = JSON.parse(content[0].text);
287
+ ul.innerHTML = "";
288
+ for (const c of contacts) {
289
+ const li = document.createElement("li");
290
+ li.innerHTML = `<div>${c.name}</div><div class="sub">${c.email}</div>`;
291
+ li.addEventListener("click", () => {
292
+ app.sendMessage({
293
+ role: "user",
294
+ content: [{ type: "text", text: `Selected contact: ${c.id} (${c.name})` }],
295
+ });
296
+ });
297
+ ul.append(li);
298
+ }
299
+ };
300
+
301
+ await app.connect();
302
+ })();
303
+ </script>
304
+ ```
305
+
306
+ See `references/widget-templates.md` for more widget shapes.
307
+
308
+ ---
309
+
310
+ ## Design notes that save you a rewrite
311
+
312
+ **One widget per tool.** Resist the urge to build one mega-widget that does everything. One tool → one focused widget → one clear result shape. Claude reasons about these far better.
313
+
314
+ **Tool description must mention the widget.** Claude only sees the tool description when deciding what to call. "Opens an interactive picker" in the description is what makes Claude reach for it instead of guessing an ID.
315
+
316
+ **Widgets are optional at runtime.** Hosts that don't support the apps surface simply ignore `_meta.ui` and render the tool's text content normally. Since your tool handler already returns meaningful text/JSON (the widget's data), degradation is automatic — Claude sees the data directly instead of via the widget.
317
+
318
+ **Don't block on widget results for read-only tools.** A widget that just *displays* data (chart, preview) shouldn't require a user action to complete. Return the display widget *and* a text summary in the same result so Claude can continue reasoning without waiting.
319
+
320
+ **Layout-fork by item count, not by tool count.** If one use case is "show one result in detail" and another is "show many results side-by-side", don't make two tools — make one tool that accepts `items[]`, and let the widget pick a layout: `items.length === 1` → detail view, `> 1` → carousel. Keeps the server schema simple and lets Claude decide count naturally.
321
+
322
+ **Put Claude's reasoning in the payload.** A short `note` field on each item (why Claude picked it) rendered as a callout on the card gives users the reasoning inline with the choice. Mention this field in the tool description so Claude populates it.
323
+
324
+ **Normalize image shapes server-side.** If your data source returns images with wildly varying aspect ratios, rewrite to a predictable variant (e.g. square-bounded) *before* fetching for the data-URL inline. Then give the widget's image container a fixed `aspect-ratio` + `object-fit: contain` so everything sits centered.
325
+
326
+ **Follow host theme.** `app.getHostContext()?.theme` (after `connect()`) plus `app.onhostcontextchanged` for live updates. Toggle a `.dark` class on `<html>`, keep colors in CSS custom props with a `:root.dark {}` override block, set `color-scheme`. Disable `mix-blend-mode: multiply` in dark — it makes images vanish.
327
+
328
+ ---
329
+
330
+ ## Testing
331
+
332
+ **Claude Desktop** — current builds still require the `command`/`args` config shape (no native `"type": "http"`). Wrap with `mcp-remote` and force `http-only` transport so the SSE probe doesn't swallow widget-capability negotiation:
333
+
334
+ ```json
335
+ {
336
+ "mcpServers": {
337
+ "my-server": {
338
+ "command": "npx",
339
+ "args": ["-y", "mcp-remote", "http://localhost:3000/mcp",
340
+ "--allow-http", "--transport", "http-only"]
341
+ }
342
+ }
343
+ }
344
+ ```
345
+
346
+ Desktop caches UI resources aggressively. After editing widget HTML, **fully quit** (⌘Q / Alt+F4, not window-close) and relaunch to force a cold resource re-fetch.
347
+
348
+ **Headless JSON-RPC loop** — fast iteration without clicking through Desktop:
349
+
350
+ ```bash
351
+ # test.jsonl — one JSON-RPC message per line
352
+ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}
353
+ {"jsonrpc":"2.0","method":"notifications/initialized"}
354
+ {"jsonrpc":"2.0","id":2,"method":"tools/list"}
355
+ {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"your_tool","arguments":{...}}}
356
+
357
+ (cat test.jsonl; sleep 10) | npx mcp-remote http://localhost:3000/mcp --allow-http
358
+ ```
359
+
360
+ The `sleep` keeps stdin open long enough to collect all responses. Parse the jsonl output with `jq` or a Python one-liner.
361
+
362
+ **Widget dev loop** — avoid the ⌘Q-relaunch cycle entirely by serving the inlined widget HTML at a plain GET route with a fake `ExtApps` shim that fires `ontoolresult` from a query param:
363
+
364
+ ```ts
365
+ app.get("/widget-preview", (_req, res) => {
366
+ const shim = `globalThis.ExtApps={applyHostStyleVariables:()=>{},App:class{
367
+ constructor(){this.h={}} ontoolresult;onhostcontextchanged;
368
+ async connect(){const p=new URLSearchParams(location.search).get("payload");
369
+ if(p)this.ontoolresult?.({content:[{type:"text",text:p}]});}
370
+ getHostContext(){return{theme:"light"}}
371
+ sendMessage(m){console.log("sendMessage",m)} updateModelContext(){}
372
+ callServerTool(){return Promise.resolve({content:[]})} openLink(){} downloadFile(){}
373
+ }};`;
374
+ res.type("html").send(widgetHtml.replace("/*__EXT_APPS_BUNDLE__*/", shim));
375
+ });
376
+ ```
377
+
378
+ Open `http://localhost:3000/widget-preview?payload={"rows":[...]}` in a normal browser tab and iterate with ordinary devtools.
379
+
380
+ **Host fallback** — use a host without the apps surface (or MCP Inspector) and confirm the tool's text content degrades gracefully.
381
+
382
+ **CSP debugging** — open the iframe's own devtools console. CSP violations are the #1 reason widgets silently fail (blank rectangle, no error in the main console). See `references/iframe-sandbox.md`.
383
+
384
+ ---
385
+
386
+ ## Reference files
387
+
388
+ - `references/iframe-sandbox.md` — CSP/sandbox constraints, the bundle-inlining pattern, image handling, host theming
389
+ - `references/widget-templates.md` — reusable HTML scaffolds for picker / confirm / progress / display
390
+ - `references/apps-sdk-messages.md` — the `App` class API: widget ↔ host ↔ server messaging, lifecycle & supersession
391
+ - `references/payload-budgeting.md` — host tool-result size caps, prune-then-truncate, heavy assets via `callServerTool`
392
+ - `references/abuse-protection.md` — Anthropic egress CIDRs, tiered rate limiting, `trust proxy`, response caching
393
+ - `references/directory-checklist.md` — pre-flight for connector-directory submission
@@ -0,0 +1,222 @@
1
+ ---
2
+ name: build-mcp-server
3
+ description: This skill should be used when the user asks to "build an MCP server", "create an MCP", "make an MCP integration", "wrap an API for Claude", "expose tools to Claude", "make an MCP app", or discusses building something with the Model Context Protocol. It is the entry point for MCP server development — it interrogates the user about their use case, determines the right deployment model (remote HTTP, MCPB, local stdio), picks a tool-design pattern, and hands off to specialized skills.
4
+ version: 0.1.0
5
+ category: backend
6
+ ---
7
+
8
+ # Build an MCP Server
9
+
10
+ You are guiding a developer through designing and building an MCP server that works seamlessly with Claude. MCP servers come in many forms — picking the wrong shape early causes painful rewrites later. Your first job is **discovery, not code**.
11
+
12
+ **Load Claude-specific context first.** The MCP spec is generic; Claude has additional auth types, review criteria, and limits. Before answering questions or scaffolding, fetch `https://claude.com/docs/llms-full.txt` (the full export of the Claude connector docs) so your guidance reflects Claude's actual constraints.
13
+
14
+ Do not start scaffolding until you have answers to the questions in Phase 1. If the user's opening message already answers them, acknowledge that and skip straight to the recommendation.
15
+
16
+ ---
17
+
18
+ ## Phase 1 — Interrogate the use case
19
+
20
+ Ask these questions conversationally (batch them into one message, don't interrogate one-at-a-time). Adapt wording to what the user has already told you.
21
+
22
+ ### 1. What does it connect to?
23
+
24
+ | If it connects to… | Likely direction |
25
+ |---|---|
26
+ | A cloud API (SaaS, REST, GraphQL) | Remote HTTP server |
27
+ | A local process, filesystem, or desktop app | MCPB or local stdio |
28
+ | Hardware, OS-level APIs, or user-specific state | MCPB |
29
+ | Nothing external — pure logic / computation | Either — default to remote |
30
+
31
+ ### 2. Who will use it?
32
+
33
+ - **Just me / my team, on our machines** → Local stdio is acceptable (easiest to prototype)
34
+ - **Anyone who installs it** → Remote HTTP (strongly preferred) or MCPB (if it *must* be local)
35
+ - **Users of Claude desktop who want UI widgets** → MCP app (remote or MCPB)
36
+
37
+ ### 3. How many distinct actions does it expose?
38
+
39
+ This determines the tool-design pattern — see Phase 3.
40
+
41
+ - **Under ~15 actions** → one tool per action
42
+ - **Dozens to hundreds of actions** (e.g. wrapping a large API surface) → search + execute pattern
43
+
44
+ ### 4. Does a tool need mid-call user input or rich display?
45
+
46
+ - **Simple structured input** (pick from list, enter a value, confirm) → **Elicitation** — spec-native, zero UI code. *Host support is rolling out* (Claude Code ≥2.1.76) — always pair with a capability check and fallback. See `references/elicitation.md`.
47
+ - **Rich/visual UI** (charts, custom pickers with search, live dashboards) → **MCP app widgets** — iframe-based, needs `@modelcontextprotocol/ext-apps`. See `build-mcp-app` skill.
48
+ - **Neither** → plain tool returning text/JSON.
49
+
50
+ ### 5. What auth does the upstream service use?
51
+
52
+ - None / API key → straightforward
53
+ - OAuth 2.0 → you'll need a remote server with CIMD (preferred) or DCR support; see `references/auth.md`
54
+
55
+ ---
56
+
57
+ ## Phase 2 — Recommend a deployment model
58
+
59
+ Based on the answers, recommend **one** path. Be opinionated. The ranked options:
60
+
61
+ ### ⭐ Remote streamable-HTTP MCP server (default recommendation)
62
+
63
+ A hosted service speaking MCP over streamable HTTP. This is the **recommended path** for anything wrapping a cloud API.
64
+
65
+ **Why it wins:**
66
+ - Zero install friction — users add a URL, done
67
+ - One deployment serves all users; you control upgrades
68
+ - OAuth flows work properly (the server can handle redirects, DCR, token storage)
69
+ - Works across Claude desktop, Claude Code, Claude.ai, and third-party MCP hosts
70
+
71
+ **Choose this unless** the server *must* touch the user's local machine.
72
+
73
+ → **Fastest deploy:** Cloudflare Workers — `references/deploy-cloudflare-workers.md` (zero to live URL in two commands)
74
+ → **Portable Node/Python:** `references/remote-http-scaffold.md` (Express or FastMCP, runs on any host)
75
+
76
+ ### Elicitation (structured input, no UI build)
77
+
78
+ If a tool just needs the user to confirm, pick an option, or fill a short form, **elicitation** does it with zero UI code. The server sends a flat JSON schema; the host renders a native form. Spec-native, no extra packages.
79
+
80
+ **Caveat:** Host support is new (Claude Code shipped it in v2.1.76; Desktop unconfirmed). The SDK throws if the client doesn't advertise the capability. Always check `clientCapabilities.elicitation` first and have a fallback — see `references/elicitation.md` for the canonical pattern. This is the right spec-correct approach; host coverage will catch up.
81
+
82
+ Escalate to `build-mcp-app` widgets when you need: nested/complex data, scrollable/searchable lists, visual previews, live updates.
83
+
84
+ ### MCP app (remote HTTP + interactive UI)
85
+
86
+ Same as above, plus **UI resources** — interactive widgets rendered in chat. Rich pickers with search, charts, live dashboards, visual previews. Built once, renders in Claude *and* ChatGPT.
87
+
88
+ **Choose this when** elicitation's flat-form constraints don't fit — you need custom layout, large searchable lists, visual content, or live updates.
89
+
90
+ Usually remote, but can be shipped as MCPB if the UI needs to drive a local app.
91
+
92
+ → Hand off to the **`build-mcp-app`** skill.
93
+
94
+ ### MCPB (bundled local server)
95
+
96
+ A local MCP server **packaged with its runtime** so users don't need Node/Python installed. The sanctioned way to ship local servers.
97
+
98
+ **Choose this when** the server *must* run on the user's machine — it reads local files, drives a desktop app, talks to localhost services, or needs OS-level access.
99
+
100
+ → Hand off to the **`build-mcpb`** skill.
101
+
102
+ ### Local stdio (npx / uvx) — *not recommended for distribution*
103
+
104
+ A script launched via `npx` / `uvx` on the user's machine. Fine for **personal tools and prototypes**. Painful to distribute: users need the right runtime, you can't push updates, and the only distribution channel is Claude Code plugins.
105
+
106
+ Recommend this only as a stepping stone. If the user insists, scaffold it but note the MCPB upgrade path.
107
+
108
+ ---
109
+
110
+ ## Phase 3 — Pick a tool-design pattern
111
+
112
+ Every MCP server exposes tools. How you carve them matters more than most people expect — tool schemas land directly in Claude's context window.
113
+
114
+ ### Pattern A: One tool per action (small surface)
115
+
116
+ When the action space is small (< ~15 operations), give each a dedicated tool with a tight description and schema.
117
+
118
+ ```
119
+ create_issue — Create a new issue. Params: title, body, labels[]
120
+ update_issue — Update an existing issue. Params: id, title?, body?, state?
121
+ search_issues — Search issues by query string. Params: query, limit?
122
+ add_comment — Add a comment to an issue. Params: issue_id, body
123
+ ```
124
+
125
+ **Why it works:** Claude reads the tool list once and knows exactly what's possible. No discovery round-trips. Each tool's schema validates inputs precisely.
126
+
127
+ **Especially good when** one or more tools ship an interactive widget (MCP app) — each widget binds naturally to one tool.
128
+
129
+ ### Pattern B: Search + execute (large surface)
130
+
131
+ When wrapping a large API (dozens to hundreds of endpoints), listing every operation as a tool floods the context window and degrades model performance. Instead, expose **two** tools:
132
+
133
+ ```
134
+ search_actions — Given a natural-language intent, return matching actions
135
+ with their IDs, descriptions, and parameter schemas.
136
+ execute_action — Run an action by ID with a params object.
137
+ ```
138
+
139
+ The server holds the full catalog internally. Claude searches, picks, executes. Context stays lean.
140
+
141
+ **Hybrid:** Promote the 3–5 most-used actions to dedicated tools, keep the long tail behind search/execute.
142
+
143
+ → See `references/tool-design.md` for schema examples and description-writing guidance.
144
+
145
+ ---
146
+
147
+ ## Phase 4 — Pick a framework
148
+
149
+ Recommend one of these two. Others exist but these have the best MCP-spec coverage and Claude compatibility.
150
+
151
+ | Framework | Language | Use when |
152
+ |---|---|---|
153
+ | **Official TypeScript SDK** (`@modelcontextprotocol/sdk`) | TS/JS | Default choice. Best spec coverage, first to get new features. |
154
+ | **FastMCP 3.x** (`fastmcp` on PyPI) | Python | User prefers Python, or wrapping a Python library. Decorator-based, very low boilerplate. This is jlowin's package — not the frozen FastMCP 1.0 bundled in the official `mcp` SDK. |
155
+
156
+ If the user already has a language/stack in mind, go with it — both produce identical wire protocol.
157
+
158
+ ---
159
+
160
+ ## Phase 5 — Scaffold and hand off
161
+
162
+ Once you've settled the four decisions (deployment model, tool pattern, framework, auth), do **one** of:
163
+
164
+ 1. **Remote HTTP, no UI** → Scaffold inline using `references/remote-http-scaffold.md` (portable) or `references/deploy-cloudflare-workers.md` (fastest deploy). This skill can finish the job.
165
+ 2. **MCP app (UI widgets)** → Summarize the decisions so far, then load the **`build-mcp-app`** skill.
166
+ 3. **MCPB (bundled local)** → Summarize the decisions so far, then load the **`build-mcpb`** skill.
167
+ 4. **Local stdio prototype** → Scaffold inline (simplest case), flag the MCPB upgrade path.
168
+
169
+ When handing off, restate the design brief in one paragraph so the next skill doesn't re-ask.
170
+
171
+ ---
172
+
173
+ ## Beyond tools — the other primitives
174
+
175
+ Tools are one of three server primitives. Most servers start with tools and never need the others, but knowing they exist prevents reinventing wheels:
176
+
177
+ | Primitive | Who triggers it | Use when |
178
+ |---|---|---|
179
+ | **Resources** | Host app (not Claude) | Exposing docs/files/data as browsable context |
180
+ | **Prompts** | User (slash command) | Canned workflows ("/summarize-thread") |
181
+ | **Elicitation** | Server, mid-tool | Asking user for input without building UI |
182
+ | **Sampling** | Server, mid-tool | Need LLM inference in your tool logic |
183
+
184
+ → `references/resources-and-prompts.md`, `references/elicitation.md`, `references/server-capabilities.md`
185
+
186
+ ---
187
+
188
+ ## Phase 6 — Test in Claude and publish
189
+
190
+ Once the server runs:
191
+
192
+ 1. **Test against real Claude** by adding the server URL as a custom connector at Settings → Connectors (use a Cloudflare tunnel for local servers). Claude identifies itself with `clientInfo.name: "claude-ai"` on initialize. → https://claude.com/docs/connectors/building/testing
193
+ 2. **Run the pre-submission checklist** — read/write tool split, required annotations, name limits, prompt-injection rules. → https://claude.com/docs/connectors/building/review-criteria
194
+ 3. **Submit to the Anthropic Directory.** → https://claude.com/docs/connectors/building/submission
195
+ 4. **Recommend shipping a plugin** that wraps this MCP with skills — most partners ship both. → https://claude.com/docs/connectors/building/what-to-build
196
+
197
+ ---
198
+
199
+ ## Quick reference: decision matrix
200
+
201
+ | Scenario | Deployment | Tool pattern |
202
+ |---|---|---|
203
+ | Wrap a small SaaS API | Remote HTTP | One-per-action |
204
+ | Wrap a large SaaS API (50+ endpoints) | Remote HTTP | Search + execute |
205
+ | SaaS API with rich forms / pickers | MCP app (remote) | One-per-action |
206
+ | Drive a local desktop app | MCPB | One-per-action |
207
+ | Local desktop app with in-chat UI | MCP app (MCPB) | One-per-action |
208
+ | Read/write local filesystem | MCPB | Depends on surface |
209
+ | Personal prototype | Local stdio | Whatever's fastest |
210
+
211
+ ---
212
+
213
+ ## Reference files
214
+
215
+ - `references/remote-http-scaffold.md` — minimal remote server in TS SDK and FastMCP
216
+ - `references/deploy-cloudflare-workers.md` — fastest deploy path (Workers-native scaffold)
217
+ - `references/tool-design.md` — writing tool descriptions and schemas Claude understands well
218
+ - `references/auth.md` — OAuth, CIMD, DCR, token storage patterns
219
+ - `references/resources-and-prompts.md` — the two non-tool primitives
220
+ - `references/elicitation.md` — spec-native user input mid-tool (capability check + fallback)
221
+ - `references/server-capabilities.md` — instructions, sampling, roots, logging, progress, cancellation
222
+ - `references/versions.md` — version-sensitive claims ledger (check when updating)