@jaypie/mcp 0.7.46 → 0.8.1

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 (41) hide show
  1. package/dist/suite.d.ts +1 -3
  2. package/dist/suite.js +1 -9
  3. package/dist/suite.js.map +1 -1
  4. package/dist/suites/docs/index.js +2 -9
  5. package/dist/suites/docs/index.js.map +1 -1
  6. package/package.json +1 -2
  7. package/release-notes/constructs/1.2.36.md +9 -0
  8. package/release-notes/llm/1.2.20.md +10 -0
  9. package/release-notes/mcp/0.8.0.md +21 -0
  10. package/skills/agents.md +4 -3
  11. package/skills/aws.md +1 -6
  12. package/skills/contents.md +1 -1
  13. package/skills/datadog.md +3 -3
  14. package/skills/dynamodb.md +1 -6
  15. package/skills/fabric.md +1 -1
  16. package/skills/llm.md +1 -0
  17. package/skills/{tools-datadog.md → mcp-datadog.md} +4 -4
  18. package/skills/mcp.md +63 -0
  19. package/skills/meta.md +3 -3
  20. package/skills/practice.md +10 -0
  21. package/skills/skills.md +2 -2
  22. package/skills/tildeskill.md +1 -1
  23. package/skills/tools.md +170 -85
  24. package/dist/suites/aws/aws.d.ts +0 -207
  25. package/dist/suites/aws/aws.js +0 -369
  26. package/dist/suites/aws/aws.js.map +0 -1
  27. package/dist/suites/aws/help.md +0 -87
  28. package/dist/suites/aws/index.d.ts +0 -68
  29. package/dist/suites/aws/index.js +0 -397
  30. package/dist/suites/aws/index.js.map +0 -1
  31. package/dist/suites/llm/help.md +0 -58
  32. package/dist/suites/llm/index.d.ts +0 -2
  33. package/dist/suites/llm/index.js +0 -77
  34. package/dist/suites/llm/index.js.map +0 -1
  35. package/dist/suites/llm/llm.d.ts +0 -53
  36. package/dist/suites/llm/llm.js +0 -111
  37. package/dist/suites/llm/llm.js.map +0 -1
  38. package/skills/index.md +0 -18
  39. package/skills/tools-aws.md +0 -208
  40. package/skills/tools-dynamodb.md +0 -179
  41. package/skills/tools-llm.md +0 -109
package/dist/suite.d.ts CHANGED
@@ -2,10 +2,8 @@
2
2
  * ServiceSuite for @jaypie/mcp
3
3
  * Provides metadata and direct execution for Jaypie MCP services
4
4
  *
5
- * Consolidated from 26 tools into 6 unified router-style tools:
6
- * - aws: 16 AWS CLI commands
5
+ * Unified router-style tools:
7
6
  * - datadog: 6 Datadog observability commands
8
- * - llm: 2 LLM debugging commands
9
7
  * - skill: Jaypie development documentation
10
8
  * - version: Package version info
11
9
  * - release_notes: Package release notes
package/dist/suite.js CHANGED
@@ -1,17 +1,13 @@
1
1
  import { createServiceSuite } from '@jaypie/fabric';
2
- import { awsService } from './suites/aws/index.js';
3
2
  import { datadogService } from './suites/datadog/index.js';
4
3
  import { skillService, versionService, releaseNotesService } from './suites/docs/index.js';
5
- import { llmService } from './suites/llm/index.js';
6
4
 
