From hn-mcp-server
Migrates an mcp-ts-template fork to use @cyanheads/mcp-ts-core as a package dependency, rewriting framework imports and removing bundled source files.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hn-mcp-server:migrate-mcp-ts-templateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Before `@cyanheads/mcp-ts-core` was published as a package, users built servers by forking/cloning the `mcp-ts-template` repo. Those forks carry the full framework source code in their `src/` and use `@/` path aliases to import framework internals alongside their own server code.
Before @cyanheads/mcp-ts-core was published as a package, users built servers by forking/cloning the mcp-ts-template repo. Those forks carry the full framework source code in their src/ and use @/ path aliases to import framework internals alongside their own server code.
This skill converts such a project to use @cyanheads/mcp-ts-core as a dependency — rewriting framework imports to package subpaths and removing the bundled framework files, while leaving server-specific code (tools, resources, prompts, services) untouched.
For the full exports catalog, see CLAUDE.md → Exports Reference.
bun add @cyanheads/mcp-ts-core@/ imports across src/ that reference framework internalssrc/index.ts) to use createApp() from the package and the project's chosen registration pattern (fresh scaffold default: direct imports in src/index.ts)tsconfig.json extends @cyanheads/mcp-ts-core/tsconfig.base.jsonbiome.json extends @cyanheads/mcp-ts-core/biomevitest.config.ts spreads from @cyanheads/mcp-ts-core/vitest.configbun run devcheck to verify no broken imports remain@/ imports point to framework files that are no longer localThese are the actual @/ import paths used in framework source. Rewrite any that appear in server-specific files (tools, resources, services, config).
Old @/ import | New package import |
|---|---|
@/config/index.js | @cyanheads/mcp-ts-core/config |
@/context.js or @/core/context.js | @cyanheads/mcp-ts-core |
@/core/worker.js | @cyanheads/mcp-ts-core/worker |
@/types-global/errors.js | @cyanheads/mcp-ts-core/errors |
@/storage/core/StorageService.js | @cyanheads/mcp-ts-core/storage |
@/storage/core/IStorageProvider.js | @cyanheads/mcp-ts-core/storage/types |
@/mcp-server/transports/auth/lib/checkScopes.js | @cyanheads/mcp-ts-core/auth |
@/testing/index.js | @cyanheads/mcp-ts-core/testing |
Old @/ import | New package import |
|---|---|
@/mcp-server/tools/utils/toolDefinition.js | @cyanheads/mcp-ts-core/tools or @cyanheads/mcp-ts-core (for tool() builder) |
@/mcp-server/resources/utils/resourceDefinition.js | @cyanheads/mcp-ts-core/resources or @cyanheads/mcp-ts-core (for resource() builder) |
@/mcp-server/prompts/utils/promptDefinition.js | @cyanheads/mcp-ts-core/prompts or @cyanheads/mcp-ts-core (for prompt() builder) |
@/mcp-server/tasks/utils/taskToolDefinition.js | @cyanheads/mcp-ts-core/tasks |
Old @/ import | New package import |
|---|---|
@/utils/internal/logger.js | @cyanheads/mcp-ts-core/utils |
@/utils/internal/requestContext.js | @cyanheads/mcp-ts-core/utils |
@/utils/internal/error-handler/errorHandler.js | @cyanheads/mcp-ts-core/utils |
@/utils/internal/runtime.js | @cyanheads/mcp-ts-core/utils |
@/utils/internal/encoding.js | @cyanheads/mcp-ts-core/utils |
@/utils/formatting/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/parsing/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/security/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/network/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/pagination/pagination.js | @cyanheads/mcp-ts-core/utils |
@/utils/types/guards.js | @cyanheads/mcp-ts-core/utils |
@/utils/scheduling/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/telemetry/*.js | @cyanheads/mcp-ts-core/utils |
@/utils/metrics/*.js | @cyanheads/mcp-ts-core/utils |
Old @/ import | New package import |
|---|---|
@/services/llm/*.js | @cyanheads/mcp-ts-core/services |
@/services/speech/*.js | @cyanheads/mcp-ts-core/services |
@/services/graph/*.js | @cyanheads/mcp-ts-core/services |
After rewriting imports, these directories and files are candidates for cleanup — they contain framework code now provided by the package. Review each before acting: the server may have added custom files alongside framework code in any of these directories. Preserve anything server-specific.
Preserve: server-specific code under mcp-server/tools/definitions/, mcp-server/resources/definitions/, mcp-server/prompts/definitions/, the server's own services/, and config/server-config.ts.
Framework directories (typically safe to clean up in full — verify no server-specific files were added):
src/core/ (app, context, worker)src/cli/src/types-global/src/storage/src/utils/src/testing/src/services/llm/, src/services/speech/, src/services/graph/ (framework-provided services — the server's own service directories are separate)Framework files within directories that contain server code:
src/config/index.ts (the framework config loader — server-config.ts is server-specific, keep it)src/mcp-server/server.tssrc/mcp-server/transports/ (entire directory)src/mcp-server/roots/ (entire directory)src/mcp-server/tasks/ (core task infra — tool definitions using task: true are server code)src/mcp-server/tools/utils/, src/mcp-server/tools/tool-registration.tssrc/mcp-server/resources/utils/, src/mcp-server/resources/resource-registration.tssrc/mcp-server/prompts/utils/, src/mcp-server/prompts/prompt-registration.tsReplace the fork's src/index.ts with the scaffold-default direct-registration pattern:
#!/usr/bin/env node
import { createApp } from '@cyanheads/mcp-ts-core';
import { echoTool } from './mcp-server/tools/definitions/echo.tool.js';
import { echoResource } from './mcp-server/resources/definitions/echo.resource.js';
import { echoPrompt } from './mcp-server/prompts/definitions/echo.prompt.js';
await createApp({
tools: [echoTool],
resources: [echoResource],
prompts: [echoPrompt],
});
Add setup() if the server initializes services:
await createApp({
tools: [echoTool],
resources: [echoResource],
prompts: [echoPrompt],
setup(core) {
initMyService(core.config, core.storage);
},
});
If the migrated project already has definitions/index.ts barrels and you want to keep them, that is fine. The important part is removing imports from framework internals and registering definitions consistently.
@cyanheads/mcp-ts-core installed as a dependency@/ imports rewritten to @cyanheads/mcp-ts-core/* subpaths@/ imports point to framework files that are no longer localsrc/index.ts uses createApp() from the packagetsconfig.json extends @cyanheads/mcp-ts-core/tsconfig.base.jsonbiome.json extends @cyanheads/mcp-ts-core/biomevitest.config.ts spreads from @cyanheads/mcp-ts-core/vitest.configsrc/@/ imports (own tools, services) still workbun run devcheck passesnpx claudepluginhub cyanheads/cyanheads --plugin hn-mcp-server26plugins reuse this skill
First indexed May 27, 2026
Showing the 6 earliest of 26 plugins
Guides migration from OpenAI Apps SDK to MCP Apps SDK with API mappings, repo cloning, docs, and examples for vanilla JS, React, Vue, Svelte, Solid.
Orientation for MCP server projects built on @cyanheads/mcp-ts-core. Explains project structure, agent protocol files (CLAUDE.md/AGENTS.md), and skill sync model after `init`.
Builds MCP servers using Node/TypeScript SDK: tools, resources, prompts, Zod validation, stdio vs Streamable HTTP.