@jaypie/mcp 0.7.9 → 0.7.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/suites/llm/index.ts"],"sourcesContent":["/**\n * LLM Suite - Unified LLM debugging and inspection\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { debugLlmCall, type LlmProvider } from \"./llm.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Silent logger for direct execution\nconst log = {\n error: () => {},\n info: () => {},\n};\n\nasync function getHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"help.md\"), \"utf-8\");\n}\n\n// Input type for the unified LLM service\ninterface LlmInput {\n message?: string;\n model?: string;\n provider?: LlmProvider;\n}\n\nexport const llmService = fabricService({\n alias: \"llm\",\n description:\n \"Debug LLM provider responses. Commands: debug_call. 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?: LlmInput;\n }) => {\n if (!command || command === \"help\") {\n return getHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"debug_call\": {\n if (!p.provider) throw new Error(\"provider is required\");\n if (!p.message) throw new Error(\"message is required\");\n const result = await debugLlmCall(\n {\n message: p.message,\n model: p.model,\n provider: p.provider,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n default:\n throw new Error(`Unknown command: ${command}. Use llm() for help.`);\n }\n },\n});\n\n// Re-export types and functions for testing\nexport * from \"./llm.js\";\n"],"names":["__dirname"],"mappings":";;;;;;AAAA;;AAEG;AAQH,MAAMA,WAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9D;AACA,MAAM,GAAG,GAAG;AACV,IAAA,KAAK,EAAE,MAAK,EAAE,CAAC;AACf,IAAA,IAAI,EAAE,MAAK,EAAE,CAAC;CACf;AAED,eAAe,OAAO,GAAA;AACpB,IAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAACA,WAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC;AAC9D;AASO,MAAM,UAAU,GAAG,aAAa,CAAC;AACtC,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,WAAW,EACT,iFAAiF;AACnF,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,WAAW,EAAE,oCAAoC;AACjD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,WAAW,EAAE,oBAAoB;AACjC,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACF,KAAA;IACD,OAAO,EAAE,OAAO,EACd,OAAO,EACP,KAAK,EAAE,MAAM,GAId,KAAI;AACH,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE;YAClC,OAAO,OAAO,EAAE;QAClB;AAEA,QAAA,MAAM,CAAC,GAAG,MAAM,IAAI,EAAE;QAEtB,QAAQ,OAAO;YACb,KAAK,YAAY,EAAE;gBACjB,IAAI,CAAC,CAAC,CAAC,QAAQ;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;gBACxD,IAAI,CAAC,CAAC,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACtD,gBAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B;oBACE,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,EACD,GAAG,CACJ;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AAClD,gBAAA,OAAO,MAAM;YACf;AAEA,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAA,qBAAA,CAAuB,CAAC;;IAEzE,CAAC;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/suites/llm/index.ts"],"sourcesContent":["/**\n * LLM Suite - Unified LLM debugging and inspection\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { debugLlmCall, validateLlmSetup, type LlmProvider } from \"./llm.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Silent logger for direct execution\nconst log = {\n error: () => {},\n info: () => {},\n};\n\nasync function getHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"help.md\"), \"utf-8\");\n}\n\n// Flattened input type for the unified LLM service\ninterface LlmInput {\n command?: string;\n message?: string;\n model?: string;\n provider?: string;\n}\n\nexport const llmService = fabricService({\n alias: \"llm\",\n description:\n \"Debug LLM provider responses. Commands: debug_call. 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 message: {\n description: \"Message to send to the LLM provider\",\n required: false,\n type: String,\n },\n model: {\n description:\n \"Model to use (provider-specific, e.g., gpt-4, claude-3-sonnet)\",\n required: false,\n type: String,\n },\n provider: {\n description: \"LLM provider: anthropic, openai, google, openrouter\",\n required: false,\n type: String,\n },\n },\n service: async (params: LlmInput) => {\n const { command } = params;\n\n if (!command || command === \"help\") {\n return getHelp();\n }\n\n const p = params;\n\n switch (command) {\n case \"validate\": {\n return validateLlmSetup();\n }\n\n case \"debug_call\": {\n if (!p.provider) throw new Error(\"provider is required\");\n if (!p.message) throw new Error(\"message is required\");\n const result = await debugLlmCall(\n {\n message: p.message,\n model: p.model,\n provider: p.provider as LlmProvider,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n default:\n throw new Error(`Unknown command: ${command}. Use llm() for help.`);\n }\n },\n});\n\n// Re-export types and functions for testing\nexport * from \"./llm.js\";\n"],"names":["__dirname"],"mappings":";;;;;;AAAA;;AAEG;AAQH,MAAMA,WAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9D;AACA,MAAM,GAAG,GAAG;AACV,IAAA,KAAK,EAAE,MAAK,EAAE,CAAC;AACf,IAAA,IAAI,EAAE,MAAK,EAAE,CAAC;CACf;AAED,eAAe,OAAO,GAAA;AACpB,IAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAACA,WAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC;AAC9D;AAUO,MAAM,UAAU,GAAG,aAAa,CAAC;AACtC,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,WAAW,EACT,iFAAiF;AACnF,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,WAAW,EAAE,oCAAoC;AACjD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,WAAW,EAAE,qCAAqC;AAClD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,WAAW,EACT,gEAAgE;AAClE,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,WAAW,EAAE,qDAAqD;AAClE,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACF,KAAA;AACD,IAAA,OAAO,EAAE,OAAO,MAAgB,KAAI;AAClC,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM;AAE1B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE;YAClC,OAAO,OAAO,EAAE;QAClB;QAEA,MAAM,CAAC,GAAG,MAAM;QAEhB,QAAQ,OAAO;YACb,KAAK,UAAU,EAAE;gBACf,OAAO,gBAAgB,EAAE;YAC3B;YAEA,KAAK,YAAY,EAAE;gBACjB,IAAI,CAAC,CAAC,CAAC,QAAQ;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;gBACxD,IAAI,CAAC,CAAC,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACtD,gBAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B;oBACE,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAuB;iBACpC,EACD,GAAG,CACJ;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AAClD,gBAAA,OAAO,MAAM;YACf;AAEA,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAA,qBAAA,CAAuB,CAAC;;IAEzE,CAAC;AACF,CAAA;;;;"}
@@ -19,10 +19,28 @@ export interface LlmDebugCallResult {
19
19
  usage?: unknown[];
20
20
  error?: string;
21
21
  }
22
+ export interface LlmProviderStatus {
23
+ available: boolean;
24
+ }
25
+ export interface LlmValidationResult {
26
+ success: boolean;
27
+ providers: {
28
+ anthropic: LlmProviderStatus;
29
+ google: LlmProviderStatus;
30
+ openai: LlmProviderStatus;
31
+ openrouter: LlmProviderStatus;
32
+ };
33
+ availableCount: number;
34
+ totalProviders: number;
35
+ }
22
36
  interface Logger {
23
37
  info: (message: string, ...args: unknown[]) => void;
24
38
  error: (message: string, ...args: unknown[]) => void;
25
39
  }
40
+ /**
41
+ * Validate LLM setup without making API calls
42
+ */
43
+ export declare function validateLlmSetup(): LlmValidationResult;
26
44
  /**
27
45
  * Make a debug LLM call and return the raw response data for inspection
28
46
  */
