Help us improve
Share bugs, ideas, or general feedback.
From pubmed-mcp-server
Scaffolds a new MCP prompt template following the @cyanheads/mcp-ts-core conventions.
npx claudepluginhub cyanheads/cyanheads --plugin pubmed-mcp-serverHow this skill is triggered — by the user, by Claude, or both
Slash command
/pubmed-mcp-server:add-promptThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Prompts use the `prompt()` builder from `@cyanheads/mcp-ts-core`. Each prompt lives in `src/mcp-server/prompts/definitions/` with a `.prompt.ts` suffix. The standard registration pattern uses a `definitions/index.ts` barrel that collects all prompts into an `allPromptDefinitions` array for `createApp()`. Fresh scaffolds start with direct imports in `src/index.ts` — the barrel is introduced as d...
Scaffolds a new MCP prompt template following the @cyanheads/mcp-ts-core conventions.
Scaffolds MCP prompt templates using the @cyanheads/mcp-ts-core prompt() builder. Guides creation of definition files, argument schemas, and registration.
Orients developers after scaffolding an MCP server with @cyanheads/mcp-ts-core init. Explains agent protocol files (CLAUDE.md/AGENTS.md), project structure, conventions, and the skill sync model.
Share bugs, ideas, or general feedback.
Prompts use the prompt() builder from @cyanheads/mcp-ts-core. Each prompt lives in src/mcp-server/prompts/definitions/ with a .prompt.ts suffix. The standard registration pattern uses a definitions/index.ts barrel that collects all prompts into an allPromptDefinitions array for createApp(). Fresh scaffolds start with direct imports in src/index.ts — the barrel is introduced as definitions grow. Match the pattern already used by the project you're editing.
Prompts are pure message templates — no Context, no auth, no side effects. generate can be sync or async (returns PromptMessage[] | Promise<PromptMessage[]>).
src/mcp-server/prompts/definitions/{{prompt-name}}.prompt.tscreateApp() prompt list (directly in src/index.ts for fresh scaffolds, or via a barrel if the repo already has one)bun run devcheck to verify/**
* @fileoverview {{PROMPT_DESCRIPTION}}
* @module mcp-server/prompts/definitions/{{PROMPT_NAME}}
*/
import { prompt, z } from '@cyanheads/mcp-ts-core';
export const {{PROMPT_EXPORT}} = prompt('{{prompt_name}}', {
description: '{{PROMPT_DESCRIPTION}}',
// args is optional — omit entirely for prompts with no parameters.
// When present, all fields need .describe(). Only JSON-Schema-serializable types allowed.
args: z.object({
// All fields need .describe()
}),
generate: (args) => [
{
role: 'user',
content: {
type: 'text',
text: `{{PROMPT_TEMPLATE_TEXT}}`,
},
},
],
});
generate: (args) => [
{
role: 'user',
content: {
type: 'text',
text: `Here is the ${args.type} to review:\n\n${args.content}`,
},
},
{
role: 'assistant',
content: {
type: 'text',
text: 'I will analyze this carefully. Let me start with...',
},
},
],
// src/index.ts (fresh scaffold default)
import { createApp } from '@cyanheads/mcp-ts-core';
import { {{PROMPT_EXPORT}} } from './mcp-server/prompts/definitions/{{prompt-name}}.prompt.js';
await createApp({
tools: [/* existing tools */],
resources: [/* existing resources */],
prompts: [{{PROMPT_EXPORT}}],
});
If the repo already uses src/mcp-server/prompts/definitions/index.ts, add the export to that barrel instead:
export { {{PROMPT_EXPORT}} } from './{{prompt-name}}.prompt.js';
src/mcp-server/prompts/definitions/{{prompt-name}}.prompt.tsprompt() uses snake_casedescription field set (lint warns if absent, but devcheck won't hard-fail — verify it's present)args fields have .describe() annotations — or args omitted entirely for no-parameter promptsargs fields use only JSON-Schema-serializable Zod types (no z.date(), z.transform(), z.bigint(), z.symbol(), z.custom(), etc.)@fileoverview and @module header presentgenerate function present and returns at least one { role, content: { type: 'text', text } } messagecreateApp() prompt list (directly or via barrel)bun run devcheck passes