social-mcp 2.1.0 → 2.3.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 (103) hide show
  1. package/README.md +129 -3
  2. package/dist/index.js +64 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/config.d.ts +34 -0
  5. package/dist/lib/config.js +34 -0
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/services/beehiiv-service.d.ts +69 -0
  8. package/dist/services/beehiiv-service.js +97 -0
  9. package/dist/services/beehiiv-service.js.map +1 -0
  10. package/dist/services/devto-service.d.ts +99 -0
  11. package/dist/services/devto-service.js +92 -0
  12. package/dist/services/devto-service.js.map +1 -0
  13. package/dist/services/email-service.d.ts +5 -1
  14. package/dist/services/email-service.js +76 -4
  15. package/dist/services/email-service.js.map +1 -1
  16. package/dist/services/ghost-service.d.ts +80 -0
  17. package/dist/services/ghost-service.js +123 -0
  18. package/dist/services/ghost-service.js.map +1 -0
  19. package/dist/services/hashnode-service.d.ts +86 -0
  20. package/dist/services/hashnode-service.js +161 -0
  21. package/dist/services/hashnode-service.js.map +1 -0
  22. package/dist/services/tumblr-service.d.ts +73 -0
  23. package/dist/services/tumblr-service.js +113 -0
  24. package/dist/services/tumblr-service.js.map +1 -0
  25. package/dist/services/twitch-service.d.ts +85 -0
  26. package/dist/services/twitch-service.js +135 -0
  27. package/dist/services/twitch-service.js.map +1 -0
  28. package/dist/tools/beehiiv-tools/create-post.d.ts +40 -0
  29. package/dist/tools/beehiiv-tools/create-post.js +49 -0
  30. package/dist/tools/beehiiv-tools/create-post.js.map +1 -0
  31. package/dist/tools/beehiiv-tools/get-posts.d.ts +20 -0
  32. package/dist/tools/beehiiv-tools/get-posts.js +51 -0
  33. package/dist/tools/beehiiv-tools/get-posts.js.map +1 -0
  34. package/dist/tools/beehiiv-tools/get-subscribers.d.ts +20 -0
  35. package/dist/tools/beehiiv-tools/get-subscribers.js +48 -0
  36. package/dist/tools/beehiiv-tools/get-subscribers.js.map +1 -0
  37. package/dist/tools/devto-tools/create-article.d.ts +30 -0
  38. package/dist/tools/devto-tools/create-article.js +47 -0
  39. package/dist/tools/devto-tools/create-article.js.map +1 -0
  40. package/dist/tools/devto-tools/get-article.d.ts +16 -0
  41. package/dist/tools/devto-tools/get-article.js +40 -0
  42. package/dist/tools/devto-tools/get-article.js.map +1 -0
  43. package/dist/tools/devto-tools/get-articles.d.ts +18 -0
  44. package/dist/tools/devto-tools/get-articles.js +41 -0
  45. package/dist/tools/devto-tools/get-articles.js.map +1 -0
  46. package/dist/tools/devto-tools/update-article.d.ts +28 -0
  47. package/dist/tools/devto-tools/update-article.js +51 -0
  48. package/dist/tools/devto-tools/update-article.js.map +1 -0
  49. package/dist/tools/email-tools/send-bulk-email.d.ts +8 -0
  50. package/dist/tools/email-tools/send-bulk-email.js +17 -1
  51. package/dist/tools/email-tools/send-bulk-email.js.map +1 -1
  52. package/dist/tools/email-tools/send-email.d.ts +8 -0
  53. package/dist/tools/email-tools/send-email.js +17 -1
  54. package/dist/tools/email-tools/send-email.js.map +1 -1
  55. package/dist/tools/ghost-tools/create-post.d.ts +36 -0
  56. package/dist/tools/ghost-tools/create-post.js +51 -0
  57. package/dist/tools/ghost-tools/create-post.js.map +1 -0
  58. package/dist/tools/ghost-tools/delete-post.d.ts +18 -0
  59. package/dist/tools/ghost-tools/delete-post.js +28 -0
  60. package/dist/tools/ghost-tools/delete-post.js.map +1 -0
  61. package/dist/tools/ghost-tools/get-posts.d.ts +30 -0
  62. package/dist/tools/ghost-tools/get-posts.js +51 -0
  63. package/dist/tools/ghost-tools/get-posts.js.map +1 -0
  64. package/dist/tools/ghost-tools/update-post.d.ts +36 -0
  65. package/dist/tools/ghost-tools/update-post.js +58 -0
  66. package/dist/tools/ghost-tools/update-post.js.map +1 -0
  67. package/dist/tools/hashnode-tools/create-post.d.ts +34 -0
  68. package/dist/tools/hashnode-tools/create-post.js +46 -0
  69. package/dist/tools/hashnode-tools/create-post.js.map +1 -0
  70. package/dist/tools/hashnode-tools/get-posts.d.ts +18 -0
  71. package/dist/tools/hashnode-tools/get-posts.js +48 -0
  72. package/dist/tools/hashnode-tools/get-posts.js.map +1 -0
  73. package/dist/tools/hashnode-tools/get-publication.d.ts +16 -0
  74. package/dist/tools/hashnode-tools/get-publication.js +36 -0
  75. package/dist/tools/hashnode-tools/get-publication.js.map +1 -0
  76. package/dist/tools/tumblr-tools/create-post.d.ts +34 -0
  77. package/dist/tools/tumblr-tools/create-post.js +45 -0
  78. package/dist/tools/tumblr-tools/create-post.js.map +1 -0
  79. package/dist/tools/tumblr-tools/delete-post.d.ts +18 -0
  80. package/dist/tools/tumblr-tools/delete-post.js +28 -0
  81. package/dist/tools/tumblr-tools/delete-post.js.map +1 -0
  82. package/dist/tools/tumblr-tools/get-blog-info.d.ts +16 -0
  83. package/dist/tools/tumblr-tools/get-blog-info.js +38 -0
  84. package/dist/tools/tumblr-tools/get-blog-info.js.map +1 -0
  85. package/dist/tools/tumblr-tools/get-posts.d.ts +40 -0
  86. package/dist/tools/tumblr-tools/get-posts.js +53 -0
  87. package/dist/tools/tumblr-tools/get-posts.js.map +1 -0
  88. package/dist/tools/twitch-tools/get-channel-info.d.ts +18 -0
  89. package/dist/tools/twitch-tools/get-channel-info.js +38 -0
  90. package/dist/tools/twitch-tools/get-channel-info.js.map +1 -0
  91. package/dist/tools/twitch-tools/get-streams.d.ts +22 -0
  92. package/dist/tools/twitch-tools/get-streams.js +50 -0
  93. package/dist/tools/twitch-tools/get-streams.js.map +1 -0
  94. package/dist/tools/twitch-tools/get-user.d.ts +18 -0
  95. package/dist/tools/twitch-tools/get-user.js +39 -0
  96. package/dist/tools/twitch-tools/get-user.js.map +1 -0
  97. package/dist/tools/twitch-tools/search-channels.d.ts +22 -0
  98. package/dist/tools/twitch-tools/search-channels.js +41 -0
  99. package/dist/tools/twitch-tools/search-channels.js.map +1 -0
  100. package/dist/tools/twitch-tools/send-chat-message.d.ts +24 -0
  101. package/dist/tools/twitch-tools/send-chat-message.js +39 -0
  102. package/dist/tools/twitch-tools/send-chat-message.js.map +1 -0
  103. package/package.json +1 -1
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { HashnodeService, getHashnodeService } from "../../services/hashnode-service.js";
4
+ const params = z.object({
5
+ first: z.number().int().min(1).max(50).optional().default(10).describe("Number of posts to fetch (default: 10, max: 50)"),
6
+ publicationId: z.string().optional().describe("Hashnode publication ID (overrides HASHNODE_PUBLICATION_ID env var)"),
7
+ accessToken: z.string().optional().describe("Hashnode Personal Access Token (overrides HASHNODE_ACCESS_TOKEN env var)"),
8
+ });
9
+ export const getPostsTool = {
10
+ name: "HASHNODE_GET_POSTS",
11
+ description: "Get recent posts from a Hashnode publication.",
12
+ parameters: params,
13
+ execute: async (p) => {
14
+ try {
15
+ const service = p.accessToken
16
+ ? new HashnodeService({ accessToken: p.accessToken, publicationId: p.publicationId })
17
+ : getHashnodeService();
18
+ const pub = await service.getPosts(p.publicationId, p.first ?? 10);
19
+ if (!pub)
20
+ return "Publication not found.";
21
+ const posts = pub.posts?.edges ?? [];
22
+ if (!posts.length)
23
+ return `No posts found in publication "${pub.title ?? pub.id}".`;
24
+ return [
25
+ `Publication: ${pub.title ?? pub.id}`,
26
+ ...(pub.url ? [`URL: ${pub.url}`] : []),
27
+ ``,
28
+ ...posts.map(({ node: post }, i) => {
29
+ const tags = post.tags?.map((t) => t.name).join(", ") ?? "";
30
+ return [
31
+ `${i + 1}. ${post.title}`,
32
+ ` ID: ${post.id}`,
33
+ ...(post.url ? [` URL: ${post.url}`] : []),
34
+ ...(post.publishedAt ? [` Published: ${post.publishedAt}`] : []),
35
+ ...(tags ? [` Tags: ${tags}`] : []),
36
+ ...(post.reactionCount != null ? [` Reactions: ${post.reactionCount}`] : []),
37
+ ].join("\n");
38
+ }),
39
+ ].join("\n");
40
+ }
41
+ catch (error) {
42
+ if (error instanceof CredentialsError)
43
+ return `Error: ${error.message}`;
44
+ return `Error fetching Hashnode posts: ${error instanceof Error ? error.message : "Unknown error"}`;
45
+ }
46
+ },
47
+ };
48
+ //# sourceMappingURL=get-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-posts.js","sourceRoot":"","sources":["../../../src/tools/hashnode-tools/get-posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ publicationId: z.ZodOptional<z.ZodString>;
4
+ accessToken: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ type Params = z.infer<typeof params>;
7
+ export declare const getPublicationTool: {
8
+ readonly name: "HASHNODE_GET_PUBLICATION";
9
+ readonly description: "Get information about a Hashnode publication, including its ID, title, and URL.";
10
+ readonly parameters: z.ZodObject<{
11
+ publicationId: z.ZodOptional<z.ZodString>;
12
+ accessToken: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ readonly execute: (p: Params) => Promise<string>;
15
+ };
16
+ export {};
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { HashnodeService, getHashnodeService } from "../../services/hashnode-service.js";
4
+ const params = z.object({
5
+ publicationId: z.string().optional().describe("Hashnode publication ID (overrides HASHNODE_PUBLICATION_ID env var)"),
6
+ accessToken: z.string().optional().describe("Hashnode Personal Access Token (overrides HASHNODE_ACCESS_TOKEN env var)"),
7
+ });
8
+ export const getPublicationTool = {
9
+ name: "HASHNODE_GET_PUBLICATION",
10
+ description: "Get information about a Hashnode publication, including its ID, title, and URL.",
11
+ parameters: params,
12
+ execute: async (p) => {
13
+ try {
14
+ const service = p.accessToken
15
+ ? new HashnodeService({ accessToken: p.accessToken, publicationId: p.publicationId })
16
+ : getHashnodeService();
17
+ const pub = await service.getPublication(p.publicationId);
18
+ if (!pub)
19
+ return "Publication not found.";
20
+ return [
21
+ `Hashnode Publication`,
22
+ ``,
23
+ `ID: ${pub.id}`,
24
+ ...(pub.title ? [`Title: ${pub.title}`] : []),
25
+ ...(pub.displayTitle ? [`Display Title: ${pub.displayTitle}`] : []),
26
+ ...(pub.url ? [`URL: ${pub.url}`] : []),
27
+ ].join("\n");
28
+ }
29
+ catch (error) {
30
+ if (error instanceof CredentialsError)
31
+ return `Error: ${error.message}`;
32
+ return `Error fetching Hashnode publication: ${error instanceof Error ? error.message : "Unknown error"}`;
33
+ }
34
+ },
35
+ };
36
+ //# sourceMappingURL=get-publication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-publication.js","sourceRoot":"","sources":["../../../src/tools/hashnode-tools/get-publication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;IACpH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;CACvH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,iFAAiF;IAC9F,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;gBACrF,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAExB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG;gBAAE,OAAO,wBAAwB,CAAC;YAE1C,OAAO;gBACN,sBAAsB;gBACtB,EAAE;gBACF,OAAO,GAAG,CAAC,EAAE,EAAE;gBACf,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC3G,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ text: z.ZodString;
4
+ title: z.ZodOptional<z.ZodString>;
5
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ state: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
7
+ private: "private";
8
+ draft: "draft";
9
+ published: "published";
10
+ queue: "queue";
11
+ }>>>;
12
+ blogIdentifier: z.ZodOptional<z.ZodString>;
13
+ accessToken: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ type Params = z.infer<typeof params>;
16
+ export declare const createPostTool: {
17
+ readonly name: "TUMBLR_CREATE_POST";
18
+ readonly description: "Create a text post on Tumblr using the Neue Post Format (NPF).";
19
+ readonly parameters: z.ZodObject<{
20
+ text: z.ZodString;
21
+ title: z.ZodOptional<z.ZodString>;
22
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ state: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
24
+ private: "private";
25
+ draft: "draft";
26
+ published: "published";
27
+ queue: "queue";
28
+ }>>>;
29
+ blogIdentifier: z.ZodOptional<z.ZodString>;
30
+ accessToken: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ readonly execute: (p: Params) => Promise<string>;
33
+ };
34
+ export {};
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TumblrService, getTumblrService } from "../../services/tumblr-service.js";
4
+ const params = z.object({
5
+ text: z.string().min(1).describe("Post text content (Markdown supported)"),
6
+ title: z.string().optional().describe("Optional heading/title for the post"),
7
+ tags: z.array(z.string()).optional().describe("Tags for the post"),
8
+ state: z
9
+ .enum(["published", "draft", "queue", "private"])
10
+ .optional()
11
+ .default("published")
12
+ .describe("Post state (default: published)"),
13
+ blogIdentifier: z.string().optional().describe("Blog name or URL (overrides TUMBLR_BLOG_IDENTIFIER env var)"),
14
+ accessToken: z.string().optional().describe("Tumblr OAuth token (overrides TUMBLR_ACCESS_TOKEN env var)"),
15
+ });
16
+ export const createPostTool = {
17
+ name: "TUMBLR_CREATE_POST",
18
+ description: "Create a text post on Tumblr using the Neue Post Format (NPF).",
19
+ parameters: params,
20
+ execute: async (p) => {
21
+ try {
22
+ const service = p.accessToken
23
+ ? new TumblrService({ accessToken: p.accessToken, blogIdentifier: p.blogIdentifier })
24
+ : getTumblrService();
25
+ const content = [
26
+ { type: "text", text: p.text },
27
+ ];
28
+ const result = await service.createPost(p.blogIdentifier, content, p.tags ?? [], p.state ?? "published", p.title);
29
+ const post = result.response;
30
+ return [
31
+ `Tumblr post ${p.state === "draft" ? "saved as draft" : p.state === "queue" ? "added to queue" : "published"}!`,
32
+ ``,
33
+ `ID: ${post.id_string ?? post.id}`,
34
+ ...(post.state ? [`State: ${post.state}`] : []),
35
+ ...(post.post_url ? [`URL: ${post.post_url}`] : []),
36
+ ].join("\n");
37
+ }
38
+ catch (error) {
39
+ if (error instanceof CredentialsError)
40
+ return `Error: ${error.message}`;
41
+ return `Error creating Tumblr post: ${error instanceof Error ? error.message : "Unknown error"}`;
42
+ }
43
+ },
44
+ };
45
+ //# sourceMappingURL=create-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-post.js","sourceRoot":"","sources":["../../../src/tools/tumblr-tools/create-post.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ postId: z.ZodString;
4
+ blogIdentifier: z.ZodOptional<z.ZodString>;
5
+ accessToken: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ type Params = z.infer<typeof params>;
8
+ export declare const deletePostTool: {
9
+ readonly name: "TUMBLR_DELETE_POST";
10
+ readonly description: "Permanently delete a Tumblr post by ID.";
11
+ readonly parameters: z.ZodObject<{
12
+ postId: z.ZodString;
13
+ blogIdentifier: z.ZodOptional<z.ZodString>;
14
+ accessToken: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ readonly execute: (p: Params) => Promise<string>;
17
+ };
18
+ export {};
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TumblrService, getTumblrService } from "../../services/tumblr-service.js";
4
+ const params = z.object({
5
+ postId: z.string().describe("Post ID to delete (from TUMBLR_GET_POSTS)"),
6
+ blogIdentifier: z.string().optional().describe("Blog name or URL (overrides TUMBLR_BLOG_IDENTIFIER env var)"),
7
+ accessToken: z.string().optional().describe("Tumblr OAuth token (overrides TUMBLR_ACCESS_TOKEN env var)"),
8
+ });
9
+ export const deletePostTool = {
10
+ name: "TUMBLR_DELETE_POST",
11
+ description: "Permanently delete a Tumblr post by ID.",
12
+ parameters: params,
13
+ execute: async (p) => {
14
+ try {
15
+ const service = p.accessToken
16
+ ? new TumblrService({ accessToken: p.accessToken, blogIdentifier: p.blogIdentifier })
17
+ : getTumblrService();
18
+ await service.deletePost(p.postId, p.blogIdentifier);
19
+ return `Tumblr post ${p.postId} deleted successfully.`;
20
+ }
21
+ catch (error) {
22
+ if (error instanceof CredentialsError)
23
+ return `Error: ${error.message}`;
24
+ return `Error deleting Tumblr post: ${error instanceof Error ? error.message : "Unknown error"}`;
25
+ }
26
+ },
27
+ };
28
+ //# sourceMappingURL=delete-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-post.js","sourceRoot":"","sources":["../../../src/tools/tumblr-tools/delete-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEnF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;CACzG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,yCAAyC;IACtD,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;gBACrF,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAEtB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;YACrD,OAAO,eAAe,CAAC,CAAC,MAAM,wBAAwB,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAClG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ blogIdentifier: z.ZodOptional<z.ZodString>;
4
+ accessToken: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ type Params = z.infer<typeof params>;
7
+ export declare const getBlogInfoTool: {
8
+ readonly name: "TUMBLR_GET_BLOG_INFO";
9
+ readonly description: "Get info about a Tumblr blog including title, description, post count, and follower count.";
10
+ readonly parameters: z.ZodObject<{
11
+ blogIdentifier: z.ZodOptional<z.ZodString>;
12
+ accessToken: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ readonly execute: (p: Params) => Promise<string>;
15
+ };
16
+ export {};
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TumblrService, getTumblrService } from "../../services/tumblr-service.js";
4
+ const params = z.object({
5
+ blogIdentifier: z.string().optional().describe("Blog name or URL (overrides TUMBLR_BLOG_IDENTIFIER env var)"),
6
+ accessToken: z.string().optional().describe("Tumblr OAuth token (overrides TUMBLR_ACCESS_TOKEN env var)"),
7
+ });
8
+ export const getBlogInfoTool = {
9
+ name: "TUMBLR_GET_BLOG_INFO",
10
+ description: "Get info about a Tumblr blog including title, description, post count, and follower count.",
11
+ parameters: params,
12
+ execute: async (p) => {
13
+ try {
14
+ const service = p.accessToken
15
+ ? new TumblrService({ accessToken: p.accessToken, blogIdentifier: p.blogIdentifier })
16
+ : getTumblrService();
17
+ const result = await service.getBlogInfo(p.blogIdentifier);
18
+ const blog = result.response.blog;
19
+ const updated = blog.updated ? new Date(blog.updated * 1000).toISOString().split("T")[0] : null;
20
+ return [
21
+ `Tumblr Blog: ${blog.name}`,
22
+ ``,
23
+ ...(blog.title ? [`Title: ${blog.title}`] : []),
24
+ ...(blog.description ? [`Description: ${blog.description}`] : []),
25
+ ...(blog.url ? [`URL: ${blog.url}`] : []),
26
+ ...(blog.posts != null ? [`Posts: ${blog.posts}`] : []),
27
+ ...(blog.followers != null ? [`Followers: ${blog.followers}`] : []),
28
+ ...(updated ? [`Last Updated: ${updated}`] : []),
29
+ ].join("\n");
30
+ }
31
+ catch (error) {
32
+ if (error instanceof CredentialsError)
33
+ return `Error: ${error.message}`;
34
+ return `Error fetching Tumblr blog info: ${error instanceof Error ? error.message : "Unknown error"}`;
35
+ }
36
+ },
37
+ };
38
+ //# sourceMappingURL=get-blog-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-blog-info.js","sourceRoot":"","sources":["../../../src/tools/tumblr-tools/get-blog-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEnF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;CACzG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,4FAA4F;IACzG,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;gBACrF,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAEtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEhG,OAAO;gBACN,gBAAgB,IAAI,CAAC,IAAI,EAAE;gBAC3B,EAAE;gBACF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACvG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
4
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
+ type: z.ZodOptional<z.ZodEnum<{
6
+ text: "text";
7
+ link: "link";
8
+ chat: "chat";
9
+ photo: "photo";
10
+ audio: "audio";
11
+ video: "video";
12
+ quote: "quote";
13
+ answer: "answer";
14
+ }>>;
15
+ blogIdentifier: z.ZodOptional<z.ZodString>;
16
+ accessToken: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ type Params = z.infer<typeof params>;
19
+ export declare const getPostsTool: {
20
+ readonly name: "TUMBLR_GET_POSTS";
21
+ readonly description: "Get posts from a Tumblr blog.";
22
+ readonly parameters: z.ZodObject<{
23
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
24
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
25
+ type: z.ZodOptional<z.ZodEnum<{
26
+ text: "text";
27
+ link: "link";
28
+ chat: "chat";
29
+ photo: "photo";
30
+ audio: "audio";
31
+ video: "video";
32
+ quote: "quote";
33
+ answer: "answer";
34
+ }>>;
35
+ blogIdentifier: z.ZodOptional<z.ZodString>;
36
+ accessToken: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strip>;
38
+ readonly execute: (p: Params) => Promise<string>;
39
+ };
40
+ export {};
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TumblrService, getTumblrService } from "../../services/tumblr-service.js";
4
+ const params = z.object({
5
+ offset: z.number().int().min(0).optional().default(0).describe("Pagination offset (default: 0)"),
6
+ limit: z.number().int().min(1).max(50).optional().default(10).describe("Number of posts (default: 10, max: 50)"),
7
+ type: z
8
+ .enum(["text", "quote", "link", "answer", "video", "audio", "photo", "chat"])
9
+ .optional()
10
+ .describe("Filter by post type"),
11
+ blogIdentifier: z.string().optional().describe("Blog name or URL (overrides TUMBLR_BLOG_IDENTIFIER env var)"),
12
+ accessToken: z.string().optional().describe("Tumblr OAuth token (overrides TUMBLR_ACCESS_TOKEN env var)"),
13
+ });
14
+ export const getPostsTool = {
15
+ name: "TUMBLR_GET_POSTS",
16
+ description: "Get posts from a Tumblr blog.",
17
+ parameters: params,
18
+ execute: async (p) => {
19
+ try {
20
+ const service = p.accessToken
21
+ ? new TumblrService({ accessToken: p.accessToken, blogIdentifier: p.blogIdentifier })
22
+ : getTumblrService();
23
+ const result = await service.getPosts(p.blogIdentifier, p.type, p.offset ?? 0, p.limit ?? 10);
24
+ const posts = result.response.posts;
25
+ if (!posts.length)
26
+ return "No posts found.";
27
+ const total = result.response.total_posts != null ? ` (${result.response.total_posts} total)` : "";
28
+ return [
29
+ `Tumblr Posts${total}:`,
30
+ ``,
31
+ ...posts.map((post, i) => {
32
+ const id = post.id_string ?? String(post.id);
33
+ const tags = post.tags?.join(", ") ?? "";
34
+ const preview = post.summary ?? post.title ?? post.body?.slice(0, 80) ?? "";
35
+ return [
36
+ `${i + 1}. [${post.type ?? "post"}] ${preview || id}`,
37
+ ` ID: ${id}`,
38
+ ...(post.post_url ? [` URL: ${post.post_url}`] : []),
39
+ ...(post.date ? [` Date: ${post.date}`] : []),
40
+ ...(tags ? [` Tags: ${tags}`] : []),
41
+ ...(post.note_count != null ? [` Notes: ${post.note_count}`] : []),
42
+ ].join("\n");
43
+ }),
44
+ ].join("\n");
45
+ }
46
+ catch (error) {
47
+ if (error instanceof CredentialsError)
48
+ return `Error: ${error.message}`;
49
+ return `Error fetching Tumblr posts: ${error instanceof Error ? error.message : "Unknown error"}`;
50
+ }
51
+ },
52
+ };
53
+ //# sourceMappingURL=get-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-posts.js","sourceRoot":"","sources":["../../../src/tools/tumblr-tools/get-posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ broadcasterId: z.ZodString;
4
+ clientId: z.ZodOptional<z.ZodString>;
5
+ clientSecret: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ type Params = z.infer<typeof params>;
8
+ export declare const getChannelInfoTool: {
9
+ readonly name: "TWITCH_GET_CHANNEL_INFO";
10
+ readonly description: "Get detailed channel information for a Twitch broadcaster, including current game and stream title.";
11
+ readonly parameters: z.ZodObject<{
12
+ broadcasterId: z.ZodString;
13
+ clientId: z.ZodOptional<z.ZodString>;
14
+ clientSecret: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ readonly execute: (p: Params) => Promise<string>;
17
+ };
18
+ export {};
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TwitchService, getTwitchService } from "../../services/twitch-service.js";
4
+ const params = z.object({
5
+ broadcasterId: z.string().describe("Twitch broadcaster/user ID (get it via TWITCH_GET_USER)"),
6
+ clientId: z.string().optional().describe("Twitch client ID (overrides TWITCH_CLIENT_ID env var)"),
7
+ clientSecret: z.string().optional().describe("Twitch client secret (overrides TWITCH_CLIENT_SECRET env var)"),
8
+ });
9
+ export const getChannelInfoTool = {
10
+ name: "TWITCH_GET_CHANNEL_INFO",
11
+ description: "Get detailed channel information for a Twitch broadcaster, including current game and stream title.",
12
+ parameters: params,
13
+ execute: async (p) => {
14
+ try {
15
+ const service = p.clientId && p.clientSecret
16
+ ? new TwitchService({ clientId: p.clientId, clientSecret: p.clientSecret })
17
+ : getTwitchService();
18
+ const result = await service.getChannelInfo(p.broadcasterId);
19
+ const channel = result.data[0];
20
+ if (!channel)
21
+ return `No channel found for broadcaster ID "${p.broadcasterId}".`;
22
+ return [
23
+ `Twitch Channel: ${channel.broadcaster_name} (@${channel.broadcaster_login})`,
24
+ ``,
25
+ `Broadcaster ID: ${channel.broadcaster_id}`,
26
+ ...(channel.title ? [`Stream Title: ${channel.title}`] : []),
27
+ ...(channel.game_name ? [`Category: ${channel.game_name}`] : []),
28
+ ...(channel.tags?.length ? [`Tags: ${channel.tags.join(", ")}`] : []),
29
+ ].join("\n");
30
+ }
31
+ catch (error) {
32
+ if (error instanceof CredentialsError)
33
+ return `Error: ${error.message}`;
34
+ return `Error fetching Twitch channel info: ${error instanceof Error ? error.message : "Unknown error"}`;
35
+ }
36
+ },
37
+ };
38
+ //# sourceMappingURL=get-channel-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-channel-info.js","sourceRoot":"","sources":["../../../src/tools/twitch-tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEnF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAC7F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACjG,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;CAC7G,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,qGAAqG;IAClH,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GACZ,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,YAAY;gBAC3B,CAAC,CAAC,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;gBAC3E,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO;gBAAE,OAAO,wCAAwC,CAAC,CAAC,aAAa,IAAI,CAAC;YAEjF,OAAO;gBACN,mBAAmB,OAAO,CAAC,gBAAgB,MAAM,OAAO,CAAC,iBAAiB,GAAG;gBAC7E,EAAE;gBACF,mBAAmB,OAAO,CAAC,cAAc,EAAE;gBAC3C,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC1G,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ userLogins: z.ZodOptional<z.ZodArray<z.ZodString>>;
4
+ gameId: z.ZodOptional<z.ZodString>;
5
+ first: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ clientId: z.ZodOptional<z.ZodString>;
7
+ clientSecret: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>;
9
+ type Params = z.infer<typeof params>;
10
+ export declare const getStreamsTool: {
11
+ readonly name: "TWITCH_GET_STREAMS";
12
+ readonly description: "Get currently live Twitch streams, optionally filtered by streamer usernames or game category.";
13
+ readonly parameters: z.ZodObject<{
14
+ userLogins: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ gameId: z.ZodOptional<z.ZodString>;
16
+ first: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
+ clientId: z.ZodOptional<z.ZodString>;
18
+ clientSecret: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strip>;
20
+ readonly execute: (p: Params) => Promise<string>;
21
+ };
22
+ export {};
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TwitchService, getTwitchService } from "../../services/twitch-service.js";
4
+ const params = z.object({
5
+ userLogins: z
6
+ .array(z.string())
7
+ .optional()
8
+ .describe("Filter by specific streamer usernames (up to 100)"),
9
+ gameId: z.string().optional().describe("Filter by Twitch game/category ID"),
10
+ first: z.number().int().min(1).max(100).optional().default(10).describe("Number of streams (default: 10, max: 100)"),
11
+ clientId: z.string().optional().describe("Twitch client ID (overrides TWITCH_CLIENT_ID env var)"),
12
+ clientSecret: z.string().optional().describe("Twitch client secret (overrides TWITCH_CLIENT_SECRET env var)"),
13
+ });
14
+ export const getStreamsTool = {
15
+ name: "TWITCH_GET_STREAMS",
16
+ description: "Get currently live Twitch streams, optionally filtered by streamer usernames or game category.",
17
+ parameters: params,
18
+ execute: async (p) => {
19
+ try {
20
+ const service = p.clientId && p.clientSecret
21
+ ? new TwitchService({ clientId: p.clientId, clientSecret: p.clientSecret })
22
+ : getTwitchService();
23
+ const result = await service.getStreams({
24
+ userLogins: p.userLogins,
25
+ gameId: p.gameId,
26
+ first: p.first ?? 10,
27
+ });
28
+ if (!result.data.length)
29
+ return "No live streams found.";
30
+ return [
31
+ `Live Twitch Streams (${result.data.length}):`,
32
+ ``,
33
+ ...result.data.map((s, i) => [
34
+ `${i + 1}. ${s.user_name} (@${s.user_login})`,
35
+ ...(s.title ? [` "${s.title}"`] : []),
36
+ ...(s.game_name ? [` Game: ${s.game_name}`] : []),
37
+ ...(s.viewer_count != null ? [` Viewers: ${s.viewer_count.toLocaleString()}`] : []),
38
+ ...(s.started_at ? [` Started: ${s.started_at}`] : []),
39
+ ...(s.language ? [` Language: ${s.language}`] : []),
40
+ ].join("\n")),
41
+ ].join("\n");
42
+ }
43
+ catch (error) {
44
+ if (error instanceof CredentialsError)
45
+ return `Error: ${error.message}`;
46
+ return `Error fetching Twitch streams: ${error instanceof Error ? error.message : "Unknown error"}`;
47
+ }
48
+ },
49
+ };
50
+ //# sourceMappingURL=get-streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-streams.js","sourceRoot":"","sources":["../../../src/tools/twitch-tools/get-streams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ declare const params: z.ZodObject<{
3
+ login: z.ZodOptional<z.ZodString>;
4
+ clientId: z.ZodOptional<z.ZodString>;
5
+ clientSecret: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ type Params = z.infer<typeof params>;
8
+ export declare const getUserTool: {
9
+ readonly name: "TWITCH_GET_USER";
10
+ readonly description: "Get Twitch user info by username, including their bio, follower count, and broadcaster type.";
11
+ readonly parameters: z.ZodObject<{
12
+ login: z.ZodOptional<z.ZodString>;
13
+ clientId: z.ZodOptional<z.ZodString>;
14
+ clientSecret: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ readonly execute: (p: Params) => Promise<string>;
17
+ };
18
+ export {};
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { TwitchService, getTwitchService } from "../../services/twitch-service.js";
4
+ const params = z.object({
5
+ login: z.string().optional().describe("Twitch username to look up (omit to get the authenticated user)"),
6
+ clientId: z.string().optional().describe("Twitch client ID (overrides TWITCH_CLIENT_ID env var)"),
7
+ clientSecret: z.string().optional().describe("Twitch client secret (overrides TWITCH_CLIENT_SECRET env var)"),
8
+ });
9
+ export const getUserTool = {
10
+ name: "TWITCH_GET_USER",
11
+ description: "Get Twitch user info by username, including their bio, follower count, and broadcaster type.",
12
+ parameters: params,
13
+ execute: async (p) => {
14
+ try {
15
+ const service = p.clientId && p.clientSecret
16
+ ? new TwitchService({ clientId: p.clientId, clientSecret: p.clientSecret })
17
+ : getTwitchService();
18
+ const result = await service.getUser(p.login);
19
+ const user = result.data[0];
20
+ if (!user)
21
+ return `No Twitch user found${p.login ? ` for "${p.login}"` : ""}.`;
22
+ return [
23
+ `Twitch User: ${user.display_name} (@${user.login})`,
24
+ ``,
25
+ `ID: ${user.id}`,
26
+ ...(user.broadcaster_type ? [`Type: ${user.broadcaster_type || "regular"}`] : []),
27
+ ...(user.description ? [`Bio: ${user.description}`] : []),
28
+ ...(user.view_count != null ? [`Total Views: ${user.view_count.toLocaleString()}`] : []),
29
+ ...(user.created_at ? [`Joined: ${user.created_at}`] : []),
30
+ ].join("\n");
31
+ }
32
+ catch (error) {
33
+ if (error instanceof CredentialsError)
34
+ return `Error: ${error.message}`;
35
+ return `Error fetching Twitch user: ${error instanceof Error ? error.message : "Unknown error"}`;
36
+ }
37
+ },
38
+ };
39
+ //# sourceMappingURL=get-user.js.map