@@ -10,6 +10,33 @@ const DEFAULT_MODELS = {
10
10
  openai: LLM.PROVIDER.OPENAI.MODEL.SMALL,
11
11
  openrouter: LLM.PROVIDER.OPENROUTER.MODEL.SMALL,
12
12
  };
13
+ const TOTAL_PROVIDERS = 4;
14
+ /**
15
+ * Validate LLM setup without making API calls
16
+ */
17
+ function validateLlmSetup() {
18
+ const anthropicAvailable = Boolean(process.env.ANTHROPIC_API_KEY);
19
+ const googleAvailable = Boolean(process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY);
20
+ const openaiAvailable = Boolean(process.env.OPENAI_API_KEY);
21
+ const openrouterAvailable = Boolean(process.env.OPENROUTER_API_KEY);
22
+ const availableCount = [
23
+ anthropicAvailable,
24
+ googleAvailable,
25
+ openaiAvailable,
26
+ openrouterAvailable,
27
+ ].filter(Boolean).length;
28
+ return {
29
+ availableCount,
30
+ providers: {
31
+ anthropic: { available: anthropicAvailable },
32
+ google: { available: googleAvailable },
33
+ openai: { available: openaiAvailable },
34
+ openrouter: { available: openrouterAvailable },
35
+ },
36
+ success: availableCount > 0,
37
+ totalProviders: TOTAL_PROVIDERS,
38
+ };
39
+ }
13
40
  /**
14
41
  * Make a debug LLM call and return the raw response data for inspection
15
42
  */
@@ -57,5 +84,5 @@ async function debugLlmCall(params, log) {
57
84
  }
58
85
  }
59
86
 
