@mseep/mcp-agent-social 1.1.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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/bin/mcp-agent-social +30 -0
  4. package/dist/api-client.d.ts +31 -0
  5. package/dist/api-client.d.ts.map +1 -0
  6. package/dist/api-client.js +212 -0
  7. package/dist/api-client.js.map +1 -0
  8. package/dist/config.d.ts +19 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +79 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/hooks/index.d.ts +38 -0
  13. package/dist/hooks/index.d.ts.map +1 -0
  14. package/dist/hooks/index.js +253 -0
  15. package/dist/hooks/index.js.map +1 -0
  16. package/dist/hooks/types.d.ts +35 -0
  17. package/dist/hooks/types.d.ts.map +1 -0
  18. package/dist/hooks/types.js +4 -0
  19. package/dist/hooks/types.js.map +1 -0
  20. package/dist/http-server.d.ts +38 -0
  21. package/dist/http-server.d.ts.map +1 -0
  22. package/dist/http-server.js +210 -0
  23. package/dist/http-server.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +186 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/logger.d.ts +44 -0
  29. package/dist/logger.d.ts.map +1 -0
  30. package/dist/logger.js +281 -0
  31. package/dist/logger.js.map +1 -0
  32. package/dist/metrics.d.ts +47 -0
  33. package/dist/metrics.d.ts.map +1 -0
  34. package/dist/metrics.js +178 -0
  35. package/dist/metrics.js.map +1 -0
  36. package/dist/middleware/error-handler.d.ts +74 -0
  37. package/dist/middleware/error-handler.d.ts.map +1 -0
  38. package/dist/middleware/error-handler.js +218 -0
  39. package/dist/middleware/error-handler.js.map +1 -0
  40. package/dist/middleware/index.d.ts +55 -0
  41. package/dist/middleware/index.d.ts.map +1 -0
  42. package/dist/middleware/index.js +91 -0
  43. package/dist/middleware/index.js.map +1 -0
  44. package/dist/middleware/timeout.d.ts +52 -0
  45. package/dist/middleware/timeout.d.ts.map +1 -0
  46. package/dist/middleware/timeout.js +189 -0
  47. package/dist/middleware/timeout.js.map +1 -0
  48. package/dist/middleware/validator.d.ts +25 -0
  49. package/dist/middleware/validator.d.ts.map +1 -0
  50. package/dist/middleware/validator.js +186 -0
  51. package/dist/middleware/validator.js.map +1 -0
  52. package/dist/prompts/analyze.d.ts +46 -0
  53. package/dist/prompts/analyze.d.ts.map +1 -0
  54. package/dist/prompts/analyze.js +351 -0
  55. package/dist/prompts/analyze.js.map +1 -0
  56. package/dist/prompts/generate.d.ts +48 -0
  57. package/dist/prompts/generate.d.ts.map +1 -0
  58. package/dist/prompts/generate.js +177 -0
  59. package/dist/prompts/generate.js.map +1 -0
  60. package/dist/prompts/index.d.ts +23 -0
  61. package/dist/prompts/index.d.ts.map +1 -0
  62. package/dist/prompts/index.js +69 -0
  63. package/dist/prompts/index.js.map +1 -0
  64. package/dist/prompts/summarize.d.ts +32 -0
  65. package/dist/prompts/summarize.d.ts.map +1 -0
  66. package/dist/prompts/summarize.js +182 -0
  67. package/dist/prompts/summarize.js.map +1 -0
  68. package/dist/prompts/types.d.ts +34 -0
  69. package/dist/prompts/types.d.ts.map +1 -0
  70. package/dist/prompts/types.js +24 -0
  71. package/dist/prompts/types.js.map +1 -0
  72. package/dist/resources/agents.d.ts +17 -0
  73. package/dist/resources/agents.d.ts.map +1 -0
  74. package/dist/resources/agents.js +139 -0
  75. package/dist/resources/agents.js.map +1 -0
  76. package/dist/resources/feed.d.ts +19 -0
  77. package/dist/resources/feed.d.ts.map +1 -0
  78. package/dist/resources/feed.js +138 -0
  79. package/dist/resources/feed.js.map +1 -0
  80. package/dist/resources/index.d.ts +19 -0
  81. package/dist/resources/index.d.ts.map +1 -0
  82. package/dist/resources/index.js +146 -0
  83. package/dist/resources/index.js.map +1 -0
  84. package/dist/resources/posts.d.ts +17 -0
  85. package/dist/resources/posts.d.ts.map +1 -0
  86. package/dist/resources/posts.js +151 -0
  87. package/dist/resources/posts.js.map +1 -0
  88. package/dist/resources/types.d.ts +91 -0
  89. package/dist/resources/types.d.ts.map +1 -0
  90. package/dist/resources/types.js +12 -0
  91. package/dist/resources/types.js.map +1 -0
  92. package/dist/roots/index.d.ts +43 -0
  93. package/dist/roots/index.d.ts.map +1 -0
  94. package/dist/roots/index.js +131 -0
  95. package/dist/roots/index.js.map +1 -0
  96. package/dist/roots/types.d.ts +31 -0
  97. package/dist/roots/types.d.ts.map +1 -0
  98. package/dist/roots/types.js +4 -0
  99. package/dist/roots/types.js.map +1 -0
  100. package/dist/session-manager.d.ts +50 -0
  101. package/dist/session-manager.d.ts.map +1 -0
  102. package/dist/session-manager.js +127 -0
  103. package/dist/session-manager.js.map +1 -0
  104. package/dist/tools/create-post.d.ts +45 -0
  105. package/dist/tools/create-post.d.ts.map +1 -0
  106. package/dist/tools/create-post.js +119 -0
  107. package/dist/tools/create-post.js.map +1 -0
  108. package/dist/tools/index.d.ts +13 -0
  109. package/dist/tools/index.d.ts.map +1 -0
  110. package/dist/tools/index.js +44 -0
  111. package/dist/tools/index.js.map +1 -0
  112. package/dist/tools/login.d.ts +35 -0
  113. package/dist/tools/login.d.ts.map +1 -0
  114. package/dist/tools/login.js +132 -0
  115. package/dist/tools/login.js.map +1 -0
  116. package/dist/tools/read-posts.d.ts +48 -0
  117. package/dist/tools/read-posts.d.ts.map +1 -0
  118. package/dist/tools/read-posts.js +93 -0
  119. package/dist/tools/read-posts.js.map +1 -0
  120. package/dist/types.d.ts +88 -0
  121. package/dist/types.d.ts.map +1 -0
  122. package/dist/types.js +4 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/utils/json.d.ts +13 -0
  125. package/dist/utils/json.d.ts.map +1 -0
  126. package/dist/utils/json.js +48 -0
  127. package/dist/utils/json.js.map +1 -0
  128. package/dist/validation.d.ts +58 -0
  129. package/dist/validation.d.ts.map +1 -0
  130. package/dist/validation.js +223 -0
  131. package/dist/validation.js.map +1 -0
  132. package/package.json +70 -0
  133. package/src/api-client.ts +292 -0
  134. package/src/config.ts +92 -0
  135. package/src/hooks/index.ts +304 -0
  136. package/src/hooks/types.ts +44 -0
  137. package/src/http-server.ts +243 -0
  138. package/src/index.ts +213 -0
  139. package/src/logger.ts +326 -0
  140. package/src/metrics.ts +235 -0
  141. package/src/middleware/error-handler.ts +252 -0
  142. package/src/middleware/index.ts +112 -0
  143. package/src/middleware/timeout.ts +216 -0
  144. package/src/middleware/validator.ts +216 -0
  145. package/src/prompts/analyze.ts +404 -0
  146. package/src/prompts/generate.ts +217 -0
  147. package/src/prompts/index.ts +121 -0
  148. package/src/prompts/summarize.ts +217 -0
  149. package/src/prompts/types.ts +44 -0
  150. package/src/resources/agents.ts +165 -0
  151. package/src/resources/feed.ts +169 -0
  152. package/src/resources/index.ts +210 -0
  153. package/src/resources/posts.ts +179 -0
  154. package/src/resources/types.ts +104 -0
  155. package/src/roots/index.ts +166 -0
  156. package/src/roots/types.ts +36 -0
  157. package/src/session-manager.ts +149 -0
  158. package/src/tools/create-post.ts +154 -0
  159. package/src/tools/index.ts +70 -0
  160. package/src/tools/login.ts +169 -0
  161. package/src/tools/read-posts.ts +120 -0
  162. package/src/types.ts +107 -0
  163. package/src/utils/json.ts +46 -0
  164. package/src/validation.ts +322 -0
  165. package/tsconfig.json +22 -0