7
5
  /**
8
6
  * ServiceSuite for @jaypie/mcp
9
7
  * Provides metadata and direct execution for Jaypie MCP services
10
8
  *
11
- * Consolidated from 26 tools into 6 unified router-style tools:
12
- * - aws: 16 AWS CLI commands
9
+ * Unified router-style tools:
13
10
  * - datadog: 6 Datadog observability commands
14
- * - llm: 2 LLM debugging commands
15
11
  * - skill: Jaypie development documentation
16
12
  * - version: Package version info
17
13
  * - release_notes: Package release notes
@@ -28,12 +24,8 @@ const suite = createServiceSuite({
28
24
  suite.register(skillService, { category: "docs" });
29
25
  suite.register(versionService, { category: "docs" });
30
26
  suite.register(releaseNotesService, { category: "docs" });
31
- // Register AWS services
32
- suite.register(awsService, { category: "aws" });
33
27
  // Register Datadog services
34
28
  suite.register(datadogService, { category: "datadog" });
35
- // Register LLM services
36
- suite.register(llmService, { category: "llm" });
37
29
 
38
30
  export { suite };
39
31
  //# sourceMappingURL=suite.js.map
package/dist/suite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"suite.js","sources":["../src/suite.ts"],"sourcesContent":["/**\n * ServiceSuite for @jaypie/mcp\n * Provides metadata and direct execution for Jaypie MCP services\n *\n * Consolidated from 26 tools into 6 unified router-style tools:\n * - aws: 16 AWS CLI commands\n * - datadog: 6 Datadog observability commands\n * - llm: 2 LLM debugging commands\n * - skill: Jaypie development documentation\n * - version: Package version info\n * - release_notes: Package release notes\n */\n\nimport { createServiceSuite } from \"@jaypie/fabric\";\n\nimport { awsService } from \"./suites/aws/index.js\";\nimport { datadogService } from \"./suites/datadog/index.js\";\nimport {\n releaseNotesService,\n skillService,\n versionService,\n} from \"./suites/docs/index.js\";\nimport { llmService } from \"./suites/llm/index.js\";\n\n// =============================================================================\n// SUITE CREATION\n// =============================================================================\n\nconst VERSION = \"0.5.0\";\n\nexport const suite = createServiceSuite({\n name: \"jaypie\",\n version: VERSION,\n});\n\n// Register docs services\nsuite.register(skillService, { category: \"docs\" });\nsuite.register(versionService, { category: \"docs\" });\nsuite.register(releaseNotesService, { category: \"docs\" });\n\n// Register AWS services\nsuite.register(awsService, { category: \"aws\" });\n\n// Register Datadog services\nsuite.register(datadogService, { category: \"datadog\" });\n\n// Register LLM services\nsuite.register(llmService, { category: \"llm\" });\n"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;AAWG;AAaH;AACA;AACA;AAEA,MAAM,OAAO,GAAG,OAAO;AAEhB,MAAM,KAAK,GAAG,kBAAkB,CAAC;AACtC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,OAAO;AACjB,CAAA;AAED;AACA,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAClD,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACpD,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEzD;AACA,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAE/C;AACA,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAEvD;AACA,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;;;"}
1
+ {"version":3,"file":"suite.js","sources":["../src/suite.ts"],"sourcesContent":["/**\n * ServiceSuite for @jaypie/mcp\n * Provides metadata and direct execution for Jaypie MCP services\n *\n * Unified router-style tools:\n * - datadog: 6 Datadog observability commands\n * - skill: Jaypie development documentation\n * - version: Package version info\n * - release_notes: Package release notes\n */\n\nimport { createServiceSuite } from \"@jaypie/fabric\";\n\nimport { datadogService } from \"./suites/datadog/index.js\";\nimport {\n releaseNotesService,\n skillService,\n versionService,\n} from \"./suites/docs/index.js\";\n\n// =============================================================================\n// SUITE CREATION\n// =============================================================================\n\nconst VERSION = \"0.5.0\";\n\nexport const suite = createServiceSuite({\n name: \"jaypie\",\n version: VERSION,\n});\n\n// Register docs services\nsuite.register(skillService, { category: \"docs\" });\nsuite.register(versionService, { category: \"docs\" });\nsuite.register(releaseNotesService, { category: \"docs\" });\n\n// Register Datadog services\nsuite.register(datadogService, { category: \"datadog\" });\n"],"names":[],"mappings":";;;;AAAA;;;;;;;;;AASG;AAWH;AACA;AACA;AAEA,MAAM,OAAO,GAAG,OAAO;AAEhB,MAAM,KAAK,GAAG,kBAAkB,CAAC;AACtC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,OAAO;AACjB,CAAA;AAED;AACA,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAClD,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACpD,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEzD;AACA,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;;;"}
@@ -9,7 +9,7 @@ import { gt } from 'semver';
9
9
  /**
10
10
  * Docs Suite - Documentation services (skill, version, release_notes)
11
11
  */
12
- const BUILD_VERSION_STRING = "@jaypie/mcp@0.7.46#84dfda2f"
12
+ const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.1#19334af2"
13
13
  ;
14
14
  const __filename$1 = fileURLToPath(import.meta.url);
15
15
  const __dirname$1 = path.dirname(__filename$1);
