legends-mcp 1.0.0

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 (102) hide show
  1. package/README.md +173 -0
  2. package/dist/agents/guardrails.d.ts +44 -0
  3. package/dist/agents/guardrails.d.ts.map +1 -0
  4. package/dist/agents/guardrails.js +144 -0
  5. package/dist/agents/guardrails.js.map +1 -0
  6. package/dist/agents/misbehavior-prevention.d.ts +33 -0
  7. package/dist/agents/misbehavior-prevention.d.ts.map +1 -0
  8. package/dist/agents/misbehavior-prevention.js +278 -0
  9. package/dist/agents/misbehavior-prevention.js.map +1 -0
  10. package/dist/chat/handler.d.ts +13 -0
  11. package/dist/chat/handler.d.ts.map +1 -0
  12. package/dist/chat/handler.js +101 -0
  13. package/dist/chat/handler.js.map +1 -0
  14. package/dist/config.d.ts +6 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +66 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +182 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/insights/smart-injection.d.ts +67 -0
  23. package/dist/insights/smart-injection.d.ts.map +1 -0
  24. package/dist/insights/smart-injection.js +257 -0
  25. package/dist/insights/smart-injection.js.map +1 -0
  26. package/dist/legends/character-training.d.ts +36 -0
  27. package/dist/legends/character-training.d.ts.map +1 -0
  28. package/dist/legends/character-training.js +198 -0
  29. package/dist/legends/character-training.js.map +1 -0
  30. package/dist/legends/loader.d.ts +26 -0
  31. package/dist/legends/loader.d.ts.map +1 -0
  32. package/dist/legends/loader.js +104 -0
  33. package/dist/legends/loader.js.map +1 -0
  34. package/dist/legends/personality.d.ts +24 -0
  35. package/dist/legends/personality.d.ts.map +1 -0
  36. package/dist/legends/personality.js +211 -0
  37. package/dist/legends/personality.js.map +1 -0
  38. package/dist/legends/prompt-builder.d.ts +11 -0
  39. package/dist/legends/prompt-builder.d.ts.map +1 -0
  40. package/dist/legends/prompt-builder.js +113 -0
  41. package/dist/legends/prompt-builder.js.map +1 -0
  42. package/dist/tools/chat-with-legend.d.ts +83 -0
  43. package/dist/tools/chat-with-legend.d.ts.map +1 -0
  44. package/dist/tools/chat-with-legend.js +91 -0
  45. package/dist/tools/chat-with-legend.js.map +1 -0
  46. package/dist/tools/get-legend-context.d.ts +64 -0
  47. package/dist/tools/get-legend-context.d.ts.map +1 -0
  48. package/dist/tools/get-legend-context.js +407 -0
  49. package/dist/tools/get-legend-context.js.map +1 -0
  50. package/dist/tools/get-legend-insight.d.ts +33 -0
  51. package/dist/tools/get-legend-insight.d.ts.map +1 -0
  52. package/dist/tools/get-legend-insight.js +209 -0
  53. package/dist/tools/get-legend-insight.js.map +1 -0
  54. package/dist/tools/index.d.ts +103 -0
  55. package/dist/tools/index.d.ts.map +1 -0
  56. package/dist/tools/index.js +17 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/list-legends.d.ts +45 -0
  59. package/dist/tools/list-legends.d.ts.map +1 -0
  60. package/dist/tools/list-legends.js +124 -0
  61. package/dist/tools/list-legends.js.map +1 -0
  62. package/dist/types.d.ts +90 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/legends/anatoly-yakovenko/skill.yaml +534 -0
  67. package/legends/andre-cronje/skill.yaml +682 -0
  68. package/legends/andrew-carnegie/skill.yaml +499 -0
  69. package/legends/balaji-srinivasan/skill.yaml +706 -0
  70. package/legends/benjamin-graham/skill.yaml +671 -0
  71. package/legends/bill-gurley/skill.yaml +688 -0
  72. package/legends/brian-armstrong/skill.yaml +640 -0
  73. package/legends/brian-chesky/skill.yaml +692 -0
  74. package/legends/cathie-wood/skill.yaml +522 -0
  75. package/legends/charlie-munger/skill.yaml +694 -0
  76. package/legends/cz-binance/skill.yaml +545 -0
  77. package/legends/demis-hassabis/skill.yaml +762 -0
  78. package/legends/elon-musk/skill.yaml +594 -0
  79. package/legends/gary-vaynerchuk/skill.yaml +586 -0
  80. package/legends/hayden-adams/skill.yaml +591 -0
  81. package/legends/howard-marks/skill.yaml +767 -0
  82. package/legends/jack-dorsey/skill.yaml +568 -0
  83. package/legends/jeff-bezos/skill.yaml +623 -0
  84. package/legends/jensen-huang/skill.yaml +107 -0
  85. package/legends/marc-andreessen/skill.yaml +106 -0
  86. package/legends/mert-mumtaz/skill.yaml +551 -0
  87. package/legends/michael-heinrich/skill.yaml +425 -0
  88. package/legends/naval-ravikant/skill.yaml +575 -0
  89. package/legends/patrick-collison/skill.yaml +779 -0
  90. package/legends/paul-graham/skill.yaml +566 -0
  91. package/legends/peter-thiel/skill.yaml +741 -0
  92. package/legends/ray-dalio/skill.yaml +742 -0
  93. package/legends/reid-hoffman/skill.yaml +107 -0
  94. package/legends/sam-altman/skill.yaml +110 -0
  95. package/legends/satya-nadella/skill.yaml +751 -0
  96. package/legends/steve-jobs/skill.yaml +524 -0
  97. package/legends/sundar-pichai/skill.yaml +523 -0
  98. package/legends/tim-ferriss/skill.yaml +502 -0
  99. package/legends/tobi-lutke/skill.yaml +512 -0
  100. package/legends/vitalik-buterin/skill.yaml +739 -0
  101. package/legends/warren-buffett/skill.yaml +103 -0
  102. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misbehavior-prevention.js","sourceRoot":"","sources":["../../src/agents/misbehavior-prevention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Config, ChatMessage, LegendSkill } from '../types.js';
