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.
- package/README.md +129 -3
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.js +34 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/services/beehiiv-service.d.ts +69 -0
- package/dist/services/beehiiv-service.js +97 -0
- package/dist/services/beehiiv-service.js.map +1 -0
- package/dist/services/devto-service.d.ts +99 -0
- package/dist/services/devto-service.js +92 -0
- package/dist/services/devto-service.js.map +1 -0
- package/dist/services/email-service.d.ts +5 -1
- package/dist/services/email-service.js +76 -4
- package/dist/services/email-service.js.map +1 -1
- package/dist/services/ghost-service.d.ts +80 -0
- package/dist/services/ghost-service.js +123 -0
- package/dist/services/ghost-service.js.map +1 -0
- package/dist/services/hashnode-service.d.ts +86 -0
- package/dist/services/hashnode-service.js +161 -0
- package/dist/services/hashnode-service.js.map +1 -0
- package/dist/services/tumblr-service.d.ts +73 -0
- package/dist/services/tumblr-service.js +113 -0
- package/dist/services/tumblr-service.js.map +1 -0
- package/dist/services/twitch-service.d.ts +85 -0
- package/dist/services/twitch-service.js +135 -0
- package/dist/services/twitch-service.js.map +1 -0
- package/dist/tools/beehiiv-tools/create-post.d.ts +40 -0
- package/dist/tools/beehiiv-tools/create-post.js +49 -0
- package/dist/tools/beehiiv-tools/create-post.js.map +1 -0
- package/dist/tools/beehiiv-tools/get-posts.d.ts +20 -0
- package/dist/tools/beehiiv-tools/get-posts.js +51 -0
- package/dist/tools/beehiiv-tools/get-posts.js.map +1 -0
- package/dist/tools/beehiiv-tools/get-subscribers.d.ts +20 -0
- package/dist/tools/beehiiv-tools/get-subscribers.js +48 -0
- package/dist/tools/beehiiv-tools/get-subscribers.js.map +1 -0
- package/dist/tools/devto-tools/create-article.d.ts +30 -0
- package/dist/tools/devto-tools/create-article.js +47 -0
- package/dist/tools/devto-tools/create-article.js.map +1 -0
- package/dist/tools/devto-tools/get-article.d.ts +16 -0
- package/dist/tools/devto-tools/get-article.js +40 -0
- package/dist/tools/devto-tools/get-article.js.map +1 -0
- package/dist/tools/devto-tools/get-articles.d.ts +18 -0
- package/dist/tools/devto-tools/get-articles.js +41 -0
- package/dist/tools/devto-tools/get-articles.js.map +1 -0
- package/dist/tools/devto-tools/update-article.d.ts +28 -0
- package/dist/tools/devto-tools/update-article.js +51 -0
- package/dist/tools/devto-tools/update-article.js.map +1 -0
- package/dist/tools/email-tools/send-bulk-email.d.ts +8 -0
- package/dist/tools/email-tools/send-bulk-email.js +17 -1
- package/dist/tools/email-tools/send-bulk-email.js.map +1 -1
- package/dist/tools/email-tools/send-email.d.ts +8 -0
- package/dist/tools/email-tools/send-email.js +17 -1
- package/dist/tools/email-tools/send-email.js.map +1 -1
- package/dist/tools/ghost-tools/create-post.d.ts +36 -0
- package/dist/tools/ghost-tools/create-post.js +51 -0
- package/dist/tools/ghost-tools/create-post.js.map +1 -0
- package/dist/tools/ghost-tools/delete-post.d.ts +18 -0
- package/dist/tools/ghost-tools/delete-post.js +28 -0
- package/dist/tools/ghost-tools/delete-post.js.map +1 -0
- package/dist/tools/ghost-tools/get-posts.d.ts +30 -0
- package/dist/tools/ghost-tools/get-posts.js +51 -0
- package/dist/tools/ghost-tools/get-posts.js.map +1 -0
- package/dist/tools/ghost-tools/update-post.d.ts +36 -0
- package/dist/tools/ghost-tools/update-post.js +58 -0
- package/dist/tools/ghost-tools/update-post.js.map +1 -0
- package/dist/tools/hashnode-tools/create-post.d.ts +34 -0
- package/dist/tools/hashnode-tools/create-post.js +46 -0
- package/dist/tools/hashnode-tools/create-post.js.map +1 -0
- package/dist/tools/hashnode-tools/get-posts.d.ts +18 -0
- package/dist/tools/hashnode-tools/get-posts.js +48 -0
- package/dist/tools/hashnode-tools/get-posts.js.map +1 -0
- package/dist/tools/hashnode-tools/get-publication.d.ts +16 -0
- package/dist/tools/hashnode-tools/get-publication.js +36 -0
- package/dist/tools/hashnode-tools/get-publication.js.map +1 -0
- package/dist/tools/tumblr-tools/create-post.d.ts +34 -0
- package/dist/tools/tumblr-tools/create-post.js +45 -0
- package/dist/tools/tumblr-tools/create-post.js.map +1 -0
- package/dist/tools/tumblr-tools/delete-post.d.ts +18 -0
- package/dist/tools/tumblr-tools/delete-post.js +28 -0
- package/dist/tools/tumblr-tools/delete-post.js.map +1 -0
- package/dist/tools/tumblr-tools/get-blog-info.d.ts +16 -0
- package/dist/tools/tumblr-tools/get-blog-info.js +38 -0
- package/dist/tools/tumblr-tools/get-blog-info.js.map +1 -0
- package/dist/tools/tumblr-tools/get-posts.d.ts +40 -0
- package/dist/tools/tumblr-tools/get-posts.js +53 -0
- package/dist/tools/tumblr-tools/get-posts.js.map +1 -0
- package/dist/tools/twitch-tools/get-channel-info.d.ts +18 -0
- package/dist/tools/twitch-tools/get-channel-info.js +38 -0
- package/dist/tools/twitch-tools/get-channel-info.js.map +1 -0
- package/dist/tools/twitch-tools/get-streams.d.ts +22 -0
- package/dist/tools/twitch-tools/get-streams.js +50 -0
- package/dist/tools/twitch-tools/get-streams.js.map +1 -0
- package/dist/tools/twitch-tools/get-user.d.ts +18 -0
- package/dist/tools/twitch-tools/get-user.js +39 -0
- package/dist/tools/twitch-tools/get-user.js.map +1 -0
- package/dist/tools/twitch-tools/search-channels.d.ts +22 -0
- package/dist/tools/twitch-tools/search-channels.js +41 -0
- package/dist/tools/twitch-tools/search-channels.js.map +1 -0
- package/dist/tools/twitch-tools/send-chat-message.d.ts +24 -0
- package/dist/tools/twitch-tools/send-chat-message.js +39 -0
- package/dist/tools/twitch-tools/send-chat-message.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ import { EmailService, getEmailService, } from "../../services/email-service.js"
|
|
|
4
4
|
const sendBulkEmailParams = z.object({
|
|
5
5
|
// ── Inline credentials (all optional — omit to use env var config) ──────
|
|
6
6
|
mailer: z
|
|
7
|
-
.enum(["smtp", "sendgrid", "mailgun"])
|
|
7
|
+
.enum(["smtp", "sendgrid", "mailgun", "ses"])
|
|
8
8
|
.optional()
|
|
9
9
|
.describe("Mail driver. Required when not configured via env vars (MAIL_MAILER)."),
|
|
10
10
|
fromAddress: z
|
|
@@ -48,6 +48,19 @@ const sendBulkEmailParams = z.object({
|
|
|
48
48
|
.string()
|
|
49
49
|
.optional()
|
|
50
50
|
.describe("Mailgun sending domain. Required when mailer=mailgun."),
|
|
51
|
+
// Amazon SES
|
|
52
|
+
sesAccessKeyId: z
|
|
53
|
+
.string()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("AWS IAM Access Key ID. Required when mailer=ses."),
|
|
56
|
+
sesSecretAccessKey: z
|
|
57
|
+
.string()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("AWS IAM Secret Access Key. Required when mailer=ses."),
|
|
60
|
+
sesRegion: z
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("AWS region for SES (default us-east-1). Used when mailer=ses."),
|
|
51
64
|
// ── Message ──────────────────────────────────────────────────────────────
|
|
52
65
|
recipients: z
|
|
53
66
|
.array(z.string().email())
|
|
@@ -79,6 +92,9 @@ export const sendBulkEmailTool = {
|
|
|
79
92
|
sendgridApiKey: params.sendgridApiKey,
|
|
80
93
|
mailgunApiKey: params.mailgunApiKey,
|
|
81
94
|
mailgunDomain: params.mailgunDomain,
|
|
95
|
+
sesAccessKeyId: params.sesAccessKeyId,
|
|
96
|
+
sesSecretAccessKey: params.sesSecretAccessKey,
|
|
97
|
+
sesRegion: params.sesRegion,
|
|
82
98
|
})
|
|
83
99
|
: getEmailService();
|
|
84
100
|
await service.send(params.recipients, params.subject, params.text, params.html);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-bulk-email.js","sourceRoot":"","sources":["../../../src/tools/email-tools/send-bulk-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACN,YAAY,EACZ,eAAe,GACf,MAAM,iCAAiC,CAAC;AAEzC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,2EAA2E;IAC3E,MAAM,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"send-bulk-email.js","sourceRoot":"","sources":["../../../src/tools/email-tools/send-bulk-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ declare const sendEmailParams: z.ZodObject<{
|
|
|
4
4
|
smtp: "smtp";
|
|
5
5
|
sendgrid: "sendgrid";
|
|
6
6
|
mailgun: "mailgun";
|
|
7
|
+
ses: "ses";
|
|
7
8
|
}>>;
|
|
8
9
|
fromAddress: z.ZodOptional<z.ZodString>;
|
|
9
10
|
fromName: z.ZodOptional<z.ZodString>;
|
|
@@ -19,6 +20,9 @@ declare const sendEmailParams: z.ZodObject<{
|
|
|
19
20
|
sendgridApiKey: z.ZodOptional<z.ZodString>;
|
|
20
21
|
mailgunApiKey: z.ZodOptional<z.ZodString>;
|
|
21
22
|
mailgunDomain: z.ZodOptional<z.ZodString>;
|
|
23
|
+
sesAccessKeyId: z.ZodOptional<z.ZodString>;
|
|
24
|
+
sesSecretAccessKey: z.ZodOptional<z.ZodString>;
|
|
25
|
+
sesRegion: z.ZodOptional<z.ZodString>;
|
|
22
26
|
to: z.ZodString;
|
|
23
27
|
subject: z.ZodString;
|
|
24
28
|
text: z.ZodString;
|
|
@@ -33,6 +37,7 @@ export declare const sendEmailTool: {
|
|
|
33
37
|
smtp: "smtp";
|
|
34
38
|
sendgrid: "sendgrid";
|
|
35
39
|
mailgun: "mailgun";
|
|
40
|
+
ses: "ses";
|
|
36
41
|
}>>;
|
|
37
42
|
fromAddress: z.ZodOptional<z.ZodString>;
|
|
38
43
|
fromName: z.ZodOptional<z.ZodString>;
|
|
@@ -48,6 +53,9 @@ export declare const sendEmailTool: {
|
|
|
48
53
|
sendgridApiKey: z.ZodOptional<z.ZodString>;
|
|
49
54
|
mailgunApiKey: z.ZodOptional<z.ZodString>;
|
|
50
55
|
mailgunDomain: z.ZodOptional<z.ZodString>;
|
|
56
|
+
sesAccessKeyId: z.ZodOptional<z.ZodString>;
|
|
57
|
+
sesSecretAccessKey: z.ZodOptional<z.ZodString>;
|
|
58
|
+
sesRegion: z.ZodOptional<z.ZodString>;
|
|
51
59
|
to: z.ZodString;
|
|
52
60
|
subject: z.ZodString;
|
|
53
61
|
text: z.ZodString;
|
|
@@ -4,7 +4,7 @@ import { EmailService, getEmailService, } from "../../services/email-service.js"
|
|
|
4
4
|
const sendEmailParams = z.object({
|
|
5
5
|
// ── Inline credentials (all optional — omit to use env var config) ──────
|
|
6
6
|
mailer: z
|
|
7
|
-
.enum(["smtp", "sendgrid", "mailgun"])
|
|
7
|
+
.enum(["smtp", "sendgrid", "mailgun", "ses"])
|
|
8
8
|
.optional()
|
|
9
9
|
.describe("Mail driver. Required when not configured via env vars (MAIL_MAILER)."),
|
|
10
10
|
fromAddress: z
|
|
@@ -48,6 +48,19 @@ const sendEmailParams = z.object({
|
|
|
48
48
|
.string()
|
|
49
49
|
.optional()
|
|
50
50
|
.describe("Mailgun sending domain. Required when mailer=mailgun."),
|
|
51
|
+
// Amazon SES
|
|
52
|
+
sesAccessKeyId: z
|
|
53
|
+
.string()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("AWS IAM Access Key ID. Required when mailer=ses."),
|
|
56
|
+
sesSecretAccessKey: z
|
|
57
|
+
.string()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("AWS IAM Secret Access Key. Required when mailer=ses."),
|
|
60
|
+
sesRegion: z
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("AWS region for SES (default us-east-1). Used when mailer=ses."),
|
|
51
64
|
// ── Message ──────────────────────────────────────────────────────────────
|
|
52
65
|
to: z.string().email().describe("Recipient email address."),
|
|
53
66
|
subject: z.string().min(1).describe("Email subject line."),
|
|
@@ -76,6 +89,9 @@ export const sendEmailTool = {
|
|
|
76
89
|
sendgridApiKey: params.sendgridApiKey,
|
|
77
90
|
mailgunApiKey: params.mailgunApiKey,
|
|
78
91
|
mailgunDomain: params.mailgunDomain,
|
|
92
|
+
sesAccessKeyId: params.sesAccessKeyId,
|
|
93
|
+
sesSecretAccessKey: params.sesSecretAccessKey,
|
|
94
|
+
sesRegion: params.sesRegion,
|
|
79
95
|
})
|
|
80
96
|
: getEmailService();
|
|
81
97
|
await service.send(params.to, params.subject, params.text, params.html);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../src/tools/email-tools/send-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACN,YAAY,EACZ,eAAe,GACf,MAAM,iCAAiC,CAAC;AAEzC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,2EAA2E;IAC3E,MAAM,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../src/tools/email-tools/send-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
title: z.ZodString;
|
|
4
|
+
html: z.ZodOptional<z.ZodString>;
|
|
5
|
+
status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
draft: "draft";
|
|
7
|
+
published: "published";
|
|
8
|
+
scheduled: "scheduled";
|
|
9
|
+
}>>>;
|
|
10
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
11
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
12
|
+
publishedAt: z.ZodOptional<z.ZodString>;
|
|
13
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
14
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
type Params = z.infer<typeof params>;
|
|
17
|
+
export declare const createPostTool: {
|
|
18
|
+
readonly name: "GHOST_CREATE_POST";
|
|
19
|
+
readonly description: "Create a post on a Ghost blog via the Admin API. Supports draft, published, and scheduled statuses.";
|
|
20
|
+
readonly parameters: z.ZodObject<{
|
|
21
|
+
title: z.ZodString;
|
|
22
|
+
html: z.ZodOptional<z.ZodString>;
|
|
23
|
+
status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
draft: "draft";
|
|
25
|
+
published: "published";
|
|
26
|
+
scheduled: "scheduled";
|
|
27
|
+
}>>>;
|
|
28
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
30
|
+
publishedAt: z.ZodOptional<z.ZodString>;
|
|
31
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
32
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { GhostService, getGhostService } from "../../services/ghost-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
title: z.string().min(1).describe("Post title"),
|
|
6
|
+
html: z.string().optional().describe("Post body as HTML"),
|
|
7
|
+
status: z
|
|
8
|
+
.enum(["draft", "published", "scheduled"])
|
|
9
|
+
.optional()
|
|
10
|
+
.default("draft")
|
|
11
|
+
.describe("Post status (default: draft)"),
|
|
12
|
+
tags: z.array(z.string()).optional().describe("Tag names to assign to the post"),
|
|
13
|
+
excerpt: z.string().optional().describe("Custom excerpt shown in listings"),
|
|
14
|
+
publishedAt: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("ISO 8601 date for scheduling, e.g. '2024-12-25T09:00:00.000Z'"),
|
|
18
|
+
siteUrl: z.string().optional().describe("Ghost site URL (overrides GHOST_SITE_URL env var)"),
|
|
19
|
+
adminApiKey: z.string().optional().describe("Ghost Admin API key id:secret (overrides GHOST_ADMIN_API_KEY env var)"),
|
|
20
|
+
});
|
|
21
|
+
export const createPostTool = {
|
|
22
|
+
name: "GHOST_CREATE_POST",
|
|
23
|
+
description: "Create a post on a Ghost blog via the Admin API. Supports draft, published, and scheduled statuses.",
|
|
24
|
+
parameters: params,
|
|
25
|
+
execute: async (p) => {
|
|
26
|
+
try {
|
|
27
|
+
const service = p.siteUrl && p.adminApiKey
|
|
28
|
+
? new GhostService({ siteUrl: p.siteUrl, adminApiKey: p.adminApiKey })
|
|
29
|
+
: getGhostService();
|
|
30
|
+
const result = await service.createPost(p.title, p.html, undefined, p.status ?? "draft", p.tags ?? [], p.excerpt, p.publishedAt);
|
|
31
|
+
const post = result.posts[0];
|
|
32
|
+
if (!post)
|
|
33
|
+
return "Post may have been created but no data was returned.";
|
|
34
|
+
return [
|
|
35
|
+
`Ghost post ${post.status === "draft" ? "saved as draft" : post.status === "scheduled" ? "scheduled" : "published"}!`,
|
|
36
|
+
``,
|
|
37
|
+
`Title: ${post.title}`,
|
|
38
|
+
`ID: ${post.id}`,
|
|
39
|
+
`Status: ${post.status}`,
|
|
40
|
+
...(post.url ? [`URL: ${post.url}`] : []),
|
|
41
|
+
...(post.slug ? [`Slug: ${post.slug}`] : []),
|
|
42
|
+
].join("\n");
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof CredentialsError)
|
|
46
|
+
return `Error: ${error.message}`;
|
|
47
|
+
return `Error creating Ghost post: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=create-post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-post.js","sourceRoot":"","sources":["../../../src/tools/ghost-tools/create-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACzD,MAAM,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;SACzC,QAAQ,EAAE;SACV,OAAO,CAAC,OAAO,CAAC;SAChB,QAAQ,CAAC,8BAA8B,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAChF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC3E,WAAW,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC3E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC5F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;CACpH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,qGAAqG;IAClH,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GACZ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW;gBACzB,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACtE,CAAC,CAAC,eAAe,EAAE,CAAC;YAEtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,CAAC,CAAC,KAAK,EACP,CAAC,CAAC,IAAI,EACN,SAAS,EACT,CAAC,CAAC,MAAM,IAAI,OAAO,EACnB,CAAC,CAAC,IAAI,IAAI,EAAE,EACZ,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,WAAW,CACb,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,OAAO,sDAAsD,CAAC;YAEzE,OAAO;gBACN,cAAc,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG;gBACrH,EAAE;gBACF,UAAU,IAAI,CAAC,KAAK,EAAE;gBACtB,OAAO,IAAI,CAAC,EAAE,EAAE;gBAChB,WAAW,IAAI,CAAC,MAAM,EAAE;gBACxB,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,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C,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,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACjG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
5
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
type Params = z.infer<typeof params>;
|
|
8
|
+
export declare const deletePostTool: {
|
|
9
|
+
readonly name: "GHOST_DELETE_POST";
|
|
10
|
+
readonly description: "Permanently delete a Ghost post by ID. This action cannot be undone.";
|
|
11
|
+
readonly parameters: z.ZodObject<{
|
|
12
|
+
id: z.ZodString;
|
|
13
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
14
|
+
adminApiKey: 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 { GhostService, getGhostService } from "../../services/ghost-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
id: z.string().describe("Post ID to delete (from GHOST_GET_POSTS)"),
|
|
6
|
+
siteUrl: z.string().optional().describe("Ghost site URL (overrides GHOST_SITE_URL env var)"),
|
|
7
|
+
adminApiKey: z.string().optional().describe("Ghost Admin API key id:secret (overrides GHOST_ADMIN_API_KEY env var)"),
|
|
8
|
+
});
|
|
9
|
+
export const deletePostTool = {
|
|
10
|
+
name: "GHOST_DELETE_POST",
|
|
11
|
+
description: "Permanently delete a Ghost post by ID. This action cannot be undone.",
|
|
12
|
+
parameters: params,
|
|
13
|
+
execute: async (p) => {
|
|
14
|
+
try {
|
|
15
|
+
const service = p.siteUrl && p.adminApiKey
|
|
16
|
+
? new GhostService({ siteUrl: p.siteUrl, adminApiKey: p.adminApiKey })
|
|
17
|
+
: getGhostService();
|
|
18
|
+
await service.deletePost(p.id);
|
|
19
|
+
return `Ghost post ${p.id} deleted successfully.`;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof CredentialsError)
|
|
23
|
+
return `Error: ${error.message}`;
|
|
24
|
+
return `Error deleting Ghost 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/ghost-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,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC5F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;CACpH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,sEAAsE;IACnF,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GACZ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW;gBACzB,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACtE,CAAC,CAAC,eAAe,EAAE,CAAC;YAEtB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,OAAO,cAAc,CAAC,CAAC,EAAE,wBAAwB,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACjG,CAAC;IACF,CAAC;CACQ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
4
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
5
|
+
status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
draft: "draft";
|
|
7
|
+
all: "all";
|
|
8
|
+
published: "published";
|
|
9
|
+
}>>>;
|
|
10
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
11
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
type Params = z.infer<typeof params>;
|
|
14
|
+
export declare const getPostsTool: {
|
|
15
|
+
readonly name: "GHOST_GET_POSTS";
|
|
16
|
+
readonly description: "List posts from a Ghost blog via the Admin API.";
|
|
17
|
+
readonly parameters: z.ZodObject<{
|
|
18
|
+
page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
19
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
20
|
+
status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
draft: "draft";
|
|
22
|
+
all: "all";
|
|
23
|
+
published: "published";
|
|
24
|
+
}>>>;
|
|
25
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
26
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { GhostService, getGhostService } from "../../services/ghost-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
page: z.number().int().positive().optional().default(1).describe("Page number (default: 1)"),
|
|
6
|
+
limit: z.number().int().min(1).max(100).optional().default(10).describe("Posts per page (default: 10)"),
|
|
7
|
+
status: z
|
|
8
|
+
.enum(["all", "published", "draft"])
|
|
9
|
+
.optional()
|
|
10
|
+
.default("all")
|
|
11
|
+
.describe("Filter by post status (default: all)"),
|
|
12
|
+
siteUrl: z.string().optional().describe("Ghost site URL (overrides GHOST_SITE_URL env var)"),
|
|
13
|
+
adminApiKey: z.string().optional().describe("Ghost Admin API key id:secret (overrides GHOST_ADMIN_API_KEY env var)"),
|
|
14
|
+
});
|
|
15
|
+
export const getPostsTool = {
|
|
16
|
+
name: "GHOST_GET_POSTS",
|
|
17
|
+
description: "List posts from a Ghost blog via the Admin API.",
|
|
18
|
+
parameters: params,
|
|
19
|
+
execute: async (p) => {
|
|
20
|
+
try {
|
|
21
|
+
const service = p.siteUrl && p.adminApiKey
|
|
22
|
+
? new GhostService({ siteUrl: p.siteUrl, adminApiKey: p.adminApiKey })
|
|
23
|
+
: getGhostService();
|
|
24
|
+
const result = await service.getPosts(p.page ?? 1, p.limit ?? 10, p.status ?? "all");
|
|
25
|
+
if (!result.posts.length)
|
|
26
|
+
return "No posts found.";
|
|
27
|
+
const total = result.meta?.pagination?.total != null ? ` (${result.meta.pagination.total} total)` : "";
|
|
28
|
+
return [
|
|
29
|
+
`Ghost Posts${total}:`,
|
|
30
|
+
``,
|
|
31
|
+
...result.posts.map((post, i) => {
|
|
32
|
+
const tags = post.tags?.map((t) => t.name).join(", ") ?? "";
|
|
33
|
+
return [
|
|
34
|
+
`${i + 1}. ${post.title ?? post.id}`,
|
|
35
|
+
` ID: ${post.id} | Status: ${post.status}`,
|
|
36
|
+
...(post.url ? [` URL: ${post.url}`] : []),
|
|
37
|
+
...(post.published_at ? [` Published: ${post.published_at}`] : []),
|
|
38
|
+
...(tags ? [` Tags: ${tags}`] : []),
|
|
39
|
+
...(post.excerpt ? [` Excerpt: ${post.excerpt}`] : []),
|
|
40
|
+
].join("\n");
|
|
41
|
+
}),
|
|
42
|
+
].join("\n");
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof CredentialsError)
|
|
46
|
+
return `Error: ${error.message}`;
|
|
47
|
+
return `Error fetching Ghost posts: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=get-posts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-posts.js","sourceRoot":"","sources":["../../../src/tools/ghost-tools/get-posts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
updatedAt: z.ZodString;
|
|
5
|
+
title: z.ZodOptional<z.ZodString>;
|
|
6
|
+
html: z.ZodOptional<z.ZodString>;
|
|
7
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
draft: "draft";
|
|
9
|
+
published: "published";
|
|
10
|
+
}>>;
|
|
11
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
12
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
13
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
14
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
type Params = z.infer<typeof params>;
|
|
17
|
+
export declare const updatePostTool: {
|
|
18
|
+
readonly name: "GHOST_UPDATE_POST";
|
|
19
|
+
readonly description: "Update an existing Ghost post. Requires the post's current updated_at timestamp for optimistic locking.";
|
|
20
|
+
readonly parameters: z.ZodObject<{
|
|
21
|
+
id: z.ZodString;
|
|
22
|
+
updatedAt: z.ZodString;
|
|
23
|
+
title: z.ZodOptional<z.ZodString>;
|
|
24
|
+
html: z.ZodOptional<z.ZodString>;
|
|
25
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
draft: "draft";
|
|
27
|
+
published: "published";
|
|
28
|
+
}>>;
|
|
29
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
31
|
+
siteUrl: z.ZodOptional<z.ZodString>;
|
|
32
|
+
adminApiKey: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialsError } from "../../lib/errors.js";
|
|
3
|
+
import { GhostService, getGhostService } from "../../services/ghost-service.js";
|
|
4
|
+
const params = z.object({
|
|
5
|
+
id: z.string().describe("Post ID (from GHOST_GET_POSTS)"),
|
|
6
|
+
updatedAt: z
|
|
7
|
+
.string()
|
|
8
|
+
.describe("Current updated_at timestamp of the post (required by Ghost for optimistic locking)"),
|
|
9
|
+
title: z.string().optional().describe("New title"),
|
|
10
|
+
html: z.string().optional().describe("New body HTML"),
|
|
11
|
+
status: z.enum(["draft", "published"]).optional().describe("New status"),
|
|
12
|
+
tags: z.array(z.string()).optional().describe("New tag names (replaces existing tags)"),
|
|
13
|
+
excerpt: z.string().optional().describe("New custom excerpt"),
|
|
14
|
+
siteUrl: z.string().optional().describe("Ghost site URL (overrides GHOST_SITE_URL env var)"),
|
|
15
|
+
adminApiKey: z.string().optional().describe("Ghost Admin API key id:secret (overrides GHOST_ADMIN_API_KEY env var)"),
|
|
16
|
+
});
|
|
17
|
+
export const updatePostTool = {
|
|
18
|
+
name: "GHOST_UPDATE_POST",
|
|
19
|
+
description: "Update an existing Ghost post. Requires the post's current updated_at timestamp for optimistic locking.",
|
|
20
|
+
parameters: params,
|
|
21
|
+
execute: async (p) => {
|
|
22
|
+
try {
|
|
23
|
+
const service = p.siteUrl && p.adminApiKey
|
|
24
|
+
? new GhostService({ siteUrl: p.siteUrl, adminApiKey: p.adminApiKey })
|
|
25
|
+
: getGhostService();
|
|
26
|
+
const updates = {};
|
|
27
|
+
if (p.title !== undefined)
|
|
28
|
+
updates.title = p.title;
|
|
29
|
+
if (p.html !== undefined)
|
|
30
|
+
updates.html = p.html;
|
|
31
|
+
if (p.status !== undefined)
|
|
32
|
+
updates.status = p.status;
|
|
33
|
+
if (p.tags !== undefined)
|
|
34
|
+
updates.tags = p.tags;
|
|
35
|
+
if (p.excerpt !== undefined)
|
|
36
|
+
updates.custom_excerpt = p.excerpt;
|
|
37
|
+
const result = await service.updatePost(p.id, p.updatedAt, updates);
|
|
38
|
+
const post = result.posts[0];
|
|
39
|
+
if (!post)
|
|
40
|
+
return "Update may have succeeded but no data was returned.";
|
|
41
|
+
return [
|
|
42
|
+
`Ghost post updated!`,
|
|
43
|
+
``,
|
|
44
|
+
`Title: ${post.title}`,
|
|
45
|
+
`ID: ${post.id}`,
|
|
46
|
+
`Status: ${post.status}`,
|
|
47
|
+
...(post.url ? [`URL: ${post.url}`] : []),
|
|
48
|
+
...(post.updated_at ? [`Updated At: ${post.updated_at}`] : []),
|
|
49
|
+
].join("\n");
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof CredentialsError)
|
|
53
|
+
return `Error: ${error.message}`;
|
|
54
|
+
return `Error updating Ghost post: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=update-post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-post.js","sourceRoot":"","sources":["../../../src/tools/ghost-tools/update-post.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const params: z.ZodObject<{
|
|
3
|
+
title: z.ZodString;
|
|
4
|
+
contentMarkdown: z.ZodString;
|
|
5
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
slug: z.ZodString;
|
|
8
|
+
}, z.core.$strip>>>;
|
|
9
|
+
publicationId: z.ZodOptional<z.ZodString>;
|
|
10
|
+
subtitle: z.ZodOptional<z.ZodString>;
|
|
11
|
+
coverImageUrl: z.ZodOptional<z.ZodString>;
|
|
12
|
+
disableComments: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
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: "HASHNODE_CREATE_POST";
|
|
18
|
+
readonly description: "Publish a post to a Hashnode publication.";
|
|
19
|
+
readonly parameters: z.ZodObject<{
|
|
20
|
+
title: z.ZodString;
|
|
21
|
+
contentMarkdown: z.ZodString;
|
|
22
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
23
|
+
name: z.ZodString;
|
|
24
|
+
slug: z.ZodString;
|
|
25
|
+
}, z.core.$strip>>>;
|
|
26
|
+
publicationId: z.ZodOptional<z.ZodString>;
|
|
27
|
+
subtitle: z.ZodOptional<z.ZodString>;
|
|
28
|
+
coverImageUrl: z.ZodOptional<z.ZodString>;
|
|
29
|
+
disableComments: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
30
|
+
accessToken: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
title: z.string().min(1).describe("Post title"),
|
|
6
|
+
contentMarkdown: z.string().min(1).describe("Post body in Markdown format"),
|
|
7
|
+
tags: z
|
|
8
|
+
.array(z.object({ name: z.string(), slug: z.string() }))
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Tags as [{name, slug}] — slug is the lowercase hyphenated version of the tag name"),
|
|
11
|
+
publicationId: z.string().optional().describe("Hashnode publication ID (overrides HASHNODE_PUBLICATION_ID env var)"),
|
|
12
|
+
subtitle: z.string().optional().describe("Subtitle displayed below the title"),
|
|
13
|
+
coverImageUrl: z.string().url().optional().describe("Cover image URL"),
|
|
14
|
+
disableComments: z.boolean().optional().default(false).describe("Disable comments on the post"),
|
|
15
|
+
accessToken: z.string().optional().describe("Hashnode Personal Access Token (overrides HASHNODE_ACCESS_TOKEN env var)"),
|
|
16
|
+
});
|
|
17
|
+
export const createPostTool = {
|
|
18
|
+
name: "HASHNODE_CREATE_POST",
|
|
19
|
+
description: "Publish a post to a Hashnode publication.",
|
|
20
|
+
parameters: params,
|
|
21
|
+
execute: async (p) => {
|
|
22
|
+
try {
|
|
23
|
+
const service = p.accessToken
|
|
24
|
+
? new HashnodeService({ accessToken: p.accessToken, publicationId: p.publicationId })
|
|
25
|
+
: getHashnodeService();
|
|
26
|
+
const result = await service.createPost(p.title, p.contentMarkdown, p.tags ?? [], p.publicationId, p.subtitle, p.coverImageUrl, p.disableComments ?? false);
|
|
27
|
+
const post = result.data?.publishPost.post;
|
|
28
|
+
if (!post)
|
|
29
|
+
return "Post may have been created but no data was returned.";
|
|
30
|
+
return [
|
|
31
|
+
`Post published to Hashnode!`,
|
|
32
|
+
``,
|
|
33
|
+
`Title: ${post.title}`,
|
|
34
|
+
`ID: ${post.id}`,
|
|
35
|
+
...(post.url ? [`URL: ${post.url}`] : []),
|
|
36
|
+
...(post.slug ? [`Slug: ${post.slug}`] : []),
|
|
37
|
+
].join("\n");
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof CredentialsError)
|
|
41
|
+
return `Error: ${error.message}`;
|
|
42
|
+
return `Error publishing to Hashnode: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=create-post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-post.js","sourceRoot":"","sources":["../../../src/tools/hashnode-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
|
+
first: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
4
|
+
publicationId: 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 getPostsTool: {
|
|
9
|
+
readonly name: "HASHNODE_GET_POSTS";
|
|
10
|
+
readonly description: "Get recent posts from a Hashnode publication.";
|
|
11
|
+
readonly parameters: z.ZodObject<{
|
|
12
|
+
first: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
13
|
+
publicationId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
accessToken: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
readonly execute: (p: Params) => Promise<string>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|