60
- export { debugLlmCall };
87
+ export { debugLlmCall, validateLlmSetup };
61
88
  //# sourceMappingURL=llm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sources":["../../../src/suites/llm/llm.ts"],"sourcesContent":["/**\n * LLM debugging utilities for inspecting raw provider responses\n */\n\nimport { LLM, Llm } from \"@jaypie/llm\";\n\nexport type LlmProvider = \"anthropic\" | \"gemini\" | \"openai\" | \"openrouter\";\n\nexport interface LlmDebugCallParams {\n provider: LlmProvider;\n model?: string;\n message: string;\n}\n\nexport interface LlmDebugCallResult {\n success: boolean;\n provider: string;\n model: string;\n content?: string;\n reasoning?: string[];\n reasoningTokens?: number;\n history?: unknown[];\n rawResponses?: unknown[];\n usage?: unknown[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n// Default models for each provider\nconst DEFAULT_MODELS: Record<LlmProvider, string> = {\n anthropic: LLM.PROVIDER.ANTHROPIC.MODEL.SMALL,\n gemini: LLM.PROVIDER.GEMINI.MODEL.SMALL,\n openai: LLM.PROVIDER.OPENAI.MODEL.SMALL,\n openrouter: LLM.PROVIDER.OPENROUTER.MODEL.SMALL,\n};\n\n/**\n * Make a debug LLM call and return the raw response data for inspection\n */\nexport async function debugLlmCall(\n params: LlmDebugCallParams,\n log: Logger,\n): Promise<LlmDebugCallResult> {\n const { provider, message } = params;\n const model = params.model || DEFAULT_MODELS[provider];\n\n log.info(`Making debug LLM call to ${provider} with model ${model}`);\n\n try {\n const llm = new Llm(provider, { model });\n\n const result = await llm.operate(message, {\n user: \"[jaypie-mcp] Debug LLM Call\",\n });\n\n if (result.error) {\n return {\n success: false,\n provider,\n model,\n error: `${result.error.title}: ${result.error.detail || \"Unknown error\"}`,\n };\n }\n\n // Calculate total reasoning tokens\n const reasoningTokens = result.usage.reduce(\n (sum, u) => sum + (u.reasoning || 0),\n 0,\n );\n\n return {\n success: true,\n provider,\n model,\n content:\n typeof result.content === \"string\"\n ? result.content\n : JSON.stringify(result.content),\n reasoning: result.reasoning,\n reasoningTokens,\n history: result.history,\n rawResponses: result.responses,\n usage: result.usage,\n };\n } catch (error) {\n log.error(`Error calling ${provider}:`, error);\n return {\n success: false,\n provider,\n model,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"names":[],"mappings":";;AAAA;;AAEG;AA8BH;AACA,MAAM,cAAc,GAAgC;IAClD,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK;IAC7C,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IACvC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IACvC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK;CAChD;AAED;;AAEG;AACI,eAAe,YAAY,CAChC,MAA0B,EAC1B,GAAW,EAAA;AAEX,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC;IAEtD,GAAG,CAAC,IAAI,CAAC,CAAA,yBAAA,EAA4B,QAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,CAAE,CAAC;AAEpE,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;AACxC,YAAA,IAAI,EAAE,6BAA6B;AACpC,SAAA,CAAC;AAEF,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;gBACd,QAAQ;gBACR,KAAK;AACL,gBAAA,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,EAAA,EAAK,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,eAAe,CAAA,CAAE;aAC1E;QACH;;QAGA,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EACpC,CAAC,CACF;QAED,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,KAAK;AACL,YAAA,OAAO,EACL,OAAO,MAAM,CAAC,OAAO,KAAK;kBACtB,MAAM,CAAC;kBACP,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe;YACf,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,SAAS;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;IACH;IAAE,OAAO,KAAK,EAAE;QACd,GAAG,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;QAC9C,OAAO;AACL,YAAA,OAAO,EAAE,KAAK;YACd,QAAQ;YACR,KAAK;AACL,YAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;SAC9D;IACH;AACF;;;;"}
