social-mcp 2.9.0 → 2.10.1
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 +5 -4
- package/dist/services/beehiiv-service.d.ts +2 -0
- package/dist/services/beehiiv-service.js +21 -8
- package/dist/services/beehiiv-service.js.map +1 -1
- package/dist/services/bluesky-service.d.ts +19 -4
- package/dist/services/bluesky-service.js +54 -4
- package/dist/services/bluesky-service.js.map +1 -1
- package/dist/services/devto-service.d.ts +2 -0
- package/dist/services/devto-service.js +7 -2
- package/dist/services/devto-service.js.map +1 -1
- package/dist/services/hashnode-service.d.ts +2 -0
- package/dist/services/hashnode-service.js +26 -11
- package/dist/services/hashnode-service.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -436,7 +436,7 @@ Set `MAIL_MAILER` to select your provider (`smtp`, `sendgrid`, `mailgun`, or `se
|
|
|
436
436
|
- **BLUESKY_LIKE_POST** — Like a post (`uri`, `cid`)
|
|
437
437
|
- **BLUESKY_SEARCH_POSTS** — Search for posts on Bluesky (`query`, `limit`)
|
|
438
438
|
|
|
439
|
-
> **Note:** `images` take `{ content, mimeType, alt? }[]` with `content` as base64 — AT Proto has no URL-reference option, every image is uploaded as a blob (`uploadBlob`) and referenced in the post's embed.
|
|
439
|
+
> **Note:** `images` take `{ content, mimeType, alt? }[]` with `content` as base64 — AT Proto has no URL-reference option, every image is uploaded as a blob (`uploadBlob`) and referenced in the post's embed. For library consumers managing their own session (e.g. an app that already exchanged an identifier/app-password for a session and refreshes it independently), `BlueskyCredentials` also accepts `{ did, handle?, accessJwt, refreshJwt }` to resume that session instead of logging in fresh — call `getSession()` afterward to read back the session in case AT Proto rotated the refresh token during the call, so you can persist the new one.
|
|
440
440
|
|
|
441
441
|
### Mastodon
|
|
442
442
|
|
|
@@ -604,13 +604,14 @@ When `mailer` and `fromAddress` are omitted, the tool falls back to the env var
|
|
|
604
604
|
|
|
605
605
|
Most services accept an optional `proxyUrl` in their credentials (e.g. `new DiscordService({ botToken, proxyUrl: "http://user:pass@host:port" })`), routing that account's API calls through an HTTP(S) proxy — useful for a multi-tenant host that wants each connected account's traffic to originate from a distinct, consistent IP. This is a constructor-level option for programmatic/library consumers (not an MCP tool parameter, since it's server-operator infrastructure rather than message content).
|
|
606
606
|
|
|
607
|
-
Supported today: Discord, Slack, Telegram, Twitter/X, Instagram, Facebook, WhatsApp, Threads, LinkedIn, Reddit, Pinterest, Mastodon, YouTube, Ghost, Tumblr. Not yet wired:
|
|
607
|
+
Supported today: Discord, Slack, Telegram, Twitter/X, Instagram, Facebook, WhatsApp, Threads, LinkedIn, Reddit, Pinterest, Mastodon, YouTube, Ghost, Tumblr, TikTok, Medium, Bluesky. Not yet wired: Dev.to, Hashnode, Beehiiv, Twitch — these currently ignore any `proxyUrl` passed to them.
|
|
608
608
|
|
|
609
|
-
|
|
609
|
+
Three mechanisms are used depending on how each service talks to its platform, since passing the wrong one is a silent no-op rather than an error:
|
|
610
610
|
- `createProxyDispatcher()` (undici `ProxyAgent`) for services using raw `fetch()` — most of the list above.
|
|
611
611
|
- `createProxyAgent()` (`https-proxy-agent`) for services built on SDKs that take a classic `http.Agent` (Slack's `@slack/web-api`, Telegram's `telegraf`, Twitter's `twitter-api-v2` via its `httpAgent` client option).
|
|
612
|
+
- Bluesky's `BskyAgent` takes a custom `fetch` function directly (`AtpAgentOptions.fetch`) — `BlueskyService` wraps `createProxyDispatcher()`'s dispatcher in one when `proxyUrl` is set.
|
|
612
613
|
|
|
613
|
-
|
|
614
|
+
`createProxyDispatcher`/`createProxyAgent` are exported from `social-mcp/dist/lib/proxy.js` if you need to build the agent/dispatcher yourself.
|
|
614
615
|
|
|
615
616
|
## Development
|
|
616
617
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export interface BeehiivCredentials {
|
|
2
2
|
apiKey: string;
|
|
3
3
|
publicationId?: string;
|
|
4
|
+
proxyUrl?: string;
|
|
4
5
|
}
|
|
5
6
|
export declare class BeehiivService {
|
|
6
7
|
private baseUrl;
|
|
7
8
|
private headers;
|
|
8
9
|
private publicationId;
|
|
10
|
+
private dispatcher?;
|
|
9
11
|
constructor(credentials?: BeehiivCredentials);
|
|
10
12
|
private getPublicationId;
|
|
11
13
|
getPosts(publicationId?: string, page?: number, limit?: number): Promise<{
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { config } from "../lib/config.js";
|
|
3
3
|
import { CredentialsError } from "../lib/errors.js";
|
|
4
4
|
import { fetchJson } from "../lib/http.js";
|
|
5
|
+
import { createProxyDispatcher } from "../lib/proxy.js";
|
|
5
6
|
const postSchema = z.object({
|
|
6
7
|
id: z.string(),
|
|
7
8
|
title: z.string().optional(),
|
|
@@ -13,13 +14,17 @@ const postSchema = z.object({
|
|
|
13
14
|
slug: z.string().optional(),
|
|
14
15
|
audience: z.string().optional(),
|
|
15
16
|
email_sent_to_count: z.number().nullable().optional(),
|
|
16
|
-
stats: z
|
|
17
|
-
|
|
17
|
+
stats: z
|
|
18
|
+
.object({
|
|
19
|
+
email: z
|
|
20
|
+
.object({
|
|
18
21
|
recipients: z.number().optional(),
|
|
19
22
|
open_rate: z.number().optional(),
|
|
20
23
|
click_rate: z.number().optional(),
|
|
21
|
-
})
|
|
22
|
-
|
|
24
|
+
})
|
|
25
|
+
.optional(),
|
|
26
|
+
})
|
|
27
|
+
.optional(),
|
|
23
28
|
});
|
|
24
29
|
const postsResponseSchema = z.object({
|
|
25
30
|
data: z.array(postSchema),
|
|
@@ -47,17 +52,20 @@ export class BeehiivService {
|
|
|
47
52
|
baseUrl = config.beehiiv.baseUrl;
|
|
48
53
|
headers;
|
|
49
54
|
publicationId;
|
|
55
|
+
dispatcher;
|
|
50
56
|
constructor(credentials) {
|
|
51
57
|
const apiKey = credentials?.apiKey ?? config.beehiiv.apiKey;
|
|
52
58
|
if (!apiKey) {
|
|
53
59
|
throw new CredentialsError("Beehiiv", ["BEEHIIV_API_KEY"]);
|
|
54
60
|
}
|
|
55
|
-
this.publicationId =
|
|
61
|
+
this.publicationId =
|
|
62
|
+
credentials?.publicationId ?? config.beehiiv.publicationId;
|
|
56
63
|
this.headers = {
|
|
57
64
|
Authorization: `Bearer ${apiKey}`,
|
|
58
65
|
"Content-Type": "application/json",
|
|
59
66
|
Accept: "application/json",
|
|
60
67
|
};
|
|
68
|
+
this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
|
|
61
69
|
}
|
|
62
70
|
getPublicationId(override) {
|
|
63
71
|
const id = override ?? this.publicationId;
|
|
@@ -67,7 +75,7 @@ export class BeehiivService {
|
|
|
67
75
|
}
|
|
68
76
|
async getPosts(publicationId, page = 1, limit = 10) {
|
|
69
77
|
const id = this.getPublicationId(publicationId);
|
|
70
|
-
return fetchJson(`${this.baseUrl}/publications/${id}/posts?page=${page}&limit=${limit}&expand[]=stats`, { method: "GET", headers: this.headers }, postsResponseSchema);
|
|
78
|
+
return fetchJson(`${this.baseUrl}/publications/${id}/posts?page=${page}&limit=${limit}&expand[]=stats`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, postsResponseSchema);
|
|
71
79
|
}
|
|
72
80
|
async createPost(publicationId, title, bodyHtml, subtitle, status = "draft", audience = "free", sendAt) {
|
|
73
81
|
const id = this.getPublicationId(publicationId);
|
|
@@ -81,11 +89,16 @@ export class BeehiivService {
|
|
|
81
89
|
body.preview_text = subtitle;
|
|
82
90
|
if (sendAt)
|
|
83
91
|
body.send_at = sendAt;
|
|
84
|
-
return fetchJson(`${this.baseUrl}/publications/${id}/posts`, {
|
|
92
|
+
return fetchJson(`${this.baseUrl}/publications/${id}/posts`, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: this.headers,
|
|
95
|
+
body: JSON.stringify(body),
|
|
96
|
+
dispatcher: this.dispatcher,
|
|
97
|
+
}, createPostResponseSchema);
|
|
85
98
|
}
|
|
86
99
|
async getSubscribers(publicationId, page = 1, limit = 10) {
|
|
87
100
|
const id = this.getPublicationId(publicationId);
|
|
88
|
-
return fetchJson(`${this.baseUrl}/publications/${id}/subscriptions?page=${page}&limit=${limit}`, { method: "GET", headers: this.headers }, subscribersResponseSchema);
|
|
101
|
+
return fetchJson(`${this.baseUrl}/publications/${id}/subscriptions?page=${page}&limit=${limit}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, subscribersResponseSchema);
|
|
89
102
|
}
|
|
90
103
|
}
|
|
91
104
|
let _instance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beehiiv-service.js","sourceRoot":"","sources":["../../src/services/beehiiv-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"beehiiv-service.js","sourceRoot":"","sources":["../../src/services/beehiiv-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
export interface BlueskyCredentials {
|
|
2
|
-
identifier
|
|
3
|
-
appPassword
|
|
2
|
+
identifier?: string;
|
|
3
|
+
appPassword?: string;
|
|
4
|
+
did?: string;
|
|
5
|
+
handle?: string;
|
|
6
|
+
accessJwt?: string;
|
|
7
|
+
refreshJwt?: string;
|
|
4
8
|
service?: string;
|
|
9
|
+
/** Routes API calls through this proxy (e.g. per-tenant IP isolation). */
|
|
10
|
+
proxyUrl?: string;
|
|
5
11
|
}
|
|
6
12
|
export interface BlueskyImage {
|
|
7
13
|
/** Base64-encoded image bytes. Max 4 per post (AT Proto's own limit). */
|
|
@@ -9,13 +15,22 @@ export interface BlueskyImage {
|
|
|
9
15
|
mimeType: string;
|
|
10
16
|
alt?: string;
|
|
11
17
|
}
|
|
18
|
+
export interface BlueskySession {
|
|
19
|
+
did: string;
|
|
20
|
+
handle: string;
|
|
21
|
+
accessJwt: string;
|
|
22
|
+
refreshJwt: string;
|
|
23
|
+
}
|
|
12
24
|
export declare class BlueskyService {
|
|
13
25
|
private agent;
|
|
14
|
-
private identifier
|
|
15
|
-
private appPassword
|
|
26
|
+
private identifier?;
|
|
27
|
+
private appPassword?;
|
|
28
|
+
private resumeSessionData?;
|
|
16
29
|
private loggedIn;
|
|
30
|
+
private latestSession?;
|
|
17
31
|
constructor(credentials?: BlueskyCredentials);
|
|
18
32
|
private ensureLoggedIn;
|
|
33
|
+
getSession(): BlueskySession | undefined;
|
|
19
34
|
createPost(text: string, images?: BlueskyImage[]): Promise<{
|
|
20
35
|
uri: string;
|
|
21
36
|
cid: string;
|
|
@@ -1,33 +1,83 @@
|
|
|
1
1
|
import { BskyAgent } from "@atproto/api";
|
|
2
2
|
import { config } from "../lib/config.js";
|
|
3
3
|
import { CredentialsError } from "../lib/errors.js";
|
|
4
|
+
import { createProxyDispatcher } from "../lib/proxy.js";
|
|
4
5
|
export class BlueskyService {
|
|
5
6
|
agent;
|
|
6
7
|
identifier;
|
|
7
8
|
appPassword;
|
|
9
|
+
resumeSessionData;
|
|
8
10
|
loggedIn = false;
|
|
11
|
+
latestSession;
|
|
9
12
|
constructor(credentials) {
|
|
10
13
|
const identifier = credentials?.identifier ?? config.bluesky.identifier;
|
|
11
14
|
const appPassword = credentials?.appPassword ?? config.bluesky.appPassword;
|
|
12
15
|
const service = credentials?.service ?? config.bluesky.service;
|
|
13
|
-
if (
|
|
16
|
+
if (credentials?.did && credentials.accessJwt && credentials.refreshJwt) {
|
|
17
|
+
this.resumeSessionData = {
|
|
18
|
+
did: credentials.did,
|
|
19
|
+
handle: credentials.handle ?? credentials.did,
|
|
20
|
+
accessJwt: credentials.accessJwt,
|
|
21
|
+
refreshJwt: credentials.refreshJwt,
|
|
22
|
+
active: true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
else if (!identifier || !appPassword) {
|
|
14
26
|
throw new CredentialsError("Bluesky", [
|
|
15
27
|
"BLUESKY_IDENTIFIER",
|
|
16
28
|
"BLUESKY_APP_PASSWORD",
|
|
29
|
+
"(or did/accessJwt/refreshJwt to resume a session)",
|
|
17
30
|
]);
|
|
18
31
|
}
|
|
19
32
|
this.identifier = identifier;
|
|
20
33
|
this.appPassword = appPassword;
|
|
21
|
-
|
|
34
|
+
const dispatcher = createProxyDispatcher(credentials?.proxyUrl);
|
|
35
|
+
this.agent = new BskyAgent({
|
|
36
|
+
service,
|
|
37
|
+
// AT Proto rotates the refresh token on use — this is the SDK's own hook for
|
|
38
|
+
// finding out, so a session-resume caller can persist the new one via
|
|
39
|
+
// getSession() rather than silently working with a token that's gone stale.
|
|
40
|
+
persistSession: (_evt, session) => {
|
|
41
|
+
if (session) {
|
|
42
|
+
this.latestSession = {
|
|
43
|
+
did: session.did,
|
|
44
|
+
handle: session.handle,
|
|
45
|
+
accessJwt: session.accessJwt,
|
|
46
|
+
refreshJwt: session.refreshJwt,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
...(dispatcher
|
|
51
|
+
? {
|
|
52
|
+
fetch: ((input, init) => fetch(input, {
|
|
53
|
+
...init,
|
|
54
|
+
dispatcher,
|
|
55
|
+
})),
|
|
56
|
+
}
|
|
57
|
+
: {}),
|
|
58
|
+
});
|
|
22
59
|
}
|
|
23
60
|
async ensureLoggedIn() {
|
|
24
|
-
if (
|
|
61
|
+
if (this.loggedIn)
|
|
62
|
+
return;
|
|
63
|
+
if (this.resumeSessionData) {
|
|
64
|
+
await this.agent.resumeSession(this.resumeSessionData);
|
|
65
|
+
}
|
|
66
|
+
else if (this.identifier && this.appPassword) {
|
|
25
67
|
await this.agent.login({
|
|
26
68
|
identifier: this.identifier,
|
|
27
69
|
password: this.appPassword,
|
|
28
70
|
});
|
|
29
|
-
this.loggedIn = true;
|
|
30
71
|
}
|
|
72
|
+
else {
|
|
73
|
+
throw new Error("Bluesky credentials are missing");
|
|
74
|
+
}
|
|
75
|
+
this.loggedIn = true;
|
|
76
|
+
}
|
|
77
|
+
// Only meaningful in session-resume mode: the (possibly refreshed) session after
|
|
78
|
+
// an operation, for the caller to persist if it rotated mid-call.
|
|
79
|
+
getSession() {
|
|
80
|
+
return this.latestSession;
|
|
31
81
|
}
|
|
32
82
|
async createPost(text, images) {
|
|
33
83
|
await this.ensureLoggedIn();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bluesky-service.js","sourceRoot":"","sources":["../../src/services/bluesky-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bluesky-service.js","sourceRoot":"","sources":["../../src/services/bluesky-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,10 +18,12 @@ declare const articleSchema: z.ZodObject<{
|
|
|
18
18
|
export type DevToArticle = z.infer<typeof articleSchema>;
|
|
19
19
|
export interface DevToCredentials {
|
|
20
20
|
apiKey: string;
|
|
21
|
+
proxyUrl?: string;
|
|
21
22
|
}
|
|
22
23
|
export declare class DevToService {
|
|
23
24
|
private baseUrl;
|
|
24
25
|
private headers;
|
|
26
|
+
private dispatcher?;
|
|
25
27
|
constructor(credentials?: DevToCredentials);
|
|
26
28
|
getMyArticles(page?: number, perPage?: number): Promise<{
|
|
27
29
|
id: number;
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { config } from "../lib/config.js";
|
|
3
3
|
import { CredentialsError } from "../lib/errors.js";
|
|
4
4
|
import { fetchJson } from "../lib/http.js";
|
|
5
|
+
import { createProxyDispatcher } from "../lib/proxy.js";
|
|
5
6
|
const articleSchema = z.object({
|
|
6
7
|
id: z.number(),
|
|
7
8
|
title: z.string(),
|
|
@@ -37,6 +38,7 @@ const articleResponseSchema = z.object({
|
|
|
37
38
|
export class DevToService {
|
|
38
39
|
baseUrl = config.devto.baseUrl;
|
|
39
40
|
headers;
|
|
41
|
+
dispatcher;
|
|
40
42
|
constructor(credentials) {
|
|
41
43
|
const apiKey = credentials?.apiKey ?? config.devto.apiKey;
|
|
42
44
|
if (!apiKey) {
|
|
@@ -47,12 +49,13 @@ export class DevToService {
|
|
|
47
49
|
"Content-Type": "application/json",
|
|
48
50
|
Accept: "application/vnd.forem.api-v1+json",
|
|
49
51
|
};
|
|
52
|
+
this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
|
|
50
53
|
}
|
|
51
54
|
async getMyArticles(page = 1, perPage = 30) {
|
|
52
|
-
return fetchJson(`${this.baseUrl}/articles/me?page=${page}&per_page=${perPage}`, { method: "GET", headers: this.headers }, z.array(articleSchema));
|
|
55
|
+
return fetchJson(`${this.baseUrl}/articles/me?page=${page}&per_page=${perPage}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, z.array(articleSchema));
|
|
53
56
|
}
|
|
54
57
|
async getArticle(id) {
|
|
55
|
-
return fetchJson(`${this.baseUrl}/articles/${id}`, { method: "GET", headers: this.headers }, articleResponseSchema);
|
|
58
|
+
return fetchJson(`${this.baseUrl}/articles/${id}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, articleResponseSchema);
|
|
56
59
|
}
|
|
57
60
|
async createArticle(title, bodyMarkdown, tags = [], published = false, description, canonicalUrl, series, mainImage) {
|
|
58
61
|
const article = {
|
|
@@ -73,6 +76,7 @@ export class DevToService {
|
|
|
73
76
|
method: "POST",
|
|
74
77
|
headers: this.headers,
|
|
75
78
|
body: JSON.stringify({ article }),
|
|
79
|
+
dispatcher: this.dispatcher,
|
|
76
80
|
}, articleResponseSchema);
|
|
77
81
|
}
|
|
78
82
|
async updateArticle(id, updates) {
|
|
@@ -80,6 +84,7 @@ export class DevToService {
|
|
|
80
84
|
method: "PUT",
|
|
81
85
|
headers: this.headers,
|
|
82
86
|
body: JSON.stringify({ article: updates }),
|
|
87
|
+
dispatcher: this.dispatcher,
|
|
83
88
|
}, articleResponseSchema);
|
|
84
89
|
}
|
|
85
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devto-service.js","sourceRoot":"","sources":["../../src/services/devto-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"devto-service.js","sourceRoot":"","sources":["../../src/services/devto-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export interface HashnodeCredentials {
|
|
2
2
|
accessToken: string;
|
|
3
3
|
publicationId?: string;
|
|
4
|
+
proxyUrl?: string;
|
|
4
5
|
}
|
|
5
6
|
export declare class HashnodeService {
|
|
6
7
|
private baseUrl;
|
|
7
8
|
private accessToken;
|
|
8
9
|
private publicationId;
|
|
10
|
+
private dispatcher?;
|
|
9
11
|
constructor(credentials?: HashnodeCredentials);
|
|
10
12
|
private gql;
|
|
11
13
|
getPublication(publicationId?: string): Promise<{
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { config } from "../lib/config.js";
|
|
3
3
|
import { CredentialsError } from "../lib/errors.js";
|
|
4
|
+
import { createProxyDispatcher } from "../lib/proxy.js";
|
|
4
5
|
const publicationSchema = z.object({
|
|
5
6
|
id: z.string(),
|
|
6
7
|
title: z.string().optional(),
|
|
@@ -19,7 +20,8 @@ const postSchema = z.object({
|
|
|
19
20
|
responseCount: z.number().optional(),
|
|
20
21
|
});
|
|
21
22
|
const publishPostResponseSchema = z.object({
|
|
22
|
-
data: z
|
|
23
|
+
data: z
|
|
24
|
+
.object({
|
|
23
25
|
publishPost: z.object({
|
|
24
26
|
post: z.object({
|
|
25
27
|
id: z.string(),
|
|
@@ -28,38 +30,50 @@ const publishPostResponseSchema = z.object({
|
|
|
28
30
|
url: z.string().optional(),
|
|
29
31
|
}),
|
|
30
32
|
}),
|
|
31
|
-
})
|
|
33
|
+
})
|
|
34
|
+
.optional(),
|
|
32
35
|
errors: z.array(z.object({ message: z.string() })).optional(),
|
|
33
36
|
});
|
|
34
37
|
const publicationQuerySchema = z.object({
|
|
35
|
-
data: z
|
|
36
|
-
|
|
38
|
+
data: z
|
|
39
|
+
.object({
|
|
40
|
+
publication: z
|
|
41
|
+
.object({
|
|
37
42
|
id: z.string(),
|
|
38
43
|
title: z.string().optional(),
|
|
39
44
|
url: z.string().optional(),
|
|
40
45
|
displayTitle: z.string().optional(),
|
|
41
|
-
posts: z
|
|
46
|
+
posts: z
|
|
47
|
+
.object({
|
|
42
48
|
edges: z.array(z.object({ node: postSchema })),
|
|
43
|
-
pageInfo: z
|
|
49
|
+
pageInfo: z
|
|
50
|
+
.object({
|
|
44
51
|
hasNextPage: z.boolean().optional(),
|
|
45
52
|
endCursor: z.string().nullable().optional(),
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
})
|
|
54
|
+
.optional(),
|
|
55
|
+
})
|
|
56
|
+
.optional(),
|
|
57
|
+
})
|
|
58
|
+
.nullable(),
|
|
59
|
+
})
|
|
60
|
+
.optional(),
|
|
50
61
|
errors: z.array(z.object({ message: z.string() })).optional(),
|
|
51
62
|
});
|
|
52
63
|
export class HashnodeService {
|
|
53
64
|
baseUrl = config.hashnode.baseUrl;
|
|
54
65
|
accessToken;
|
|
55
66
|
publicationId;
|
|
67
|
+
dispatcher;
|
|
56
68
|
constructor(credentials) {
|
|
57
69
|
const accessToken = credentials?.accessToken ?? config.hashnode.accessToken;
|
|
58
70
|
if (!accessToken) {
|
|
59
71
|
throw new CredentialsError("Hashnode", ["HASHNODE_ACCESS_TOKEN"]);
|
|
60
72
|
}
|
|
61
73
|
this.accessToken = accessToken;
|
|
62
|
-
this.publicationId =
|
|
74
|
+
this.publicationId =
|
|
75
|
+
credentials?.publicationId ?? config.hashnode.publicationId;
|
|
76
|
+
this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
|
|
63
77
|
}
|
|
64
78
|
async gql(query, variables, schema) {
|
|
65
79
|
const response = await fetch(this.baseUrl, {
|
|
@@ -69,6 +83,7 @@ export class HashnodeService {
|
|
|
69
83
|
Authorization: this.accessToken,
|
|
70
84
|
},
|
|
71
85
|
body: JSON.stringify({ query, variables }),
|
|
86
|
+
dispatcher: this.dispatcher,
|
|
72
87
|
});
|
|
73
88
|
if (!response.ok) {
|
|
74
89
|
throw new Error(`Hashnode API error ${response.status}: ${response.statusText}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashnode-service.js","sourceRoot":"","sources":["../../src/services/hashnode-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hashnode-service.js","sourceRoot":"","sources":["../../src/services/hashnode-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "social-mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.1",
|
|
4
4
|
"description": "MCP server for posting and interacting across social media platforms: Twitter, Instagram, Facebook, WhatsApp, Discord, Telegram, Slack, LinkedIn, Reddit, Threads, TikTok, Pinterest, Medium, and Email (SMTP/SendGrid/Mailgun/SES)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|