@cyanheads/mcp-ts-core 0.9.13 → 0.9.15

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 (79) hide show
  1. package/AGENTS.md +559 -0
  2. package/CLAUDE.md +8 -4
  3. package/README.md +33 -44
  4. package/changelog/0.9.x/0.9.14.md +31 -0
  5. package/changelog/0.9.x/0.9.15.md +52 -0
  6. package/changelog/template.md +1 -1
  7. package/dist/core/context.d.ts +119 -14
  8. package/dist/core/context.d.ts.map +1 -1
  9. package/dist/core/context.js +70 -1
  10. package/dist/core/context.js.map +1 -1
  11. package/dist/core/index.d.ts +1 -1
  12. package/dist/core/index.d.ts.map +1 -1
  13. package/dist/core/index.js.map +1 -1
  14. package/dist/linter/rules/enrichment-rules.d.ts +41 -0
  15. package/dist/linter/rules/enrichment-rules.d.ts.map +1 -0
  16. package/dist/linter/rules/enrichment-rules.js +204 -0
  17. package/dist/linter/rules/enrichment-rules.js.map +1 -0
  18. package/dist/linter/rules/index.d.ts +1 -0
  19. package/dist/linter/rules/index.d.ts.map +1 -1
  20. package/dist/linter/rules/index.js +1 -0
  21. package/dist/linter/rules/index.js.map +1 -1
  22. package/dist/linter/rules/schema-rules.d.ts +4 -0
  23. package/dist/linter/rules/schema-rules.d.ts.map +1 -1
  24. package/dist/linter/rules/schema-rules.js +2 -2
  25. package/dist/linter/rules/schema-rules.js.map +1 -1
  26. package/dist/linter/rules/tool-rules.d.ts.map +1 -1
  27. package/dist/linter/rules/tool-rules.js +4 -0
  28. package/dist/linter/rules/tool-rules.js.map +1 -1
  29. package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/tool-registration.js +7 -7
  31. package/dist/mcp-server/tools/tool-registration.js.map +1 -1
  32. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +81 -7
  33. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
  35. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +23 -1
  36. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  37. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +118 -9
  38. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  39. package/dist/testing/index.d.ts +13 -0
  40. package/dist/testing/index.d.ts.map +1 -1
  41. package/dist/testing/index.js +21 -1
  42. package/dist/testing/index.js.map +1 -1
  43. package/dist/utils/internal/performance.d.ts +5 -1
  44. package/dist/utils/internal/performance.d.ts.map +1 -1
  45. package/dist/utils/internal/performance.js +10 -1
  46. package/dist/utils/internal/performance.js.map +1 -1
  47. package/dist/utils/telemetry/attributes.d.ts +2 -0
  48. package/dist/utils/telemetry/attributes.d.ts.map +1 -1
  49. package/dist/utils/telemetry/attributes.js +2 -0
  50. package/dist/utils/telemetry/attributes.js.map +1 -1
  51. package/package.json +5 -3
  52. package/scripts/build-changelog.ts +3 -1
  53. package/scripts/check-skills-sync.ts +42 -8
  54. package/skills/add-app-tool/SKILL.md +2 -2
  55. package/skills/add-export/SKILL.md +2 -2
  56. package/skills/add-service/SKILL.md +2 -2
  57. package/skills/add-tool/SKILL.md +85 -32
  58. package/skills/api-context/SKILL.md +68 -3
  59. package/skills/api-linter/SKILL.md +73 -2
  60. package/skills/design-mcp-server/SKILL.md +2 -1
  61. package/skills/git-wrapup/SKILL.md +22 -15
  62. package/skills/maintenance/SKILL.md +8 -7
  63. package/skills/orchestrations/SKILL.md +9 -5
  64. package/skills/orchestrations/workflows/maintenance-release.md +1 -1
  65. package/skills/polish-docs-meta/SKILL.md +1 -1
  66. package/skills/polish-docs-meta/references/agent-protocol.md +2 -2
  67. package/skills/polish-docs-meta/references/readme.md +3 -3
  68. package/skills/report-issue-framework/SKILL.md +8 -3
  69. package/skills/report-issue-local/SKILL.md +8 -3
  70. package/skills/setup/SKILL.md +5 -10
  71. package/templates/AGENTS.md +2 -1
  72. package/templates/CLAUDE.md +2 -1
  73. package/templates/_.mcpbignore +2 -0
  74. package/templates/changelog/template.md +1 -1
  75. package/templates/package.json +2 -1
  76. package/templates/src/mcp-server/tools/definitions/echo.tool.ts +10 -0
  77. package/dist/logs/combined.log +0 -4
  78. package/dist/logs/error.log +0 -2
  79. package/dist/logs/interactions.log +0 -0
@@ -43,7 +43,7 @@ security: false
43
43
  name the symbol, state what changed, stop. Use a second sentence only when
44
44
  it carries weight. If a bullet feels long, it is.
45
45
 