@@ -152,17 +152,10 @@ const skillService = fabricService({
152
152
  throw new Error(`Invalid skill alias "${alias}". Use alphanumeric characters, hyphens, and underscores only.`);
153
153
  }
154
154
  if (alias === "index") {
155
- // Get index content
156
- const indexRecord = await skillStore.get("index");
157
- const indexContent = indexRecord?.content || "";
158
- // List all skills except index
159
155
  const allSkills = await skillStore.list();
160
156
  const skills = allSkills.filter((s) => s.alias !== "index");
161
157
  const skillList = skills.map(formatSkillListItem).join("\n");
162
- if (indexContent) {
163
- return `${indexContent}\n\n## Available Skills\n\n${skillList}`;
164
- }
165
- return `# Jaypie Skills\n\n## Available Skills\n\n${skillList}`;
158
+ return `# Index of Skills\n\n${skillList}`;
166
159
  }
167
160
  // Try exact match first
168
161
  let skill = await skillStore.get(alias);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/suites/docs/index.ts"],"sourcesContent":["/**\n * Docs Suite - Documentation services (skill, version, release_notes)\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport {\n createMarkdownStore,\n isValidAlias,\n normalizeAlias,\n type SkillRecord,\n} from \"@jaypie/tildeskill\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\nimport { gt } from \"semver\";\n\n// Build-time constants\ndeclare const __BUILD_VERSION_STRING__: string;\nconst BUILD_VERSION_STRING =\n typeof __BUILD_VERSION_STRING__ !== \"undefined\"\n ? __BUILD_VERSION_STRING__\n : \"@jaypie/mcp@0.0.0\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// From dist/suites/docs/, go up 3 levels to package root where skills/ and release-notes/ live\n// Environment variables allow overriding paths when bundled (e.g., esbuild Lambda)\nconst RELEASE_NOTES_PATH =\n process.env.MCP_RELEASE_NOTES_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"release-notes\");\nconst SKILLS_PATH =\n process.env.MCP_SKILLS_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\n// Create skill store using tildeskill\nconst skillStore = createMarkdownStore({ path: SKILLS_PATH });\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\nasync function parseReleaseNoteFile(filePath: string): Promise<{\n date?: string;\n filename: string;\n summary?: string;\n version?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as ReleaseNoteFrontMatter;\n return {\n date: frontMatter.date,\n filename,\n summary: frontMatter.summary,\n version: frontMatter.version || filename,\n };\n }\n\n return { filename, version: filename };\n } catch {\n return { filename: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatReleaseNoteListItem(note: {\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}): string {\n const { date, packageName, summary, version } = note;\n const parts = [`* ${packageName}@${version}`];\n\n if (date) {\n parts.push(`(${date})`);\n }\n\n if (summary) {\n parts.push(`- ${summary}`);\n }\n\n return parts.join(\" \");\n}\n\nfunction formatSkillListItem(skill: SkillRecord): string {\n const { alias, description } = skill;\n if (description) {\n return `* ${alias} - ${description}`;\n }\n return `* ${alias}`;\n}\n\nasync function getPackageReleaseNotes(packageName: string): Promise<\n Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>\n> {\n const packageDir = path.join(RELEASE_NOTES_PATH, packageName);\n try {\n const files = await fs.readdir(packageDir);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n const notes = await Promise.all(\n mdFiles.map(async (file) => {\n const parsed = await parseReleaseNoteFile(path.join(packageDir, file));\n return { ...parsed, packageName };\n }),\n );\n\n return notes.sort((a, b) => {\n if (!a.version || !b.version) return 0;\n try {\n return gt(a.version, b.version) ? -1 : 1;\n } catch {\n return b.version.localeCompare(a.version);\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction filterReleaseNotesSince(\n notes: Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>,\n sinceVersion: string,\n): Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}> {\n return notes.filter((note) => {\n if (!note.version) return false;\n try {\n return gt(note.version, sinceVersion);\n } catch {\n return false;\n }\n });\n}\n\n// =============================================================================\n// SKILL SERVICE\n// =============================================================================\n\n/**\n * Generate alternative spellings for plural/singular matching\n */\nfunction getAlternativeSpellings(alias: string): string[] {\n const alternatives: string[] = [];\n\n if (alias.endsWith(\"es\")) {\n // \"indexes\" -> try \"indexe\" and \"index\"\n alternatives.push(alias.slice(0, -1)); // Remove \"s\" -> \"indexe\"\n alternatives.push(alias.slice(0, -2)); // Remove \"es\" -> \"index\"\n } else if (alias.endsWith(\"s\")) {\n // \"skills\" -> try \"skill\"\n alternatives.push(alias.slice(0, -1)); // Remove \"s\" -> \"skill\"\n } else {\n // \"fish\" -> try \"fishs\" and \"fishes\"\n alternatives.push(alias + \"s\");\n alternatives.push(alias + \"es\");\n }\n\n return alternatives;\n}\n\n/**\n * Add alias to frontmatter indicating the canonical skill name\n */\nfunction addAliasToFrontmatter(content: string, matchedAlias: string): string {\n if (content.startsWith(\"---\")) {\n // Find the end of frontmatter\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex !== -1) {\n // Insert alias before the closing ---\n const beforeClose = content.slice(0, endIndex);\n const afterClose = content.slice(endIndex);\n return `${beforeClose}alias: ${matchedAlias}\\n${afterClose}`;\n }\n }\n // No frontmatter exists, create one\n return `---\\nalias: ${matchedAlias}\\n---\\n\\n${content}`;\n}\n\nexport const skillService = fabricService({\n alias: \"skill\",\n description:\n \"Access Jaypie development documentation. Pass a skill alias (e.g., 'aws', 'tests', 'errors') to get that documentation. Pass 'index' or no argument to list all available skills.\",\n input: {\n alias: {\n description:\n \"Skill alias (e.g., 'aws', 'tests'). Omit or use 'index' to list all skills.\",\n required: false,\n type: String,\n },\n },\n service: async ({ alias: inputAlias }: { alias?: string }) => {\n const alias = normalizeAlias(inputAlias || \"index\");\n\n if (!isValidAlias(alias)) {\n throw new Error(\n `Invalid skill alias \"${alias}\". Use alphanumeric characters, hyphens, and underscores only.`,\n );\n }\n\n if (alias === \"index\") {\n // Get index content\n const indexRecord = await skillStore.get(\"index\");\n const indexContent = indexRecord?.content || \"\";\n\n // List all skills except index\n const allSkills = await skillStore.list();\n const skills = allSkills.filter(\n (s: { alias: string }) => s.alias !== \"index\",\n );\n const skillList = skills.map(formatSkillListItem).join(\"\\n\");\n\n if (indexContent) {\n return `${indexContent}\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n return `# Jaypie Skills\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n\n // Try exact match first\n let skill = await skillStore.get(alias);\n let matchedAlias = alias;\n\n // If no exact match, try alternative spellings (plural/singular)\n if (!skill) {\n const alternatives = getAlternativeSpellings(alias);\n for (const alt of alternatives) {\n skill = await skillStore.get(alt);\n if (skill) {\n matchedAlias = alt;\n break;\n }\n }\n }\n\n if (!skill) {\n throw new Error(\n `Skill \"${alias}\" not found. Use skill(\"index\") to list available skills.`,\n );\n }\n\n // Return raw file content for non-index skills (preserve frontmatter)\n const skillPath = path.join(SKILLS_PATH, `${matchedAlias}.md`);\n let content = await fs.readFile(skillPath, \"utf-8\");\n\n // If we matched via alternative spelling, add alias to indicate canonical name\n if (matchedAlias !== alias) {\n content = addAliasToFrontmatter(content, matchedAlias);\n }\n\n return content;\n },\n});\n\n// =============================================================================\n// VERSION SERVICE\n// =============================================================================\n\nexport const versionService = fabricService({\n alias: \"version\",\n description: `Prints the current version and hash, \\`${BUILD_VERSION_STRING}\\``,\n input: {},\n service: async () => BUILD_VERSION_STRING,\n});\n\n// =============================================================================\n// RELEASE NOTES SERVICE\n// =============================================================================\n\nasync function getReleaseNotesHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"release-notes\", \"help.md\"), \"utf-8\");\n}\n\ninterface ReleaseNotesInput {\n package?: string;\n since_version?: string;\n version?: string;\n}\n\nexport const releaseNotesService = fabricService({\n alias: \"release_notes\",\n description:\n \"Browse Jaypie package release notes. Commands: list, read. Call with no args for help.\",\n input: {\n command: {\n description: \"Command to execute (omit for help)\",\n required: false,\n type: String,\n },\n input: {\n description: \"Command parameters\",\n required: false,\n type: Object,\n },\n },\n service: async ({\n command,\n input: params,\n }: {\n command?: string;\n input?: ReleaseNotesInput;\n }) => {\n if (!command || command === \"help\") {\n return getReleaseNotesHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"list\": {\n const entries = await fs.readdir(RELEASE_NOTES_PATH, {\n withFileTypes: true,\n });\n const packageDirs = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n const packagesToList = p.package\n ? packageDirs.filter((pkg) => pkg === p.package)\n : packageDirs;\n\n if (packagesToList.length === 0 && p.package) {\n return `No release notes found for package \"${p.package}\".`;\n }\n\n const allNotes = await Promise.all(\n packagesToList.map((pkg) => getPackageReleaseNotes(pkg)),\n );\n let flatNotes = allNotes.flat();\n\n if (p.since_version) {\n flatNotes = filterReleaseNotesSince(flatNotes, p.since_version);\n }\n\n if (flatNotes.length === 0) {\n const filterDesc = p.since_version\n ? ` newer than ${p.since_version}`\n : \"\";\n return `No release notes found${filterDesc}.`;\n }\n\n return flatNotes.map(formatReleaseNoteListItem).join(\"\\n\");\n }\n\n case \"read\": {\n if (!p.package) throw new Error(\"package is required\");\n if (!p.version) throw new Error(\"version is required\");\n const filePath = path.join(\n RELEASE_NOTES_PATH,\n p.package,\n `${p.version}.md`,\n );\n return fs.readFile(filePath, \"utf-8\");\n }\n\n default:\n throw new Error(\n `Unknown command: ${command}. Use release_notes() for help.`,\n );\n }\n },\n});\n"],"names":["__filename","__dirname"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/suites/docs/index.ts"],"sourcesContent":["/**\n * Docs Suite - Documentation services (skill, version, release_notes)\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport {\n createMarkdownStore,\n isValidAlias,\n normalizeAlias,\n type SkillRecord,\n} from \"@jaypie/tildeskill\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\nimport { gt } from \"semver\";\n\n// Build-time constants\ndeclare const __BUILD_VERSION_STRING__: string;\nconst BUILD_VERSION_STRING =\n typeof __BUILD_VERSION_STRING__ !== \"undefined\"\n ? __BUILD_VERSION_STRING__\n : \"@jaypie/mcp@0.0.0\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// From dist/suites/docs/, go up 3 levels to package root where skills/ and release-notes/ live\n// Environment variables allow overriding paths when bundled (e.g., esbuild Lambda)\nconst RELEASE_NOTES_PATH =\n process.env.MCP_RELEASE_NOTES_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"release-notes\");\nconst SKILLS_PATH =\n process.env.MCP_SKILLS_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\n// Create skill store using tildeskill\nconst skillStore = createMarkdownStore({ path: SKILLS_PATH });\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\nasync function parseReleaseNoteFile(filePath: string): Promise<{\n date?: string;\n filename: string;\n summary?: string;\n version?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as ReleaseNoteFrontMatter;\n return {\n date: frontMatter.date,\n filename,\n summary: frontMatter.summary,\n version: frontMatter.version || filename,\n };\n }\n\n return { filename, version: filename };\n } catch {\n return { filename: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatReleaseNoteListItem(note: {\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}): string {\n const { date, packageName, summary, version } = note;\n const parts = [`* ${packageName}@${version}`];\n\n if (date) {\n parts.push(`(${date})`);\n }\n\n if (summary) {\n parts.push(`- ${summary}`);\n }\n\n return parts.join(\" \");\n}\n\nfunction formatSkillListItem(skill: SkillRecord): string {\n const { alias, description } = skill;\n if (description) {\n return `* ${alias} - ${description}`;\n }\n return `* ${alias}`;\n}\n\nasync function getPackageReleaseNotes(packageName: string): Promise<\n Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>\n> {\n const packageDir = path.join(RELEASE_NOTES_PATH, packageName);\n try {\n const files = await fs.readdir(packageDir);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n const notes = await Promise.all(\n mdFiles.map(async (file) => {\n const parsed = await parseReleaseNoteFile(path.join(packageDir, file));\n return { ...parsed, packageName };\n }),\n );\n\n return notes.sort((a, b) => {\n if (!a.version || !b.version) return 0;\n try {\n return gt(a.version, b.version) ? -1 : 1;\n } catch {\n return b.version.localeCompare(a.version);\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction filterReleaseNotesSince(\n notes: Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>,\n sinceVersion: string,\n): Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}> {\n return notes.filter((note) => {\n if (!note.version) return false;\n try {\n return gt(note.version, sinceVersion);\n } catch {\n return false;\n }\n });\n}\n\n// =============================================================================\n// SKILL SERVICE\n// =============================================================================\n\n/**\n * Generate alternative spellings for plural/singular matching\n */\nfunction getAlternativeSpellings(alias: string): string[] {\n const alternatives: string[] = [];\n\n if (alias.endsWith(\"es\")) {\n // \"indexes\" -> try \"indexe\" and \"index\"\n alternatives.push(alias.slice(0, -1)); // Remove \"s\" -> \"indexe\"\n alternatives.push(alias.slice(0, -2)); // Remove \"es\" -> \"index\"\n } else if (alias.endsWith(\"s\")) {\n // \"skills\" -> try \"skill\"\n alternatives.push(alias.slice(0, -1)); // Remove \"s\" -> \"skill\"\n } else {\n // \"fish\" -> try \"fishs\" and \"fishes\"\n alternatives.push(alias + \"s\");\n alternatives.push(alias + \"es\");\n }\n\n return alternatives;\n}\n\n/**\n * Add alias to frontmatter indicating the canonical skill name\n */\nfunction addAliasToFrontmatter(content: string, matchedAlias: string): string {\n if (content.startsWith(\"---\")) {\n // Find the end of frontmatter\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex !== -1) {\n // Insert alias before the closing ---\n const beforeClose = content.slice(0, endIndex);\n const afterClose = content.slice(endIndex);\n return `${beforeClose}alias: ${matchedAlias}\\n${afterClose}`;\n }\n }\n // No frontmatter exists, create one\n return `---\\nalias: ${matchedAlias}\\n---\\n\\n${content}`;\n}\n\nexport const skillService = fabricService({\n alias: \"skill\",\n description:\n \"Access Jaypie development documentation. Pass a skill alias (e.g., 'aws', 'tests', 'errors') to get that documentation. Pass 'index' or no argument to list all available skills.\",\n input: {\n alias: {\n description:\n \"Skill alias (e.g., 'aws', 'tests'). Omit or use 'index' to list all skills.\",\n required: false,\n type: String,\n },\n },\n service: async ({ alias: inputAlias }: { alias?: string }) => {\n const alias = normalizeAlias(inputAlias || \"index\");\n\n if (!isValidAlias(alias)) {\n throw new Error(\n `Invalid skill alias \"${alias}\". Use alphanumeric characters, hyphens, and underscores only.`,\n );\n }\n\n if (alias === \"index\") {\n const allSkills = await skillStore.list();\n const skills = allSkills.filter(\n (s: { alias: string }) => s.alias !== \"index\",\n );\n const skillList = skills.map(formatSkillListItem).join(\"\\n\");\n\n return `# Index of Skills\\n\\n${skillList}`;\n }\n\n // Try exact match first\n let skill = await skillStore.get(alias);\n let matchedAlias = alias;\n\n // If no exact match, try alternative spellings (plural/singular)\n if (!skill) {\n const alternatives = getAlternativeSpellings(alias);\n for (const alt of alternatives) {\n skill = await skillStore.get(alt);\n if (skill) {\n matchedAlias = alt;\n break;\n }\n }\n }\n\n if (!skill) {\n throw new Error(\n `Skill \"${alias}\" not found. Use skill(\"index\") to list available skills.`,\n );\n }\n\n // Return raw file content for non-index skills (preserve frontmatter)\n const skillPath = path.join(SKILLS_PATH, `${matchedAlias}.md`);\n let content = await fs.readFile(skillPath, \"utf-8\");\n\n // If we matched via alternative spelling, add alias to indicate canonical name\n if (matchedAlias !== alias) {\n content = addAliasToFrontmatter(content, matchedAlias);\n }\n\n return content;\n },\n});\n\n// =============================================================================\n// VERSION SERVICE\n// =============================================================================\n\nexport const versionService = fabricService({\n alias: \"version\",\n description: `Prints the current version and hash, \\`${BUILD_VERSION_STRING}\\``,\n input: {},\n service: async () => BUILD_VERSION_STRING,\n});\n\n// =============================================================================\n// RELEASE NOTES SERVICE\n// =============================================================================\n\nasync function getReleaseNotesHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"release-notes\", \"help.md\"), \"utf-8\");\n}\n\ninterface ReleaseNotesInput {\n package?: string;\n since_version?: string;\n version?: string;\n}\n\nexport const releaseNotesService = fabricService({\n alias: \"release_notes\",\n description:\n \"Browse Jaypie package release notes. Commands: list, read. Call with no args for help.\",\n input: {\n command: {\n description: \"Command to execute (omit for help)\",\n required: false,\n type: String,\n },\n input: {\n description: \"Command parameters\",\n required: false,\n type: Object,\n },\n },\n service: async ({\n command,\n input: params,\n }: {\n command?: string;\n input?: ReleaseNotesInput;\n }) => {\n if (!command || command === \"help\") {\n return getReleaseNotesHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"list\": {\n const entries = await fs.readdir(RELEASE_NOTES_PATH, {\n withFileTypes: true,\n });\n const packageDirs = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n const packagesToList = p.package\n ? packageDirs.filter((pkg) => pkg === p.package)\n : packageDirs;\n\n if (packagesToList.length === 0 && p.package) {\n return `No release notes found for package \"${p.package}\".`;\n }\n\n const allNotes = await Promise.all(\n packagesToList.map((pkg) => getPackageReleaseNotes(pkg)),\n );\n let flatNotes = allNotes.flat();\n\n if (p.since_version) {\n flatNotes = filterReleaseNotesSince(flatNotes, p.since_version);\n }\n\n if (flatNotes.length === 0) {\n const filterDesc = p.since_version\n ? ` newer than ${p.since_version}`\n : \"\";\n return `No release notes found${filterDesc}.`;\n }\n\n return flatNotes.map(formatReleaseNoteListItem).join(\"\\n\");\n }\n\n case \"read\": {\n if (!p.package) throw new Error(\"package is required\");\n if (!p.version) throw new Error(\"version is required\");\n const filePath = path.join(\n RELEASE_NOTES_PATH,\n p.package,\n `${p.version}.md`,\n );\n return fs.readFile(filePath, \"utf-8\");\n }\n\n default:\n throw new Error(\n `Unknown command: ${command}. Use release_notes() for help.`,\n );\n }\n },\n});\n"],"names":["__filename","__dirname"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/mcp",
3
- "version": "0.7.46",
3
+ "version": "0.8.1",
4
4
  "description": "Jaypie MCP",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,7 +40,6 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@jaypie/fabric": "^0.2.2",
43
- "@jaypie/llm": "^1.2.18",
44
43
  "@jaypie/tildeskill": "^0.2.0",
45
44
  "@modelcontextprotocol/sdk": "^1.17.0",
46
45
  "commander": "^14.0.0",
@@ -0,0 +1,9 @@
1
+ ---
2
+ version: 1.2.36
3
+ date: 2026-03-25
4
+ summary: Add ECR permissions to SSO developer role
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Added `ecr:*` permission to `JaypieSsoPermissions` developer role
@@ -0,0 +1,10 @@
1
+ ---
2
+ version: 1.2.20
3
+ date: 2026-03-26
4
+ summary: Fix orphaned tool_use block when tool call throws during streaming
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Fix: When a tool's `call` function throws during `Llm.stream()`, inject an error `tool_result` into the message history so the next turn has a matching pair, preventing Anthropic API 400 errors
10
+ - Fix: Apply the same correction in `OperateLoop` for non-streaming tool call failures
@@ -0,0 +1,21 @@
1
+ ---
2
+ version: 0.8.0
3
+ date: 2026-03-25
4
+ summary: Remove AWS, DynamoDB, and LLM MCP tools
5
+ ---
6
+
7
+ ## Breaking Changes
8
+
9
+ - Removed the `aws` MCP tool (Lambda, S3, SQS, CloudWatch, Step Functions, CloudFormation, DynamoDB commands)
10
+ - Removed the `llm` MCP tool (debug_call, validate commands)
11
+ - Removed `mcp-aws`, `mcp-dynamodb`, and `mcp-llm` skill files
12
+ - Removed `@jaypie/llm` dependency
13
+
14
+ ## Changes
15
+
16
+ - Skill index now returns a flat `# Index of Skills` listing (removed `index.md` dependency)
17
+
18
+ ## Notes
19
+
20
+ - Skill documentation for AWS, DynamoDB, and LLM remains available (`skill("aws")`, `skill("dynamodb")`, `skill("llm")`)
21
+ - MCP server now provides 4 tools: `skill`, `version`, `release_notes`, `datadog`
package/skills/agents.md CHANGED
@@ -21,7 +21,7 @@ Complete stack styles, techniques, and traditions.
21
21
 
22
22
  - Call `mcp__jaypie__skill("skills")` to discover Jaypie development skills and tools available in this repository
23
23
  - A `~` before a word or surrounding a word/phrase indicates it can be looked up as in ~skills
24
- - Check ~tools (`mcp__jaypie__skill("tools")`) for all tools or ~tools-aws, ~tools-datadog, and ~tools-dynamodb individually
24
+ - Check ~mcp (`mcp__jaypie__skill("mcp")`) for all MCP tools or ~mcp-datadog individually
25
25
  - File bugs, documentation, features, and other issues with `mcp__jaypie__skill("issues")`
26
26
 
27
27
  ### Code
@@ -33,10 +33,11 @@ Complete stack styles, techniques, and traditions.
33
33
  `mcp__jaypie__skill(alias: String)`
34
34
 
35
35
  Contents: index, releasenotes
36
- Development: apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests
36
+ Development: apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests, tools
37
37
  Infrastructure: aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, secrets, streaming, variables, websockets
38
38
  Patterns: api, fabric, handlers, models, services, vocabulary
39
- Meta: issues, jaypie, skills, tools
39
+ Recipes: recipe-api-server
40
+ Meta: issues, jaypie, mcp, skills
40
41
  ```
41
42
 
42
43
  ## Short Version
package/skills/aws.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: AWS integration and cloud services code patterns
3
- related: cdk, dynamodb, secrets, logs, tools-aws
3
+ related: cdk, dynamodb, secrets, logs
4
4
  ---
5
5
 
6
6
  # AWS Integration
@@ -8,10 +8,6 @@ related: cdk, dynamodb, secrets, logs, tools-aws
8
8
  Jaypie integrates with AWS services through the `@jaypie/aws` package and CDK constructs.
9
9
  Access `@jaypie/aws` through the main `jaypie` package.
10
10
 
11
- ## MCP Tools
12
-
13
- For interactive AWS tools (Lambda, S3, SQS, CloudWatch, Step Functions, CloudFormation), see **tools-aws**.
14
-
15
11
  ## @jaypie/aws Package
16
12
 
17
13
  The `@jaypie/aws` package provides SDK utilities for Secrets Manager, SQS, S3, Textract, and streaming.
@@ -284,4 +280,3 @@ describe("Handler", () => {
284
280
  - **`skill("dynamodb")`** - DynamoDB key design and query patterns
285
281
  - **`skill("lambda")`** - Lambda handler wrappers with secrets loading
286
282
  - **`skill("secrets")`** - Secret management with JaypieEnvSecret
287
- - **`skill("tools-aws")`** - Interactive AWS MCP tools
@@ -13,7 +13,7 @@ Reference materials for navigating Jaypie.
13
13
  |-------|-------------|
14
14
  | `development` | Coding standards, testing, and documentation |
15
15
  | `infrastructure` | AWS, CDK, CI/CD, and observability |
16
- | `meta` | About Jaypie, tools, and contributing |
16
+ | `meta` | About Jaypie, MCP, and contributing |
17
17
  | `patterns` | Architecture, models, and service patterns |
18
18
 
19
19
  ## Reference
package/skills/datadog.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Datadog integration, logging, and observability code patterns
3
- related: logs, debugging, aws, tools-datadog
3
+ related: logs, debugging, aws, mcp-datadog
4
4
  ---
5
5
 
6
6
  # Datadog Integration
@@ -9,7 +9,7 @@ Jaypie integrates with Datadog for logging, monitoring, and APM.
9
9
 
10
10
  ## MCP Tools
11
11
 
12
- For interactive Datadog tools (logs, monitors, metrics, synthetics, RUM), see **tools-datadog**.
12
+ For interactive Datadog tools (logs, monitors, metrics, synthetics, RUM), see **mcp-datadog**.
13
13
 
14
14
  ## Lambda Integration
15
15
 
@@ -196,6 +196,6 @@ describe("CheckoutService", () => {
196
196
 
197
197
  - **`skill("cdk")`** - CDK Lambda construct with Datadog integration
198
198
  - **`skill("logs")`** - Logging patterns for structured observability
199
- - **`skill("tools-datadog")`** - Interactive Datadog MCP tools
199
+ - **`skill("mcp-datadog")`** - Datadog via the Jaypie MCP
200
200
  - **`skill("variables")`** - Datadog and environment variables reference
201
201
 
@@ -1,16 +1,12 @@
1
1
  ---
2
2
  description: DynamoDB runtime package, key design, entity operations, and queries
3
- related: apikey, aws, cdk, models, tools-dynamodb
3
+ related: apikey, aws, cdk, models
4
4
  ---
5
5
 
6
6
  # DynamoDB Patterns
7
7
 
8
8
  Jaypie provides `@jaypie/dynamodb` for single-table DynamoDB with entity operations, GSI-based queries, hierarchical scoping, and soft delete. Access through the main `jaypie` package or directly.
9
9
 
10
- ## MCP Tools
11
-
12
- For interactive DynamoDB tools (query, scan, get-item, describe-table), see **tools-dynamodb**.
13
-
14
10
  ## Key Naming Conventions
15
11
 
16
12
  Jaypie uses two key naming patterns. Understanding when to use each avoids confusion.
@@ -441,4 +437,3 @@ Version 0.4.0 renamed `class` → `category` and `indexClass` → `indexCategory
441
437
  - **`skill("apikey")`** - API key hash storage in DynamoDB
442
438
  - **`skill("cdk")`** - JaypieDynamoDb construct and Lambda table wiring
443
439
  - **`skill("models")`** - Data model and type definition patterns
444
- - **`skill("tools-dynamodb")`** - Interactive DynamoDB MCP tools
package/skills/fabric.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Fabric service patterns and adapters (pre-1.0)
3
- related: errors, handlers, services, tools, websockets
3
+ related: errors, handlers, mcp, services, websockets
4
4
  ---
5
5
 
6
6
  # Fabric Services
package/skills/llm.md CHANGED
@@ -406,3 +406,4 @@ interface LlmFallbackConfig {
406
406
  ## See Also
407
407
 
408
408
  - **`skill("streaming")`** - Streaming LLM responses to Lambda and Express with `createLambdaStream`
409
+ - **`skill("tools")`** - Writing LLM tools with Toolkit and Fabric services
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: Datadog MCP tool for logs, monitors, metrics, synthetics, and RUM
3
- related: datadog, tools, debugging, logs
2
+ description: Datadog observability provided by the Jaypie MCP (logs, monitors, metrics, synthetics, RUM)
3
+ related: datadog, mcp, debugging, logs
4
4
  ---
5
5
 
6
- # Datadog MCP Tool
6
+ # MCP: Datadog
7
7
 
8
- Unified tool for querying Datadog observability data via the Jaypie MCP.
8
+ Datadog observability provided by the Jaypie MCP server.
9
9
 
10
10
  ## Usage
11
11
 
package/skills/mcp.md ADDED
@@ -0,0 +1,63 @@
1
+ ---
2
+ description: Jaypie MCP server tools reference
3
+ related: mcp-datadog, debugging
4
+ ---
5
+
6
+ # Jaypie MCP
7
+
8
+ Tools provided by the Jaypie MCP server. All tools use a unified router-style API.
9
+
10
+ ## Documentation Tools
11
+
12
+ | Tool | Description |
13
+ |------|-------------|
14
+ | `skill` | Access Jaypie skill documentation |
15
+ | `version` | Get MCP server version |
16
+ | `release_notes` | Browse package release notes |
17
+
18
+ ### Using Skills
19
+
20
+ ```
21
+ skill("index") # List all skills
22
+ skill("jaypie") # Jaypie overview
23
+ skill("tests") # Testing patterns
24
+ ```
25
+
26
+ ### Release Notes
27
+
28
+ ```
29
+ release_notes() # Show help
30
+ release_notes("list") # List all release notes
31
+ release_notes("list", { package: "mcp" }) # Filter by package
32
+ release_notes("read", { package: "mcp", version: "0.5.0" }) # Read specific note
33
+ ```
34
+
35
+ ## Datadog Tool
36
+
37
+ Unified tool for logs, monitors, metrics, synthetics, and RUM.
38
+
39
+ See **mcp-datadog** for complete documentation.
40
+
41
+ ```
42
+ datadog() # Show help with all commands
43
+ datadog("logs", { query: "status:error", from: "now-1h" })
44
+ datadog("monitors", { status: ["Alert", "Warn"] })
45
+ ```
46
+
47
+ | Command | Description |
48
+ |---------|-------------|
49
+ | `logs` | Search log entries |
50
+ | `log_analytics` | Aggregate logs with groupBy |
51
+ | `monitors` | List and check monitors |
52
+ | `synthetics` | List synthetic tests |
53
+ | `metrics` | Query timeseries metrics |
54
+ | `rum` | Search RUM events |
55
+
56
+ ## Environment Variables
57
+
58
+ ### Datadog Tools
59
+ - `DATADOG_API_KEY` or `DD_API_KEY` - API key
60
+ - `DATADOG_APP_KEY` or `DD_APP_KEY` - App key
61
+ - `DD_ENV` - Default environment filter
62
+ - `DD_SERVICE` - Default service filter
63
+ - `DD_SOURCE` - Default log source
package/skills/meta.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: About Jaypie, tools, and contributing
3
- related: issues, jaypie, skills, tools
2
+ description: About Jaypie, MCP, and contributing
3
+ related: issues, jaypie, mcp, skills
4
4
  ---
5
5
 
6
6
  # Meta
@@ -13,5 +13,5 @@ About Jaypie and this skill system.
13
13
  |-------|-------------|
14
14
  | `issues` | Submitting issues to Jaypie |
15
15
  | `jaypie` | Jaypie overview and core concepts |
16
+ | `mcp` | Jaypie MCP server tools reference |
16
17
  | `skills` | About the skill system |
17
- | `tools` | Available MCP tools reference |
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Updates to Jaypie code, deploy, documentation, and other practices
3
+ ---
4
+
5
+ # Jaypie Practice
6
+
7
+ ## Workflow Dispatch Actions
8
+
9
+ - Prefer workflow dispatch actions over branch names and tagging
10
+ - Most work is agent-driven so "deploy to production" is more natural
package/skills/skills.md CHANGED
@@ -16,8 +16,8 @@ Look up skills by alias: `mcp__jaypie__skill(alias)`
16
16
  | Category | Skills |
17
17
  |----------|--------|
18
18
  | contents | index, releasenotes |
19
- | development | apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests |
19
+ | development | apikey, documentation, errors, llm, logs, mocks, monorepo, style, subpackages, tests, tools |
20
20
  | infrastructure | aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, secrets, streaming, variables, websockets |
21
21
  | patterns | api, fabric, handlers, models, services, vocabulary |
22
22
  | recipes | recipe-api-server |
23
- | meta | issues, jaypie, skills, tools |
23
+ | meta | issues, jaypie, mcp, skills |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Skill/vocabulary storage with pluggable backends (pre-1.0)
3
- related: fabric, mcp, tools
3
+ related: fabric, mcp
4
4
  ---
5
5
 
6
6
  # @jaypie/tildeskill