2
+ /**
3
+ * Select the appropriate model based on context
4
+ */
5
+ export declare function selectModel(messages: ChatMessage[], legend: LegendSkill, config: Config): string;
6
+ /**
7
+ * Chat with a legend
8
+ */
9
+ export declare function chatWithLegend(legend: LegendSkill, userMessage: string, conversationHistory: ChatMessage[], config: Config, context?: string): Promise<{
10
+ content: string;
11
+ model: string;
12
+ }>;
13
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsBpE;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CAqCR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,WAAW,EAAE,EAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD7C"}
@@ -0,0 +1,101 @@
1
+ // Chat handler for OpenRouter/OpenAI API calls
2
+ import OpenAI from 'openai';
3
+ import { buildLegendSystemPrompt } from '../legends/prompt-builder.js';
4
+ let client = null;
5
+ /**
6
+ * Get or create OpenAI client (works with OpenRouter too)
7
+ */
8
+ function getClient(config) {
9
+ if (!client) {
10
+ client = new OpenAI({
11
+ apiKey: config.apiKey,
12
+ baseURL: config.apiBaseUrl,
13
+ defaultHeaders: {
14
+ 'HTTP-Referer': 'https://vibey.dev',
15
+ 'X-Title': 'Vibey Legends MCP',
16
+ },
17
+ });
18
+ }
19
+ return client;
20
+ }
21
+ /**
22
+ * Select the appropriate model based on context
23
+ */
24
+ export function selectModel(messages, legend, config) {
25
+ // Premium legends always use premium model
26
+ const premiumLegends = ['charlie-munger', 'warren-buffett', 'peter-thiel'];
27
+ if (premiumLegends.includes(legend.id)) {
28
+ return config.models.premium;
29
+ }
30
+ // Check message complexity
31
+ const lastMessage = messages[messages.length - 1]?.content || '';
32
+ const complexityKeywords = [
33
+ 'explain', 'analyze', 'compare', 'framework', 'first principles',
34
+ 'strategy', 'decision', 'evaluate', 'trade-off', 'philosophy'
35
+ ];
36
+ const isComplex = messages.length > 4 ||
37
+ lastMessage.length > 400 ||
38
+ complexityKeywords.some(k => lastMessage.toLowerCase().includes(k));
39
+ if (isComplex) {
40
+ return config.models.premium;
41
+ }
42
+ // Use legend's preferred model if specified
43
+ if (legend.model_hints?.preferred) {
44
+ const preferredMap = {
45
+ 'claude-sonnet': config.models.premium,
46
+ 'claude-opus': config.models.premium,
47
+ 'gpt-4o': config.models.balanced,
48
+ '0g-inference': config.models.fast,
49
+ };
50
+ const mapped = preferredMap[legend.model_hints.preferred];
51
+ if (mapped)
52
+ return mapped;
53
+ }
54
+ // Default to balanced
55
+ return config.models.balanced;
56
+ }
57
+ /**
58
+ * Chat with a legend
59
+ */
60
+ export async function chatWithLegend(legend, userMessage, conversationHistory, config, context) {
61
+ const openai = getClient(config);
62
+ // Build system prompt
63
+ let systemPrompt = buildLegendSystemPrompt(legend);
64
+ // Add context if provided
65
+ if (context) {
66
+ systemPrompt += `\n\n## Current Context\nThe user is working on: ${context}`;
67
+ }
68
+ // Prepare messages
69
+ const messages = [
70
+ { role: 'system', content: systemPrompt },
71
+ ];
72
+ // Add conversation history
73
+ for (const msg of conversationHistory) {
74
+ if (msg.role === 'user' || msg.role === 'assistant') {
75
+ messages.push({ role: msg.role, content: msg.content });
76
+ }
77
+ }
78
+ // Add current message
79
+ messages.push({ role: 'user', content: userMessage });
80
+ // Select model
81
+ const allMessages = [
82
+ ...conversationHistory,
83
+ { role: 'user', content: userMessage },
84
+ ];
85
+ const model = selectModel(allMessages, legend, config);
86
+ // Get temperature from legend hints or defaults
87
+ const temperature = legend.model_hints?.temperature ?? config.defaults.temperature;
88
+ if (config.debug) {
89
+ console.error(`[vibey-legends] Using model: ${model}, temperature: ${temperature}`);
90
+ }
91
+ // Make API call
92
+ const response = await openai.chat.completions.create({
93
+ model,
94
+ messages,
95
+ temperature,
96
+ max_tokens: config.defaults.maxTokens,
97
+ });
98
+ const content = response.choices[0]?.message?.content || '';
99
+ return { content, model };
100
+ }
101
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/chat/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Config } from './types.js';
2
+ export declare function loadConfig(): Config;
3
+ export declare function log(config: Config, ...args: unknown[]): void;
4
+ export declare const LEGAL_DISCLAIMER = "\n---\n**\u26A0\uFE0F IMPORTANT DISCLAIMER**\n\nThis is an AI persona created for **educational and entertainment purposes only**.\n\n- \u274C NOT affiliated with, endorsed by, or representative of the real individual\n- \u274C NOT financial, legal, or professional advice\n- \u274C NOT the actual person - this is an AI simulation\n- \u2705 Based on publicly available information, speeches, and writings\n- \u2705 For learning frameworks and thinking patterns\n- \u2705 Always do your own research (DYOR)\n\n*The views expressed are AI-generated interpretations, not statements from the real person.*\n";
5
+ export declare const SHORT_DISCLAIMER = "*AI persona for education only. Not the real person. Not advice. DYOR.*";
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAgBzC,wBAAgB,UAAU,IAAI,MAAM,CAiCnC;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI5D;AAGD,eAAO,MAAM,gBAAgB,imBAc5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,4EAA4E,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,66 @@
1
+ // Configuration for Vibey Legends MCP Server
2
+ // Uses OpenRouter with FREE models by default
3
+ // Free models on OpenRouter (no API cost)
4
+ const FREE_MODELS = {
5
+ fast: 'meta-llama/llama-3.2-3b-instruct:free',
6
+ balanced: 'google/gemini-2.0-flash-exp:free',
7
+ premium: 'meta-llama/llama-3.1-70b-instruct:free',
8
+ };
9
+ // Paid models (higher quality, costs money)
10
+ const PAID_MODELS = {
11
+ fast: 'google/gemini-2.0-flash-001',
12
+ balanced: 'anthropic/claude-3.5-haiku',
13
+ premium: 'anthropic/claude-sonnet-4',
14
+ };
15
+ export function loadConfig() {
16
+ const apiKey = process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY;
17
+ if (!apiKey) {
18
+ throw new Error('Missing API key. Set OPENROUTER_API_KEY environment variable.\n' +
19
+ 'Get a FREE key at: https://openrouter.ai/keys\n' +
20
+ 'Free tier includes unlimited requests to free models!');
21
+ }
22
+ const isOpenRouter = !!process.env.OPENROUTER_API_KEY;
23
+ const useFreeModels = process.env.LEGENDS_USE_FREE_MODELS !== 'false'; // Default to free
24
+ const models = useFreeModels ? FREE_MODELS : PAID_MODELS;
25
+ return {
26
+ apiKey,
27
+ apiBaseUrl: isOpenRouter
28
+ ? 'https://openrouter.ai/api/v1'
29
+ : 'https://api.openai.com/v1',
30
+ models: {
31
+ fast: process.env.LEGENDS_MCP_MODEL_FAST || models.fast,
32
+ balanced: process.env.LEGENDS_MCP_MODEL_BALANCED || models.balanced,
33
+ premium: process.env.LEGENDS_MCP_MODEL_PREMIUM || models.premium,
34
+ },
35
+ defaults: {
36
+ temperature: parseFloat(process.env.LEGENDS_MCP_TEMPERATURE || '0.7'),
37
+ maxTokens: parseInt(process.env.LEGENDS_MCP_MAX_TOKENS || '4096', 10),
38
+ },
39
+ debug: process.env.LEGENDS_MCP_DEBUG === 'true',
40
+ useFreeModels,
41
+ };
42
+ }
43
+ export function log(config, ...args) {
44
+ if (config.debug) {
45
+ console.error('[vibey-legends]', ...args);
46
+ }
47
+ }
48
+ // Legal disclaimer that MUST appear with every response
49
+ export const LEGAL_DISCLAIMER = `
50
+ ---
51
+ **⚠️ IMPORTANT DISCLAIMER**
52
+
53
+ This is an AI persona created for **educational and entertainment purposes only**.
54
+
55
+ - ❌ NOT affiliated with, endorsed by, or representative of the real individual
56
+ - ❌ NOT financial, legal, or professional advice
57
+ - ❌ NOT the actual person - this is an AI simulation
58
+ - ✅ Based on publicly available information, speeches, and writings
59
+ - ✅ For learning frameworks and thinking patterns
60
+ - ✅ Always do your own research (DYOR)
61
+
62
+ *The views expressed are AI-generated interpretations, not statements from the real person.*
63
+ `;
64
+ // Short disclaimer for inline use
65
+ export const SHORT_DISCLAIMER = `*AI persona for education only. Not the real person. Not advice. DYOR.*`;
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,8CAA8C;AAI9C,0CAA0C;AAC1C,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,uCAAuC;IAC7C,QAAQ,EAAE,kCAAkC;IAC5C,OAAO,EAAE,wCAAwC;CAClD,CAAC;AAEF,4CAA4C;AAC5C,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,6BAA6B;IACnC,QAAQ,EAAE,4BAA4B;IACtC,OAAO,EAAE,2BAA2B;CACrC,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE5E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,iEAAiE;YACjE,iDAAiD;YACjD,uDAAuD,CACxD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,OAAO,CAAC,CAAC,kBAAkB;IAEzF,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;IAEzD,OAAO;QACL,MAAM;QACN,UAAU,EAAE,YAAY;YACtB,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,2BAA2B;QAC/B,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC,IAAI;YACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,MAAM,CAAC,QAAQ;YACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,MAAM,CAAC,OAAO;SACjE;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC;YACrE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,EAAE,EAAE,CAAC;SACtE;QACD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;QAC/C,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,GAAG,IAAe;IACpD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;CAc/B,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,yEAAyE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ // Vibey Legends MCP Server
3
+ // Chat with AI personas of legendary founders & investors
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { loadConfig, SHORT_DISCLAIMER } from './config.js';
8
+ import { loadLegends, getAllLegends, getLegendById, getLegendCount } from './legends/loader.js';
9
+ import { formatLegendMarkdown } from './legends/prompt-builder.js';
10
+ import { allTools, listLegends, formatLegendsMarkdown, executeChatWithLegend, getLegendContext, getLegendInsight, } from './tools/index.js';
11
+ // Load config and legends at startup
12
+ const config = loadConfig();
13
+ const legends = loadLegends();
14
+ console.error(`[vibey-legends] Loaded ${getLegendCount()} legends`);
15
+ console.error(`[vibey-legends] Using API: ${config.apiBaseUrl}`);
16
+ // Create MCP server
17
+ const server = new Server({
18
+ name: 'vibey-legends',
19
+ version: '1.0.0',
20
+ }, {
21
+ capabilities: {
22
+ tools: {},
23
+ resources: {},
24
+ },
25
+ });
26
+ // Handler: List available tools
27
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
28
+ return {
29
+ tools: allTools,
30
+ };
31
+ });
32
+ // Handler: Call a tool
33
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
34
+ const { name, arguments: args } = request.params;
35
+ try {
36
+ switch (name) {
37
+ case 'list_legends': {
38
+ const result = listLegends(args);
39
+ const markdown = formatLegendsMarkdown(result);
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: markdown,
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ case 'chat_with_legend': {
50
+ const input = args;
51
+ const legend = getLegendById(input.legend_id);
52
+ if (!legend) {
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `Error: Legend "${input.legend_id}" not found.\n\nUse list_legends to see available legends.`,
58
+ },
59
+ ],
60
+ isError: true,
61
+ };
62
+ }
63
+ const response = await executeChatWithLegend(input, config);
64
+ return {
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: `**${legend.name}:**\n\n${response.content}\n\n---\n*Model: ${response.model_used}*\n\n${SHORT_DISCLAIMER}`,
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ case 'get_legend_context': {
74
+ const input = args;
75
+ try {
76
+ const result = getLegendContext({
77
+ legend_id: input.legend_id,
78
+ format: input.format || 'full',
79
+ include_related: input.include_related || false,
80
+ });
81
+ let text = result.content;
82
+ // Add metadata
83
+ text += `\n\n---\n**Metadata:**\n`;
84
+ text += `- Frameworks: ${result.metadata.framework_count}\n`;
85
+ text += `- Principles: ${result.metadata.principle_count}\n`;
86
+ text += `- Examples: ${result.metadata.example_count}\n`;
87
+ if (result.related_legends?.length) {
88
+ text += `\n**Related Legends:**\n`;
89
+ result.related_legends.forEach(r => {
90
+ text += `- ${r.name} (${r.relationship})\n`;
91
+ });
92
+ }
93
+ return {
94
+ content: [{ type: 'text', text }],
95
+ };
96
+ }
97
+ catch (error) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
103
+ },
104
+ ],
105
+ isError: true,
106
+ };
107
+ }
108
+ }
109
+ case 'get_legend_insight': {
110
+ const input = args;
111
+ const insightText = getLegendInsight(input);
112
+ return {
113
+ content: [{ type: 'text', text: insightText }],
114
+ };
115
+ }
116
+ default:
117
+ return {
118
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
119
+ isError: true,
120
+ };
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.error(`[vibey-legends] Tool error:`, error);
125
+ return {
126
+ content: [
127
+ {
128
+ type: 'text',
129
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
130
+ },
131
+ ],
132
+ isError: true,
133
+ };
134
+ }
135
+ });
136
+ // Handler: List resources (legends as resources)
137
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
138
+ const legends = getAllLegends();
139
+ return {
140
+ resources: legends.map(legend => ({
141
+ uri: `legend://${legend.id}`,
142
+ name: legend.name,
143
+ description: legend.description,
144
+ mimeType: 'text/markdown',
145
+ })),
146
+ };
147
+ });
148
+ // Handler: Read a resource
149
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
150
+ const { uri } = request.params;
151
+ // Parse legend:// URI
152
+ const match = uri.match(/^legend:\/\/(.+)$/);
153
+ if (!match) {
154
+ throw new Error(`Invalid URI format: ${uri}`);
155
+ }
156
+ const legendId = match[1];
157
+ const legend = getLegendById(legendId);
158
+ if (!legend) {
159
+ throw new Error(`Legend not found: ${legendId}`);
160
+ }
161
+ const content = formatLegendMarkdown(legend);
162
+ return {
163
+ contents: [
164
+ {
165
+ uri,
166
+ mimeType: 'text/markdown',
167
+ text: content,
168
+ },
169
+ ],
170
+ };
171
+ });
172
+ // Start the server
173
+ async function main() {
174
+ const transport = new StdioServerTransport();
175
+ await server.connect(transport);
176
+ console.error('[vibey-legends] MCP server running on stdio');
177
+ }
178
+ main().catch((error) => {
179
+ console.error('[vibey-legends] Fatal error:', error);
180
+ process.exit(1);
181
+ });
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * INSIGHT INJECTION STRATEGY
3
+ *
4
+ * WHERE to inject insights:
5
+ * 1. Topic-triggered: User discusses topic → relevant legend speaks
6
+ * 2. Task-completion: After finishing work → celebratory wisdom
7
+ * 3. Problem-solving: User stuck → mentor perspective
8
+ * 4. Decision points: User choosing options → framework suggestion
9
+ * 5. Learning moments: User asks "how" → pattern/principle injection
10
+ *
11
+ * HOW MANY:
12
+ * - Max 1 insight per conversation turn
13
+ * - Max 3 insights per session (avoid spam)
14
+ * - Cooldown: 5 messages minimum between insights
15
+ * - User can disable with LEGENDS_DISABLE_INSIGHTS=true
16
+ */
17
+ export declare const TOPIC_LEGEND_MAP: Record<string, string[]>;
18
+ export type InsightContext = 'topic_match' | 'task_complete' | 'problem_solving' | 'decision_point' | 'learning_moment' | 'random_wisdom';
19
+ export interface InsightInjectionRule {
20
+ context: InsightContext;
21
+ trigger: RegExp | string[];
22
+ legend_ids: string[];
23
+ priority: number;
24
+ cooldown_messages: number;
25
+ }
26
+ export declare const INJECTION_RULES: InsightInjectionRule[];
27
+ interface SessionState {
28
+ insightCount: number;
29
+ messagesSinceLastInsight: number;
30
+ lastInsightLegend: string | null;
31
+ disabledUntil: number;
32
+ }
33
+ export declare const INSIGHT_CONFIG: {
34
+ maxInsightsPerSession: number;
35
+ minMessagesBetweenInsights: number;
36
+ globalCooldownMs: number;
37
+ enabled: boolean;
38
+ };
39
+ /**
40
+ * Detect topics in user message and find relevant legends
41
+ */
42
+ export declare function detectRelevantLegends(message: string): string[];
43
+ /**
44
+ * Check if insight should be injected based on context and rules
45
+ */
46
+ export declare function shouldInjectInsight(sessionId: string, message: string, context?: InsightContext): {
47
+ should: boolean;
48
+ legendId?: string;
49
+ reason?: string;
50
+ };
51
+ /**
52
+ * Get a recommended insight for the current context
53
+ */
54
+ export declare function getRecommendedInsight(sessionId: string, message: string): {
55
+ insight: string;
56
+ legendId: string;
57
+ } | null;
58
+ /**
59
+ * Reset session state (for testing or new conversations)
60
+ */
61
+ export declare function resetSession(sessionId: string): void;
62
+ /**
63
+ * Get session stats (for debugging)
64
+ */
65
+ export declare function getSessionStats(sessionId: string): SessionState;
66
+ export {};
67
+ //# sourceMappingURL=smart-injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-injection.d.ts","sourceRoot":"","sources":["../../src/insights/smart-injection.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AAGH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAuErD,CAAC;AAGF,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,CAAC;AAGpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAGD,eAAO,MAAM,eAAe,EAAE,oBAAoB,EAkDjD,CAAC;AAGF,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;CACvB;AAYD,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAwEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAE/D"}