1
+ {"version":3,"file":"llm.js","sources":["../../../src/suites/llm/llm.ts"],"sourcesContent":["/**\n * LLM debugging utilities for inspecting raw provider responses\n */\n\nimport { LLM, Llm } from \"@jaypie/llm\";\n\nexport type LlmProvider = \"anthropic\" | \"gemini\" | \"openai\" | \"openrouter\";\n\nexport interface LlmDebugCallParams {\n provider: LlmProvider;\n model?: string;\n message: string;\n}\n\nexport interface LlmDebugCallResult {\n success: boolean;\n provider: string;\n model: string;\n content?: string;\n reasoning?: string[];\n reasoningTokens?: number;\n history?: unknown[];\n rawResponses?: unknown[];\n usage?: unknown[];\n error?: string;\n}\n\n// Validation types\nexport interface LlmProviderStatus {\n available: boolean;\n}\n\nexport interface LlmValidationResult {\n success: boolean;\n providers: {\n anthropic: LlmProviderStatus;\n google: LlmProviderStatus;\n openai: LlmProviderStatus;\n openrouter: LlmProviderStatus;\n };\n availableCount: number;\n totalProviders: number;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n// Default models for each provider\nconst DEFAULT_MODELS: Record<LlmProvider, string> = {\n anthropic: LLM.PROVIDER.ANTHROPIC.MODEL.SMALL,\n gemini: LLM.PROVIDER.GEMINI.MODEL.SMALL,\n openai: LLM.PROVIDER.OPENAI.MODEL.SMALL,\n openrouter: LLM.PROVIDER.OPENROUTER.MODEL.SMALL,\n};\n\nconst TOTAL_PROVIDERS = 4;\n\n/**\n * Validate LLM setup without making API calls\n */\nexport function validateLlmSetup(): LlmValidationResult {\n const anthropicAvailable = Boolean(process.env.ANTHROPIC_API_KEY);\n const googleAvailable = Boolean(\n process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY,\n );\n const openaiAvailable = Boolean(process.env.OPENAI_API_KEY);\n const openrouterAvailable = Boolean(process.env.OPENROUTER_API_KEY);\n\n const availableCount = [\n anthropicAvailable,\n googleAvailable,\n openaiAvailable,\n openrouterAvailable,\n ].filter(Boolean).length;\n\n return {\n availableCount,\n providers: {\n anthropic: { available: anthropicAvailable },\n google: { available: googleAvailable },\n openai: { available: openaiAvailable },\n openrouter: { available: openrouterAvailable },\n },\n success: availableCount > 0,\n totalProviders: TOTAL_PROVIDERS,\n };\n}\n\n/**\n * Make a debug LLM call and return the raw response data for inspection\n */\nexport async function debugLlmCall(\n params: LlmDebugCallParams,\n log: Logger,\n): Promise<LlmDebugCallResult> {\n const { provider, message } = params;\n const model = params.model || DEFAULT_MODELS[provider];\n\n log.info(`Making debug LLM call to ${provider} with model ${model}`);\n\n try {\n const llm = new Llm(provider, { model });\n\n const result = await llm.operate(message, {\n user: \"[jaypie-mcp] Debug LLM Call\",\n });\n\n if (result.error) {\n return {\n success: false,\n provider,\n model,\n error: `${result.error.title}: ${result.error.detail || \"Unknown error\"}`,\n };\n }\n\n // Calculate total reasoning tokens\n const reasoningTokens = result.usage.reduce(\n (sum, u) => sum + (u.reasoning || 0),\n 0,\n );\n\n return {\n success: true,\n provider,\n model,\n content:\n typeof result.content === \"string\"\n ? result.content\n : JSON.stringify(result.content),\n reasoning: result.reasoning,\n reasoningTokens,\n history: result.history,\n rawResponses: result.responses,\n usage: result.usage,\n };\n } catch (error) {\n log.error(`Error calling ${provider}:`, error);\n return {\n success: false,\n provider,\n model,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/mcp",
3
- "version": "0.7.9",
3
+ "version": "0.7.11",
4
4
  "description": "Jaypie MCP",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,45 @@
1
+ ---
2
+ version: 0.7.10
3
+ date: 2025-02-02
4
+ summary: Flatten all MCP tool parameters to work around Claude Code MCP client nested object serialization
5
+ ---
6
+
7
+ ## Breaking Changes
8
+
9
+ All MCP tool parameters are now flat (top-level) instead of nested. This change affects all three suites (AWS, Datadog, LLM) and works around a Claude Code MCP client issue where nested objects were being serialized as JSON strings.
10
+
11
+ ### New Calling Convention
12
+
13
+ Before:
14
+ ```
15
+ aws("logs_filter_log_events", { logGroupName: "...", filterPattern: "..." })
16
+ datadog("logs", { query: "...", from: "now-1h" })
17
+ llm("debug_call", { provider: "openai", message: "..." })
18
+ ```
19
+
20
+ After:
21
+ ```
22
+ aws({ command: "logs_filter_log_events", logGroupName: "...", filterPattern: "..." })
23
+ datadog({ command: "logs", query: "...", from: "now-1h" })
24
+ llm({ command: "debug_call", provider: "openai", message: "..." })
25
+ ```
26
+
27
+ ### Array Parameters
28
+
29
+ Array parameters are now specified as comma-separated strings:
30
+
31
+ ```
32
+ # Before
33
+ datadog("monitors", { status: ["Alert", "Warn"] })
34
+
35
+ # After
36
+ datadog({ command: "monitors", status: "Alert,Warn" })
37
+ ```
38
+
39
+ ## Changes
40
+
41
+ - Flattened AWS suite parameters (all 16 commands)
42
+ - Flattened Datadog suite parameters (all 6 commands)
43
+ - Flattened LLM suite parameters
44
+ - Updated help.md documentation for all suites
45
+ - Updated skills documentation (tools-aws.md, tools-datadog.md, tools-dynamodb.md, tools-llm.md)
@@ -0,0 +1,12 @@
1
+ ---
2
+ version: 0.7.11
3
+ date: 2025-02-02
4
+ summary: Add validate command to aws, datadog, and llm tools
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Add `validate` command to `aws` tool - checks CLI availability, version, and profiles
10
+ - Add `validate` command to `datadog` tool - checks API/App key configuration
11
+ - Add `validate` command to `llm` tool - checks which provider API keys are configured
12
+ - Add `GEMINI_API_KEY` as alternative to `GOOGLE_API_KEY` for Google/Gemini provider
@@ -9,9 +9,11 @@ Unified tool for interacting with AWS services via the Jaypie MCP. Uses your loc
9
9
 
10
10
  ## Usage
11
11
 
12
+ All parameters are passed at the top level (flat structure):
13
+
12
14
  ```
13
- aws() # Show help with all commands
14
- aws("command", { ...params }) # Execute a command
15
+ aws() # Show help with all commands
16
+ aws({ command: "...", ...params }) # Execute a command
15
17
  ```
16
18
 
17
19
  ## Lambda Functions
@@ -23,13 +25,13 @@ aws("command", { ...params }) # Execute a command
23
25
 
24
26
  ```
25
27
  # List all functions
26
- aws("lambda_list_functions")
28
+ aws({ command: "lambda_list_functions" })
27
29
 
28
30
  # Filter by prefix
29
- aws("lambda_list_functions", { functionNamePrefix: "my-api" })
31
+ aws({ command: "lambda_list_functions", functionNamePrefix: "my-api" })
30
32
 
31
33
  # Get function details
32
- aws("lambda_get_function", { functionName: "my-api-handler" })
34
+ aws({ command: "lambda_get_function", functionName: "my-api-handler" })
33
35
  ```
34
36
 
35
37
  ## Step Functions
@@ -41,10 +43,10 @@ aws("lambda_get_function", { functionName: "my-api-handler" })
41
43
 
42
44
  ```
43
45
  # List recent executions
44
- aws("stepfunctions_list_executions", { stateMachineArn: "arn:aws:states:..." })
46
+ aws({ command: "stepfunctions_list_executions", stateMachineArn: "arn:aws:states:..." })
45
47
 
46
48
  # Stop a running execution
47
- aws("stepfunctions_stop_execution", { executionArn: "arn:aws:states:..." })
49
+ aws({ command: "stepfunctions_stop_execution", executionArn: "arn:aws:states:..." })
48
50
  ```
49
51
 
50
52
  ## CloudWatch Logs
@@ -55,10 +57,10 @@ aws("stepfunctions_stop_execution", { executionArn: "arn:aws:states:..." })
55
57
 
56
58
  ```
57
59
  # Search for errors in Lambda logs
58
- aws("logs_filter_log_events", { logGroupName: "/aws/lambda/my-function", filterPattern: "ERROR" })
60
+ aws({ command: "logs_filter_log_events", logGroupName: "/aws/lambda/my-function", filterPattern: "ERROR" })
59
61
 
60
62
  # Search with time range
61
- aws("logs_filter_log_events", { logGroupName: "/aws/lambda/my-function", startTime: "now-1h" })
63
+ aws({ command: "logs_filter_log_events", logGroupName: "/aws/lambda/my-function", startTime: "now-1h" })
62
64
  ```
63
65
 
64
66
  ## S3
@@ -69,10 +71,10 @@ aws("logs_filter_log_events", { logGroupName: "/aws/lambda/my-function", startTi
69
71
 
70
72
  ```
71
73
  # List all objects
72
- aws("s3_list_objects", { bucket: "my-bucket" })
74
+ aws({ command: "s3_list_objects", bucket: "my-bucket" })
73
75
 
74
76
  # Filter by prefix
75
- aws("s3_list_objects", { bucket: "my-bucket", prefix: "uploads/" })
77
+ aws({ command: "s3_list_objects", bucket: "my-bucket", prefix: "uploads/" })
76
78
  ```
77
79
 
78
80
  ## SQS
@@ -86,16 +88,16 @@ aws("s3_list_objects", { bucket: "my-bucket", prefix: "uploads/" })
86
88
 
87
89
  ```
88
90
  # List queues
89
- aws("sqs_list_queues", { queueNamePrefix: "my-app" })
91
+ aws({ command: "sqs_list_queues", queueNamePrefix: "my-app" })
90
92
 
91
93
  # Check queue depth
92
- aws("sqs_get_queue_attributes", { queueUrl: "https://sqs..." })
94
+ aws({ command: "sqs_get_queue_attributes", queueUrl: "https://sqs..." })
93
95
 
94
96
  # Peek at messages
95
- aws("sqs_receive_message", { queueUrl: "https://sqs...", maxNumberOfMessages: 5 })
97
+ aws({ command: "sqs_receive_message", queueUrl: "https://sqs...", maxNumberOfMessages: 5 })
96
98
 
97
99
  # Purge queue (careful!)
98
- aws("sqs_purge_queue", { queueUrl: "https://sqs..." })
100
+ aws({ command: "sqs_purge_queue", queueUrl: "https://sqs..." })
99
101
  ```
100
102
 
101
103
  ## CloudFormation
@@ -106,7 +108,7 @@ aws("sqs_purge_queue", { queueUrl: "https://sqs..." })
106
108
 
107
109
  ```
108
110
  # Get stack details
109
- aws("cloudformation_describe_stack", { stackName: "MyStack" })
111
+ aws({ command: "cloudformation_describe_stack", stackName: "MyStack" })
110
112
  ```
111
113
 
112
114
  ## DynamoDB
@@ -120,6 +122,47 @@ See **tools-dynamodb** for DynamoDB-specific documentation.
120
122
  | `dynamodb_scan` | Full table scan |
121
123
  | `dynamodb_get_item` | Get single item |
122
124
 
125
+ ## Parameters
126
+
127
+ | Parameter | Type | Description |
128
+ |-----------|------|-------------|
129
+ | `command` | string | Command to execute (omit for help) |
130
+ | `profile` | string | AWS profile name |
131
+ | `region` | string | AWS region (e.g., us-east-1) |
132
+ | `functionName` | string | Lambda function name |
133
+ | `functionNamePrefix` | string | Lambda function name prefix filter |
134
+ | `stateMachineArn` | string | Step Functions state machine ARN |
135
+ | `executionArn` | string | Step Functions execution ARN |
136
+ | `statusFilter` | string | Step Functions status: RUNNING, SUCCEEDED, FAILED, TIMED_OUT, ABORTED, PENDING_REDRIVE |
137
+ | `logGroupName` | string | CloudWatch Logs group name |
138
+ | `filterPattern` | string | CloudWatch Logs filter pattern |
139
+ | `startTime` | string | Start time (e.g., now-15m) |
140
+ | `endTime` | string | End time (e.g., now) |
141
+ | `bucket` | string | S3 bucket name |
142
+ | `prefix` | string | S3 object prefix filter |
143
+ | `stackName` | string | CloudFormation stack name |
144
+ | `tableName` | string | DynamoDB table name |
145
+ | `keyConditionExpression` | string | DynamoDB key condition expression |
146
+ | `expressionAttributeValues` | string | DynamoDB expression attribute values (JSON string) |
147
+ | `queueUrl` | string | SQS queue URL |
148
+ | `queueNamePrefix` | string | SQS queue name prefix filter |
149
+ | `maxNumberOfMessages` | number | SQS max messages to receive |
150
+ | `limit` | number | Maximum number of results |
151
+ | `maxResults` | number | Maximum number of results |
152
+
153
+ ## Validation
154
+
155
+ Check AWS CLI availability and list profiles without making API calls:
156
+
157
+ ```
158
+ aws({ command: "validate" })
159
+ ```
160
+
161
+ Returns:
162
+ - `cliAvailable` - Whether AWS CLI is installed
163
+ - `cliVersion` - AWS CLI version string
164
+ - `profiles` - List of configured profiles from ~/.aws/config and ~/.aws/credentials
165
+
123
166
  ## Credential Management
124
167
 
125
168
  Tools use the host's AWS credential chain:
@@ -129,10 +172,10 @@ Tools use the host's AWS credential chain:
129
172
 
130
173
  ```
131
174
  # List available profiles
132
- aws("list_profiles")
175
+ aws({ command: "list_profiles" })
133
176
 
134
177
  # Use a specific profile (supported on all commands)
135
- aws("lambda_list_functions", { profile: "production", region: "us-west-2" })
178
+ aws({ command: "lambda_list_functions", profile: "production", region: "us-west-2" })
136
179
  ```
137
180
 
138
181
  ## Environment Variables
@@ -148,19 +191,18 @@ aws("lambda_list_functions", { profile: "production", region: "us-west-2" })
148
191
 
149
192
  ```
150
193
  # Check function config
151
- aws("lambda_get_function", { functionName: "my-function" })
194
+ aws({ command: "lambda_get_function", functionName: "my-function" })
152
195
 
153
196
  # Search recent logs
154
- aws("logs_filter_log_events", { logGroupName: "/aws/lambda/my-function", filterPattern: "ERROR" })
197
+ aws({ command: "logs_filter_log_events", logGroupName: "/aws/lambda/my-function", filterPattern: "ERROR" })
155
198
  ```
156
199
 
157
200
  ### Check Queue Health
158
201
 
159
202
  ```
160
203
  # Get queue depth
161
- aws("sqs_get_queue_attributes", { queueUrl: "https://..." })
204
+ aws({ command: "sqs_get_queue_attributes", queueUrl: "https://..." })
162
205
 
163
206
  # Peek at messages
164
- aws("sqs_receive_message", { queueUrl: "https://...", maxNumberOfMessages: 5 })
207
+ aws({ command: "sqs_receive_message", queueUrl: "https://...", maxNumberOfMessages: 5 })
165
208
  ```
166
-
@@ -9,9 +9,11 @@ Unified tool for querying Datadog observability data via the Jaypie MCP.
9
9
 
10
10
  ## Usage
11
11
 
12
+ All parameters are passed at the top level (flat structure):
13
+
12
14
  ```
13
- datadog() # Show help with all commands
14
- datadog("command", { ...params }) # Execute a command
15
+ datadog() # Show help
16
+ datadog({ command: "logs", query: "...", ... }) # Execute a command
15
17
  ```
16
18
 
17
19
  ## Available Commands
@@ -25,6 +27,38 @@ datadog("command", { ...params }) # Execute a command
25
27
  | `metrics` | Query timeseries metrics |
26
28
  | `rum` | Search Real User Monitoring events |
27
29
 
30
+ ## Parameters
31
+
32
+ | Parameter | Type | Description |
33
+ |-----------|------|-------------|
34
+ | `command` | string | Command to execute (logs, log_analytics, monitors, synthetics, metrics, rum) |
35
+ | `query` | string | Datadog query string (e.g., `status:error`, `@lambda.arn:"arn:..."`) |
36
+ | `from` | string | Start time (e.g., now-1h, now-15m, now-1d) |
37
+ | `to` | string | End time (e.g., now) |
38
+ | `limit` | number | Maximum results to return |
39
+ | `env` | string | Environment filter |
40
+ | `service` | string | Service name filter |
41
+ | `source` | string | Log source filter (default: lambda) |
42
+ | `groupBy` | string | Fields to group by, comma-separated (for log_analytics) |
43
+ | `aggregation` | string | Aggregation type: count, avg, sum, min, max, cardinality |
44
+ | `status` | string | Monitor status filter, comma-separated: Alert, Warn, No Data, OK |
45
+ | `tags` | string | Tags filter, comma-separated |
46
+ | `testId` | string | Synthetic test ID for getting results |
47
+ | `type` | string | Synthetic test type: api or browser |
48
+
49
+ ## Validation
50
+
51
+ Check Datadog API key configuration without making API calls:
52
+
53
+ ```
54
+ datadog({ command: "validate" })
55
+ ```
56
+
57
+ Returns:
58
+ - `apiKey` - { present: boolean, source: "DATADOG_API_KEY" | "DD_API_KEY" | null }
59
+ - `appKey` - { present: boolean, source: "DATADOG_APP_KEY" | "DATADOG_APPLICATION_KEY" | "DD_APP_KEY" | "DD_APPLICATION_KEY" | null }
60
+ - `success` - true if both keys are present
61
+
28
62
  ## Environment Variables
29
63
 
30
64
  Configure defaults via environment:
@@ -43,60 +77,58 @@ Search individual log entries:
43
77
 
44
78
  ```
45
79
  # Search error logs
46
- datadog("logs", { query: "status:error", from: "now-1h" })
80
+ datadog({ command: "logs", query: "status:error", from: "now-1h" })
47
81
 
48
82
  # Search by service
49
- datadog("logs", { query: "service:my-api status:error", from: "now-15m" })
83
+ datadog({ command: "logs", query: "service:my-api status:error", from: "now-15m" })
84
+
85
+ # Search by Lambda ARN
86
+ datadog({ command: "logs", query: "@lambda.arn:\"arn:aws:lambda:us-east-1:...\"", from: "now-1h" })
50
87
 
51
88
  # Search by attribute
52
- datadog("logs", { query: "@http.status_code:500", from: "now-1h" })
89
+ datadog({ command: "logs", query: "@http.status_code:500", from: "now-1h" })
53
90
 
54
91
  # Wildcard search
55
- datadog("logs", { query: "*timeout*", from: "now-30m" })
92
+ datadog({ command: "logs", query: "*timeout*", from: "now-30m" })
56
93
 
57
94
  # Limit results
58
- datadog("logs", { query: "status:error", from: "now-1h", limit: 100 })
95
+ datadog({ command: "logs", query: "status:error", from: "now-1h", limit: 100 })
59
96
  ```
60
97
 
61
98
  ## Log Analytics
62
99
 
63
- Aggregate logs for statistics:
100
+ Aggregate logs for statistics (use comma-separated groupBy):
64
101
 
65
102
  ```
66
103
  # Count errors by service
67
- datadog("log_analytics", { groupBy: ["service"], query: "status:error" })
104
+ datadog({ command: "log_analytics", groupBy: "service", query: "status:error" })
68
105
 
69
106
  # Count by status code
70
- datadog("log_analytics", { groupBy: ["@http.status_code"], query: "*" })
107
+ datadog({ command: "log_analytics", groupBy: "@http.status_code", query: "*" })
71
108
 
72
109
  # Multiple groupings
73
- datadog("log_analytics", { groupBy: ["service", "status"], query: "*" })
110
+ datadog({ command: "log_analytics", groupBy: "service,status", query: "*" })
74
111
 
75
112
  # Average response time
76
- datadog("log_analytics", {
77
- groupBy: ["service"],
78
- aggregation: "avg",
79
- metric: "@duration",
80
- query: "*"
81
- })
113
+ datadog({ command: "log_analytics", groupBy: "service", aggregation: "avg", metric: "@duration", query: "*" })
82
114
  ```
83
115
 
84
116
  ## Monitors
85
117
 
86
- Check monitor status:
118
+ Check monitor status (use comma-separated status):
87
119
 
88
120
  ```
89
121
  # List all monitors
90
- datadog("monitors")
122
+ datadog({ command: "monitors" })
91
123
 
92
124
  # Filter alerting monitors
93
- datadog("monitors", { status: ["Alert", "Warn"] })
125
+ datadog({ command: "monitors", status: "Alert,Warn" })
94
126
 
95
127
  # Filter by name
96
- datadog("monitors", { name: "my-api" })
128
+ datadog({ command: "monitors", name: "my-api" })
97
129
 
98
130
  # Filter by tags
99
- datadog("monitors", { tags: ["env:production"] })
131
+ datadog({ command: "monitors", tags: "env:production" })
100
132
  ```
101
133
 
102
134
  ## Synthetics
@@ -105,14 +137,14 @@ List synthetic tests:
105
137
 
106
138
  ```
107
139
  # List all tests
108
- datadog("synthetics")
140
+ datadog({ command: "synthetics" })
109
141
 
110
142
  # Filter by type
111
- datadog("synthetics", { type: "api" })
112
- datadog("synthetics", { type: "browser" })
143
+ datadog({ command: "synthetics", type: "api" })
144
+ datadog({ command: "synthetics", type: "browser" })
113
145
 
114
146
  # Get results for specific test
115
- datadog("synthetics", { testId: "abc-123-def" })
147
+ datadog({ command: "synthetics", testId: "abc-123-def" })
116
148
  ```
117
149
 
118
150
  ## Metrics
@@ -121,13 +153,13 @@ Query timeseries metrics:
121
153
 
122
154
  ```
123
155
  # CPU usage
124
- datadog("metrics", { query: "avg:system.cpu.user{*}", from: "1h" })
156
+ datadog({ command: "metrics", query: "avg:system.cpu.user{*}", from: "1h" })
125
157
 
126
158
  # Lambda invocations
127
- datadog("metrics", { query: "sum:aws.lambda.invocations{function:my-func}.as_count()", from: "1h" })
159
+ datadog({ command: "metrics", query: "sum:aws.lambda.invocations{function:my-func}.as_count()", from: "1h" })
128
160
 
129
161
  # Lambda duration
130
- datadog("metrics", { query: "max:aws.lambda.duration{env:production}", from: "30m" })
162
+ datadog({ command: "metrics", query: "max:aws.lambda.duration{env:production}", from: "30m" })
131
163
  ```
132
164
 
133
165
  ## RUM Events
@@ -136,16 +168,16 @@ Search Real User Monitoring events:
136
168
 
137
169
  ```
138
170
  # Search all events
139
- datadog("rum", { from: "now-1h" })
171
+ datadog({ command: "rum", from: "now-1h" })
140
172
 
141
173
  # Filter by type
142
- datadog("rum", { query: "@type:error", from: "now-1h" })
174
+ datadog({ command: "rum", query: "@type:error", from: "now-1h" })
143
175
 
144
176
  # Filter by session
145
- datadog("rum", { query: "@session.id:abc123", from: "now-1h" })
177
+ datadog({ command: "rum", query: "@session.id:abc123", from: "now-1h" })
146
178
 
147
179
  # Filter by URL
148
- datadog("rum", { query: "@view.url:*checkout*", from: "now-1h" })
180
+ datadog({ command: "rum", query: "@view.url:*checkout*", from: "now-1h" })
149
181
  ```
150
182
 
151
183
  ## Query Syntax
@@ -157,6 +189,7 @@ status:error # By status
157
189
  @http.status_code:500 # By attribute
158
190
  service:my-api # By service
159
191
  *timeout* # Wildcard
192
+ @lambda.arn:"arn:aws:..." # Quoted values
160
193
  ```
161
194
 
162
195
  ### Time Ranges
@@ -174,26 +207,25 @@ now-1d # Last day
174
207
 
175
208
  ```
176
209
  # Search recent errors
177
- datadog("logs", { query: "service:my-function status:error", from: "now-1h" })
210
+ datadog({ command: "logs", query: "service:my-function status:error", from: "now-1h" })
178
211
 
179
212
  # Check error counts by service
180
- datadog("log_analytics", { groupBy: ["service"], query: "status:error", from: "now-1h" })
213
+ datadog({ command: "log_analytics", groupBy: "service", query: "status:error", from: "now-1h" })
181
214
  ```
182
215
 
183
216
  ### Monitor Status Check
184
217
 
185
218
  ```
186
219
  # Check alerting monitors
187
- datadog("monitors", { status: ["Alert", "Warn"] })
220
+ datadog({ command: "monitors", status: "Alert,Warn" })
188
221
  ```
189
222
 
190
223
  ### Frontend Issues
191
224
 
192
225
  ```
193
226
  # Search RUM errors
194
- datadog("rum", { query: "@type:error", from: "now-1h" })
227
+ datadog({ command: "rum", query: "@type:error", from: "now-1h" })
195
228
 
196
229
  # Check synthetic test results
197
- datadog("synthetics", { testId: "my-checkout-test" })
230
+ datadog({ command: "synthetics", testId: "my-checkout-test" })
198
231
  ```
199
-