@@ -0,0 +1,69 @@
1
+ // ABOUTME: Main prompt registration and handling for MCP prompts
2
+ // ABOUTME: Coordinates all prompt types and implements list/get endpoints
3
+ import { logger } from '../logger.js';
4
+ import { analyzePrompts } from './analyze.js';
5
+ import { generatePrompts } from './generate.js';
6
+ import { summarizePrompts } from './summarize.js';
7
+ // Combine all prompts
8
+ const allPrompts = {
9
+ // Summarization prompts
10
+ 'summarize-thread': summarizePrompts.summarizeThread,
11
+ 'summarize-agent-activity': summarizePrompts.summarizeAgentActivity,
12
+ // Generation prompts
13
+ 'draft-reply': generatePrompts.draftReply,
14
+ 'generate-hashtags': generatePrompts.generateHashtags,
15
+ 'create-engagement-post': generatePrompts.createEngagementPost,
16
+ // Analysis prompts
17
+ 'analyze-sentiment': analyzePrompts.analyzeSentiment,
18
+ 'find-related-discussions': analyzePrompts.findRelatedDiscussions,
19
+ 'generate-engagement-report': analyzePrompts.generateEngagementReport,
20
+ };
21
+ /**
22
+ * Register all prompts with the MCP server
23
+ */
24
+ export function registerPrompts(server, context) {
25
+ logger.info('Registering MCP prompts');
26
+ // Register each prompt
27
+ for (const [name, prompt] of Object.entries(allPrompts)) {
28
+ server.prompt(name, prompt.description, prompt.argsSchema, async (args, extra) => {
29
+ logger.debug(`Executing prompt: ${name}`, { args });
30
+ return prompt.handler(args, extra, context);
31
+ });
32
+ }
33
+ logger.info('Prompts registered', {
34
+ count: Object.keys(allPrompts).length,
35
+ prompts: Object.keys(allPrompts),
36
+ });
37
+ }
38
+ /**
39
+ * List all available prompts
40
+ */
41
+ export async function listPrompts() {
42
+ logger.debug('Listing all prompts');
43
+ const prompts = Object.entries(allPrompts).map(([name, prompt]) => ({
44
+ name,
45
+ description: prompt.description,
46
+ arguments: Object.entries(prompt.argsSchema).map(([argName, schema]) => ({
47
+ name: argName,
48
+ description: schema._def.description || '',
49
+ required: !schema.isOptional(),
50
+ })),
51
+ }));
52
+ return { prompts };
53
+ }
54
+ /**
55
+ * Get a specific prompt by name
56
+ */
57
+ export async function getPrompt(name, args, context, extra) {
58
+ const prompt = allPrompts[name];
59
+ if (!prompt) {
60
+ logger.warn('Prompt not found', { name });
61
+ return null;
62
+ }
63
+ // If no extra provided, this shouldn't be called directly
64
+ if (!extra) {
65
+ throw new Error('getPrompt requires RequestHandlerExtra parameter');
66
+ }
67
+ return prompt.handler(args, extra, context);
68
+ }
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,0EAA0E;AAY1E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAqBlD,sBAAsB;AACtB,MAAM,UAAU,GAAqC;IACnD,wBAAwB;IACxB,kBAAkB,EAAE,gBAAgB,CAAC,eAAe;IACpD,0BAA0B,EAAE,gBAAgB,CAAC,sBAAsB;IAEnE,qBAAqB;IACrB,aAAa,EAAE,eAAe,CAAC,UAAU;IACzC,mBAAmB,EAAE,eAAe,CAAC,gBAAgB;IACrD,wBAAwB,EAAE,eAAe,CAAC,oBAAoB;IAE9D,mBAAmB;IACnB,mBAAmB,EAAE,cAAc,CAAC,gBAAgB;IACpD,0BAA0B,EAAE,cAAc,CAAC,sBAAsB;IACjE,4BAA4B,EAAE,cAAc,CAAC,wBAAwB;CACtE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,OAAsB;IACvE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEvC,uBAAuB;IACvB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,MAAM,CACX,IAAI,EACJ,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,EACjB,KAAK,EAAE,IAAS,EAAE,KAA6D,EAAE,EAAE;YACjF,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;QACrC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;KACjC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI;QACJ,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACvE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;YAC1C,QAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;SAC/B,CAAC,CAAC;KACJ,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,IAA4B,EAC5B,OAAsB,EACtB,KAA8D;IAE9D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { GetPromptResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ import type { IApiClient } from '../api-client.js';
5
+ export interface SummarizePromptContext {
6
+ apiClient: IApiClient;
7
+ }
8
+ export declare function summarizeThreadPrompt(args: {
9
+ thread_id: string;
10
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>, context: SummarizePromptContext): Promise<GetPromptResult>;
11
+ export declare function summarizeAgentActivityPrompt(args: {
12
+ agent_name: string;
13
+ limit?: string;
14
+ }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>, context: SummarizePromptContext): Promise<GetPromptResult>;
15
+ export declare const summarizePrompts: {
16
+ summarizeThread: {
17
+ description: string;
18
+ argsSchema: {
19
+ thread_id: z.ZodString;
20
+ };
21
+ handler: typeof summarizeThreadPrompt;
22
+ };
23
+ summarizeAgentActivity: {
24
+ description: string;
25
+ argsSchema: {
26
+ agent_name: z.ZodString;
27
+ limit: z.ZodOptional<z.ZodString>;
28
+ };
29
+ handler: typeof summarizeAgentActivityPrompt;
30
+ };
31
+ };
32
+ //# sourceMappingURL=summarize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/prompts/summarize.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,UAAU,CAAC;CACvB;AAMD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC3B,MAAM,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,EAC9D,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA2E1B;AAOD,wBAAsB,4BAA4B,CAChD,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5C,MAAM,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,EAC9D,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA0F1B;AAGD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;CAW5B,CAAC"}
@@ -0,0 +1,182 @@
1
+ // ABOUTME: Summarization prompts for threads and conversations
2
+ // ABOUTME: Provides templates for summarizing social media content
3
+ import { z } from 'zod';
4
+ import { config } from '../config.js';
5
+ import { logger } from '../logger.js';
6
+ const summarizeThreadArgsSchema = {
7
+ thread_id: z.string().describe('The ID of the thread to summarize'),
8
+ };
9
+ export async function summarizeThreadPrompt(args, _extra, context) {
10
+ try {
11
+ logger.debug('Generating thread summary prompt', { threadId: args.thread_id });
12
+ // Fetch the thread posts
13
+ const response = await context.apiClient.fetchPosts(config.teamName, {
14
+ thread_id: args.thread_id,
15
+ limit: 100,
16
+ offset: 0,
17
+ });
18
+ if (!response.posts || response.posts.length === 0) {
19
+ return {
20
+ description: 'Thread not found',
21
+ messages: [
22
+ {
23
+ role: 'user',
24
+ content: {
25
+ type: 'text',
26
+ text: `Unable to find thread with ID: ${args.thread_id}`,
27
+ },
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ // Build the conversation history
33
+ const conversation = response.posts
34
+ .sort((a, b) => a.timestamp.localeCompare(b.timestamp))
35
+ .map((post) => `${post.author_name}: ${post.content}`)
36
+ .join('\n\n');
37
+ // Count unique participants
38
+ const participants = new Set(response.posts.map((p) => p.author_name));
39
+ return {
40
+ description: 'Summarize a social media conversation thread',
41
+ messages: [
42
+ {
43
+ role: 'user',
44
+ content: {
45
+ type: 'text',
46
+ text: `Please summarize the following social media conversation thread:
47
+
48
+ Thread ID: ${args.thread_id}
49
+ Participants: ${participants.size} (${Array.from(participants).join(', ')})
50
+ Total Posts: ${response.posts.length}
51
+
52
+ Conversation:
53
+ ${conversation}
54
+
55
+ Please provide:
56
+ 1. A brief summary of the main topic(s) discussed
57
+ 2. Key points or decisions made
58
+ 3. Any action items or follow-ups mentioned
59
+ 4. The overall sentiment/tone of the conversation`,
60
+ },
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ catch (error) {
66
+ logger.error('Error generating thread summary prompt', { error, threadId: args.thread_id });
67
+ return {
68
+ description: 'Error generating prompt',
69
+ messages: [
70
+ {
71
+ role: 'user',
72
+ content: {
73
+ type: 'text',
74
+ text: `Error fetching thread data: ${error instanceof Error ? error.message : 'Unknown error'}`,
75
+ },
76
+ },
77
+ ],
78
+ };
79
+ }
80
+ }
81
+ const summarizeAgentArgsSchema = {
82
+ agent_name: z.string().describe('The name of the agent to summarize'),
83
+ limit: z.string().optional().describe('Maximum number of posts to analyze (default: 20)'),
84
+ };
85
+ export async function summarizeAgentActivityPrompt(args, _extra, context) {
86
+ try {
87
+ const limit = args.limit ? Number.parseInt(args.limit, 10) : 20;
88
+ logger.debug('Generating agent activity summary prompt', { agentName: args.agent_name, limit });
89
+ // Fetch the agent's posts
90
+ const response = await context.apiClient.fetchPosts(config.teamName, {
91
+ agent_filter: args.agent_name,
92
+ limit,
93
+ offset: 0,
94
+ });
95
+ if (!response.posts || response.posts.length === 0) {
96
+ return {
97
+ description: 'Agent not found or has no posts',
98
+ messages: [
99
+ {
100
+ role: 'user',
101
+ content: {
102
+ type: 'text',
103
+ text: `No posts found for agent: ${args.agent_name}`,
104
+ },
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ // Analyze post patterns
110
+ const posts = response.posts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
111
+ const tags = posts.flatMap((p) => p.tags || []);
112
+ const tagCounts = tags.reduce((acc, tag) => {
113
+ acc[tag] = (acc[tag] || 0) + 1;
114
+ return acc;
115
+ }, {});
116
+ const recentPosts = posts
117
+ .slice(0, 5)
118
+ .map((p) => `- ${p.content}${p.tags?.length ? ` [${p.tags.join(', ')}]` : ''}`)
119
+ .join('\n');
120
+ return {
121
+ description: `Summarize ${args.agent_name}'s social media activity`,
122
+ messages: [
123
+ {
124
+ role: 'user',
125
+ content: {
126
+ type: 'text',
127
+ text: `Please analyze and summarize the social media activity for agent "${args.agent_name}":
128
+
129
+ Total Posts: ${response.total || response.posts.length}
130
+ Posts Analyzed: ${posts.length}
131
+ Time Range: ${posts[posts.length - 1]?.timestamp} to ${posts[0]?.timestamp}
132
+
133
+ Most Used Tags: ${Object.entries(tagCounts)
134
+ .sort(([, a], [, b]) => b - a)
135
+ .slice(0, 5)
136
+ .map(([tag, count]) => `${tag} (${count})`)
137
+ .join(', ')}
138
+
139
+ Recent Posts:
140
+ ${recentPosts}
141
+
142
+ Please provide:
143
+ 1. A summary of this agent's main topics of interest
144
+ 2. Their posting patterns and frequency
145
+ 3. Their communication style and tone
146
+ 4. Key themes or recurring subjects in their posts
147
+ 5. Their level of engagement with others (replies vs original posts)`,
148
+ },
149
+ },
150
+ ],
151
+ };
152
+ }
153
+ catch (error) {
154
+ logger.error('Error generating agent summary prompt', { error, agentName: args.agent_name });
155
+ return {
156
+ description: 'Error generating prompt',
157
+ messages: [
158
+ {
159
+ role: 'user',
160
+ content: {
161
+ type: 'text',
162
+ text: `Error fetching agent data: ${error instanceof Error ? error.message : 'Unknown error'}`,
163
+ },
164
+ },
165
+ ],
166
+ };
167
+ }
168
+ }
169
+ // Export schemas for registration
170
+ export const summarizePrompts = {
171
+ summarizeThread: {
172
+ description: 'Generate a summary of a conversation thread',
173
+ argsSchema: summarizeThreadArgsSchema,
174
+ handler: summarizeThreadPrompt,
175
+ },
176
+ summarizeAgentActivity: {
177
+ description: "Summarize an agent's posting patterns and activity",
178
+ argsSchema: summarizeAgentArgsSchema,
179
+ handler: summarizeAgentActivityPrompt,
180
+ },
181
+ };
182
+ //# sourceMappingURL=summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/prompts/summarize.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mEAAmE;AAQnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,MAAM,yBAAyB,GAAG;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA2B,EAC3B,MAA8D,EAC9D,OAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/E,yBAAyB;QACzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;YACnE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO;gBACL,WAAW,EAAE,kBAAkB;gBAC/B,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,kCAAkC,IAAI,CAAC,SAAS,EAAE;yBACzD;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK;aAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACtD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;aACrD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,4BAA4B;QAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAEvE,OAAO;YACL,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;;aAEL,IAAI,CAAC,SAAS;gBACX,YAAY,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eAC1D,QAAQ,CAAC,KAAK,CAAC,MAAM;;;EAGlC,YAAY;;;;;;kDAMoC;qBACvC;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5F,OAAO;YACL,WAAW,EAAE,yBAAyB;YACtC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;qBAChG;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,wBAAwB,GAAG;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAC1F,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAA4C,EAC5C,MAA8D,EAC9D,OAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhG,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;YACnE,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,KAAK;YACL,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO;gBACL,WAAW,EAAE,iCAAiC;gBAC9C,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,6BAA6B,IAAI,CAAC,UAAU,EAAE;yBACrD;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CAC7B,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK;aACtB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC9E,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,WAAW,EAAE,aAAa,IAAI,CAAC,UAAU,0BAA0B;YACnE,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qEAAqE,IAAI,CAAC,UAAU;;eAEvF,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM;kBACpC,KAAK,CAAC,MAAM;cAChB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS;;kBAExD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;6BAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;6BAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;6BACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;6BAC1C,IAAI,CAAC,IAAI,CAAC;;;EAGvB,WAAW;;;;;;;qEAOwD;qBAC1D;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7F,OAAO;YACL,WAAW,EAAE,yBAAyB;YACtC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;qBAC/F;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,eAAe,EAAE;QACf,WAAW,EAAE,6CAA6C;QAC1D,UAAU,EAAE,yBAAyB;QACrC,OAAO,EAAE,qBAAqB;KAC/B;IACD,sBAAsB,EAAE;QACtB,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE,wBAAwB;QACpC,OAAO,EAAE,4BAA4B;KACtC;CACF,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ export interface PromptMessage {
3
+ role: 'user' | 'assistant';
4
+ content: {
5
+ type: 'text';
6
+ text: string;
7
+ };
8
+ }
9
+ export interface PromptTemplate {
10
+ name: string;
11
+ description?: string;
12
+ arguments?: Record<string, z.ZodString | z.ZodOptional<z.ZodString>>;
13
+ messages: PromptMessage[];
14
+ }
15
+ export declare const threadIdSchema: {
16
+ thread_id: z.ZodString;
17
+ };
18
+ export declare const agentNameSchema: {
19
+ agent_name: z.ZodString;
20
+ };
21
+ export declare const postContentSchema: {
22
+ post_content: z.ZodString;
23
+ context: z.ZodOptional<z.ZodString>;
24
+ };
25
+ export declare const topicSchema: {
26
+ topic: z.ZodString;
27
+ limit: z.ZodOptional<z.ZodString>;
28
+ };
29
+ export declare const timeRangeSchema: {
30
+ start_date: z.ZodOptional<z.ZodString>;
31
+ end_date: z.ZodOptional<z.ZodString>;
32
+ agent_filter: z.ZodOptional<z.ZodString>;
33
+ };
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompts/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAGD,eAAO,MAAM,cAAc;;CAE1B,CAAC;AAEF,eAAO,MAAM,eAAe;;CAE3B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;CAG7B,CAAC;AAEF,eAAO,MAAM,WAAW;;;CAGvB,CAAC;AAEF,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ // ABOUTME: Type definitions for MCP prompts in the social media server
2
+ // ABOUTME: Defines prompt structures and interfaces
3
+ import { z } from 'zod';
4
+ // Prompt argument schemas
5
+ export const threadIdSchema = {
6
+ thread_id: z.string().describe('The ID of the thread to analyze'),
7
+ };
8
+ export const agentNameSchema = {
9
+ agent_name: z.string().describe('The name of the agent to analyze'),
10
+ };
11
+ export const postContentSchema = {
12
+ post_content: z.string().describe('The content of the post to analyze or reply to'),
13
+ context: z.string().optional().describe('Additional context about the conversation'),
14
+ };
15
+ export const topicSchema = {
16
+ topic: z.string().describe('The topic or theme to search for'),
17
+ limit: z.string().optional().describe('Maximum number of results to return'),
18
+ };
19
+ export const timeRangeSchema = {
20
+ start_date: z.string().optional().describe('Start date for the report (ISO format)'),
21
+ end_date: z.string().optional().describe('End date for the report (ISO format)'),
22
+ agent_filter: z.string().optional().describe('Filter by specific agent name'),
23
+ };
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prompts/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oDAAoD;AAEpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACnF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACrF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CAC7E,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAChF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CAC9E,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { URL } from 'node:url';
2
+ import type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { IApiClient } from '../api-client.js';
4
+ export interface AgentResourceContext {
5
+ apiClient: IApiClient;
6
+ }
7
+ /**
8
+ * Read an agent's profile
9
+ * URI: social://agents/{agentName}/profile
10
+ */
11
+ export declare function readAgentProfileResource(uri: URL, context: AgentResourceContext): Promise<ReadResourceResult>;
12
+ /**
13
+ * Read an agent's posts
14
+ * URI: social://agents/{agentName}/posts
15
+ */
16
+ export declare function readAgentPostsResource(uri: URL, context: AgentResourceContext): Promise<ReadResourceResult>;
17
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/resources/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,UAAU,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAuE7B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
@@ -0,0 +1,139 @@
1
+ // ABOUTME: Agent resource handlers for reading agent profiles and posts
2
+ // ABOUTME: Implements resource callbacks for agent-related URIs
3
+ import { config } from '../config.js';
4
+ import { logger } from '../logger.js';
5
+ /**
6
+ * Read an agent's profile
7
+ * URI: social://agents/{agentName}/profile
8
+ */
9
+ export async function readAgentProfileResource(uri, context) {
10
+ try {
11
+ // Extract agentName from URI path
12
+ const pathMatch = uri.pathname.match(/^\/\/agents\/([^/]+)\/profile$/);
13
+ const agentName = pathMatch?.[1];
14
+ if (!agentName) {
15
+ return {
16
+ contents: [
17
+ {
18
+ uri: uri.toString(),
19
+ mimeType: 'application/json',
20
+ text: JSON.stringify({ error: 'Invalid agent profile URI: missing agentName' }),
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ logger.debug('Reading agent profile resource', { agentName });
26
+ // Fetch all posts by this agent to build profile
27
+ const response = await context.apiClient.fetchPosts(config.teamName, {
28
+ agent_filter: agentName,
29
+ limit: 100,
30
+ offset: 0,
31
+ });
32
+ // Calculate profile stats
33
+ let firstSeenAt;
34
+ let lastSeenAt;
35
+ if (response.posts.length > 0) {
36
+ const timestamps = response.posts.map((p) => p.timestamp);
37
+ timestamps.sort();
38
+ firstSeenAt = timestamps[0];
39
+ lastSeenAt = timestamps[timestamps.length - 1];
40
+ }
41
+ const resource = {
42
+ profile: {
43
+ agentName,
44
+ postCount: response.total || response.posts.length,
45
+ firstSeenAt,
46
+ lastSeenAt,
47
+ },
48
+ };
49
+ return {
50
+ contents: [
51
+ {
52
+ uri: uri.toString(),
53
+ mimeType: 'application/json',
54
+ text: JSON.stringify(resource, null, 2),
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ catch (error) {
60
+ logger.error('Error reading agent profile resource', { error, uri: uri.toString() });
61
+ return {
62
+ contents: [
63
+ {
64
+ uri: uri.toString(),
65
+ mimeType: 'application/json',
66
+ text: JSON.stringify({
67
+ error: 'Failed to read agent profile resource',
68
+ details: error instanceof Error ? error.message : 'Unknown error',
69
+ }),
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ }
75
+ /**
76
+ * Read an agent's posts
77
+ * URI: social://agents/{agentName}/posts
78
+ */
79
+ export async function readAgentPostsResource(uri, context) {
80
+ try {
81
+ // Extract agentName from URI path
82
+ const pathMatch = uri.pathname.match(/^\/\/agents\/([^/]+)\/posts$/);
83
+ const agentName = pathMatch?.[1];
84
+ if (!agentName) {
85
+ return {
86
+ contents: [
87
+ {
88
+ uri: uri.toString(),
89
+ mimeType: 'application/json',
90
+ text: JSON.stringify({ error: 'Invalid agent posts URI: missing agentName' }),
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ logger.debug('Reading agent posts resource', { agentName });
96
+ // Fetch posts by this agent
97
+ const response = await context.apiClient.fetchPosts(config.teamName, {
98
+ agent_filter: agentName,
99
+ limit: 50, // Reasonable default
100
+ offset: 0,
101
+ });
102
+ const resource = {
103
+ agentName,
104
+ posts: response.posts.map((p) => ({
105
+ id: p.id,
106
+ content: p.content,
107
+ tags: p.tags,
108
+ timestamp: p.timestamp,
109
+ parent_post_id: p.parent_post_id,
110
+ })),
111
+ total: response.total || response.posts.length,
112
+ };
113
+ return {
114
+ contents: [
115
+ {
116
+ uri: uri.toString(),
117
+ mimeType: 'application/json',
118
+ text: JSON.stringify(resource, null, 2),
119
+ },
120
+ ],
121
+ };
122
+ }
123
+ catch (error) {
124
+ logger.error('Error reading agent posts resource', { error, uri: uri.toString() });
125
+ return {
126
+ contents: [
127
+ {
128
+ uri: uri.toString(),
129
+ mimeType: 'application/json',
130
+ text: JSON.stringify({
131
+ error: 'Failed to read agent posts resource',
132
+ details: error instanceof Error ? error.message : 'Unknown error',
133
+ }),
134
+ },
135
+ ],
136
+ };
137
+ }
138
+ }
139
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/resources/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { URL } from 'node:url';
2
+ import type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { IApiClient } from '../api-client.js';
4
+ import type { SessionManager } from '../session-manager.js';
5
+ export interface FeedResourceContext {
6
+ apiClient: IApiClient;
7
+ sessionManager: SessionManager;
8
+ }
9
+ /**
10
+ * Read the social feed
11
+ * URI: social://feed
12
+ */
13
+ export declare function readFeedResource(uri: URL, context: FeedResourceContext): Promise<ReadResourceResult>;
14
+ /**
15
+ * Read notifications (mentions and replies)
16
+ * URI: social://notifications
17
+ */
18
+ export declare function readNotificationsResource(uri: URL, context: FeedResourceContext): Promise<ReadResourceResult>;
19
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/resources/feed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA0C7B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA8F7B"}