46
- Cut: mechanism walkthroughs (those belong in JSDoc, AGENTS.md, or the
46
+ Cut: mechanism walkthroughs (those belong in JSDoc, CLAUDE.md/AGENTS.md, or the
47
47
  relevant skill), ceremonial framings ("This release introduces…",
48
48
  backwards-compat paragraphs), file-by-file test enumerations, internal
49
49
  implementation notes. Prefer code/symbol names over English re-explanations.
@@ -26,7 +26,8 @@
26
26
  "audit:refresh": "rm -f bun.lock && bun install && bun audit",
27
27
  "tree": "tsx scripts/tree.ts",
28
28
  "list-skills": "tsx scripts/list-skills.ts",
29
- "format": "biome check --write --unsafe .",
29
+ "format": "biome check --write .",
30
+ "format:unsafe": "biome check --write --unsafe .",
30
31
  "lint:mcp": "tsx scripts/lint-mcp.ts",
31
32
  "lint:packaging": "tsx scripts/lint-packaging.ts",
32
33
  "bundle": "npm run build && npx -y @anthropic-ai/mcpb pack . dist/{{PACKAGE_NAME}}.mcpb",
@@ -18,6 +18,14 @@ export const echoTool = tool('template_echo_message', {
18
18
  message: z.string().describe('The echoed message.'),
19
19
  }),
20
20
 
21
+ // Agent-facing context on the success path — the counterpart to errors[]. Merged
22
+ // into structuredContent AND mirrored into content[] automatically (no format()
23
+ // entry needed). Declare the fields here; populate via ctx.enrich(...) in the
24
+ // handler or service layer. Delete this block if your tool has no such context.
25
+ enrichment: {
26
+ characterCount: z.number().describe('Length of the echoed message.'),
27
+ },
28
+
21
29
  // Declare each domain failure mode the agent should plan around. The framework
22
30
  // types `ctx.fail(reason, …)` against the declared union. Baseline codes
23
31
  // (InternalError, ServiceUnavailable, Timeout, ValidationError,
@@ -36,6 +44,8 @@ export const echoTool = tool('template_echo_message', {
36
44
  if (input.message.trim().length === 0) {
37
45
  throw ctx.fail('empty_message', 'Message must contain at least one non-whitespace character.');
38
46
  }
47
+ // Reaches both client surfaces with no format() plumbing.
48
+ ctx.enrich({ characterCount: input.message.length });
39
49
  return { message: input.message };
40
50
  },
41
51
 
@@ -1,4 +0,0 @@
1
- {"level":40,"time":1780019885373,"env":"testing","version":"0.9.13","pid":31054,"transport":"http","requestId":"PVJSQ-5BH6C","timestamp":"2026-05-29T01:58:05.372Z","operation":"TransportManager.start","component":"HttpTransportSetup","msg":"MCP_ALLOWED_ORIGINS is not set — CORS is wildcard for CLI clients; browser Origin headers are restricted to loopback. Set MCP_ALLOWED_ORIGINS for production deployments accepting remote browser origins."}
2
- {"level":40,"time":1780019887093,"env":"testing","version":"0.9.13","pid":31054,"transport":"http","requestId":"PVJSQ-5BH6C","timestamp":"2026-05-29T01:58:05.372Z","operation":"TransportManager.start","component":"HttpTransportSetup","sessionId":"not-a-real-session-1780019887092","msg":"Session validation failed - invalid or hijacked session"}
3
- {"level":50,"time":1780019890914,"env":"testing","version":"0.0.0-test","pid":31166,"requestId":"S2J27-VH41Q","timestamp":"2026-05-29T01:58:10.913Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"f059ed3a8dbb01fdae5ea9bea50187159ee975051d6e7ee1123e600e46f8a6e8","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"f059ed3a8dbb01fdae5ea9bea50187159ee975051d6e7ee1123e600e46f8a6e8","toolName":"scoped_echo","requestId":"S2J27-VH41Q","timestamp":"2026-05-29T01:58:10.913Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
4
- {"level":50,"time":1780019890921,"env":"testing","version":"0.0.0-test","pid":31166,"requestId":"16IJL-17Q6J","timestamp":"2026-05-29T01:58:10.921Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"3dc142c962ec9c4cab103e2e6bd4d09c0909beeb0773d00bb86da745a4d2a20e","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"3dc142c962ec9c4cab103e2e6bd4d09c0909beeb0773d00bb86da745a4d2a20e","toolName":"scoped_echo","requestId":"16IJL-17Q6J","timestamp":"2026-05-29T01:58:10.921Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
@@ -1,2 +0,0 @@
1
- {"level":50,"time":1780019890914,"env":"testing","version":"0.0.0-test","pid":31166,"requestId":"S2J27-VH41Q","timestamp":"2026-05-29T01:58:10.913Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"f059ed3a8dbb01fdae5ea9bea50187159ee975051d6e7ee1123e600e46f8a6e8","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"f059ed3a8dbb01fdae5ea9bea50187159ee975051d6e7ee1123e600e46f8a6e8","toolName":"scoped_echo","requestId":"S2J27-VH41Q","timestamp":"2026-05-29T01:58:10.913Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
2
- {"level":50,"time":1780019890921,"env":"testing","version":"0.0.0-test","pid":31166,"requestId":"16IJL-17Q6J","timestamp":"2026-05-29T01:58:10.921Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"3dc142c962ec9c4cab103e2e6bd4d09c0909beeb0773d00bb86da745a4d2a20e","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"3dc142c962ec9c4cab103e2e6bd4d09c0909beeb0773d00bb86da745a4d2a20e","toolName":"scoped_echo","requestId":"16IJL-17Q6J","timestamp":"2026-05-29T01:58:10.921Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
File without changes