social-mcp 2.6.0 → 2.7.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 (85) hide show
  1. package/README.md +46 -28
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/services/bluesky-service.d.ts +7 -1
  5. package/dist/services/bluesky-service.js +17 -2
  6. package/dist/services/bluesky-service.js.map +1 -1
  7. package/dist/services/facebook-service.d.ts +17 -1
  8. package/dist/services/facebook-service.js +63 -5
  9. package/dist/services/facebook-service.js.map +1 -1
  10. package/dist/services/ghost-service.d.ts +4 -1
  11. package/dist/services/ghost-service.js +55 -9
  12. package/dist/services/ghost-service.js.map +1 -1
  13. package/dist/services/instagram-service.d.ts +6 -1
  14. package/dist/services/instagram-service.js +40 -3
  15. package/dist/services/instagram-service.js.map +1 -1
  16. package/dist/services/linkedin-service.d.ts +9 -1
  17. package/dist/services/linkedin-service.js +65 -8
  18. package/dist/services/linkedin-service.js.map +1 -1
  19. package/dist/services/mastodon-service.d.ts +10 -1
  20. package/dist/services/mastodon-service.js +35 -6
  21. package/dist/services/mastodon-service.js.map +1 -1
  22. package/dist/services/pinterest-service.d.ts +28 -2
  23. package/dist/services/pinterest-service.js +32 -8
  24. package/dist/services/pinterest-service.js.map +1 -1
  25. package/dist/services/reddit-service.d.ts +10 -1
  26. package/dist/services/reddit-service.js +62 -5
  27. package/dist/services/reddit-service.js.map +1 -1
  28. package/dist/services/threads-service.d.ts +8 -1
  29. package/dist/services/threads-service.js +46 -7
  30. package/dist/services/threads-service.js.map +1 -1
  31. package/dist/services/tumblr-service.d.ts +25 -5
  32. package/dist/services/tumblr-service.js +51 -8
  33. package/dist/services/tumblr-service.js.map +1 -1
  34. package/dist/services/twitter-service.d.ts +13 -5
  35. package/dist/services/twitter-service.js +24 -3
  36. package/dist/services/twitter-service.js.map +1 -1
  37. package/dist/services/whatsapp-service.d.ts +10 -1
  38. package/dist/services/whatsapp-service.js +60 -9
  39. package/dist/services/whatsapp-service.js.map +1 -1
  40. package/dist/services/youtube-service.d.ts +21 -0
  41. package/dist/services/youtube-service.js +57 -7
  42. package/dist/services/youtube-service.js.map +1 -1
  43. package/dist/tools/bluesky-tools/create-post.d.ts +11 -1
  44. package/dist/tools/bluesky-tools/create-post.js +11 -2
  45. package/dist/tools/bluesky-tools/create-post.js.map +1 -1
  46. package/dist/tools/facebook-tools/create-post.d.ts +5 -1
  47. package/dist/tools/facebook-tools/create-post.js +12 -2
  48. package/dist/tools/facebook-tools/create-post.js.map +1 -1
  49. package/dist/tools/facebook-tools/create-video-post.d.ts +20 -0
  50. package/dist/tools/facebook-tools/create-video-post.js +31 -0
  51. package/dist/tools/facebook-tools/create-video-post.js.map +1 -0
  52. package/dist/tools/ghost-tools/create-post.d.ts +4 -0
  53. package/dist/tools/ghost-tools/create-post.js +27 -4
  54. package/dist/tools/ghost-tools/create-post.js.map +1 -1
  55. package/dist/tools/instagram-tools/create-post.d.ts +11 -1
  56. package/dist/tools/instagram-tools/create-post.js +8 -3
  57. package/dist/tools/instagram-tools/create-post.js.map +1 -1
  58. package/dist/tools/linkedin-tools/create-post.d.ts +5 -1
  59. package/dist/tools/linkedin-tools/create-post.js +9 -2
  60. package/dist/tools/linkedin-tools/create-post.js.map +1 -1
  61. package/dist/tools/mastodon-tools/create-post.d.ts +11 -1
  62. package/dist/tools/mastodon-tools/create-post.js +18 -2
  63. package/dist/tools/mastodon-tools/create-post.js.map +1 -1
  64. package/dist/tools/pinterest-tools/create-pin.d.ts +4 -2
  65. package/dist/tools/pinterest-tools/create-pin.js +8 -2
  66. package/dist/tools/pinterest-tools/create-pin.js.map +1 -1
  67. package/dist/tools/reddit-tools/submit-post.d.ts +9 -1
  68. package/dist/tools/reddit-tools/submit-post.js +19 -4
  69. package/dist/tools/reddit-tools/submit-post.js.map +1 -1
  70. package/dist/tools/threads-tools/create-post.d.ts +13 -1
  71. package/dist/tools/threads-tools/create-post.js +14 -2
  72. package/dist/tools/threads-tools/create-post.js.map +1 -1
  73. package/dist/tools/tumblr-tools/create-post.d.ts +4 -0
  74. package/dist/tools/tumblr-tools/create-post.js +39 -8
  75. package/dist/tools/tumblr-tools/create-post.js.map +1 -1
  76. package/dist/tools/twitter-tools/send-tweet.d.ts +9 -1
  77. package/dist/tools/twitter-tools/send-tweet.js +10 -2
  78. package/dist/tools/twitter-tools/send-tweet.js.map +1 -1
  79. package/dist/tools/whatsapp-tools/send-message.d.ts +19 -3
  80. package/dist/tools/whatsapp-tools/send-message.js +29 -3
  81. package/dist/tools/whatsapp-tools/send-message.js.map +1 -1
  82. package/dist/tools/youtube-tools/upload-video.d.ts +34 -0
  83. package/dist/tools/youtube-tools/upload-video.js +39 -0
  84. package/dist/tools/youtube-tools/upload-video.js.map +1 -0
  85. package/package.json +1 -1
@@ -3,6 +3,10 @@ import { z } from "zod";
3
3
  import { config } from "../lib/config.js";
4
4
  import { CredentialsError } from "../lib/errors.js";
5
5
  import { fetchJson } from "../lib/http.js";
6
+ import { createProxyDispatcher } from "../lib/proxy.js";
7
+ const imageUploadSchema = z.object({
8
+ images: z.array(z.object({ url: z.string() })),
9
+ });
6
10
  const postSchema = z.object({
7
11
  id: z.string(),
8
12
  title: z.string().optional(),
@@ -12,18 +16,24 @@ const postSchema = z.object({
12
16
  published_at: z.string().nullable().optional(),
13
17
  updated_at: z.string().nullable().optional(),
14
18
  excerpt: z.string().nullable().optional(),
15
- tags: z.array(z.object({ id: z.string(), name: z.string(), slug: z.string() })).optional(),
19
+ tags: z
20
+ .array(z.object({ id: z.string(), name: z.string(), slug: z.string() }))
21
+ .optional(),
16
22
  });
17
23
  const postsResponseSchema = z.object({
18
24
  posts: z.array(postSchema),
19
- meta: z.object({
20
- pagination: z.object({
25
+ meta: z
26
+ .object({
27
+ pagination: z
28
+ .object({
21
29
  page: z.number(),
22
30
  limit: z.number(),
23
31
  pages: z.number(),
24
32
  total: z.number(),
25
- }).optional(),
26
- }).optional(),
33
+ })
34
+ .optional(),
35
+ })
36
+ .optional(),
27
37
  });
28
38
  const singlePostResponseSchema = z.object({
29
39
  posts: z.array(postSchema),
@@ -32,11 +42,15 @@ export class GhostService {
32
42
  siteUrl;
33
43
  keyId;
34
44
  keySecret;
45
+ dispatcher;
35
46
  constructor(credentials) {
36
47
  const siteUrl = credentials?.siteUrl ?? config.ghost.siteUrl;
37
48
  const adminApiKey = credentials?.adminApiKey ?? config.ghost.adminApiKey;
38
49
  if (!siteUrl || !adminApiKey) {
39
- throw new CredentialsError("Ghost", ["GHOST_SITE_URL", "GHOST_ADMIN_API_KEY"]);
50
+ throw new CredentialsError("Ghost", [
51
+ "GHOST_SITE_URL",
52
+ "GHOST_ADMIN_API_KEY",
53
+ ]);
40
54
  }
41
55
  const parts = adminApiKey.split(":");
42
56
  if (parts.length !== 2) {
@@ -45,6 +59,7 @@ export class GhostService {
45
59
  this.siteUrl = siteUrl.replace(/\/$/, "");
46
60
  this.keyId = parts[0];
47
61
  this.keySecret = parts[1];
62
+ this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
48
63
  }
49
64
  generateJwt() {
50
65
  const now = Math.floor(Date.now() / 1000);
@@ -67,14 +82,40 @@ export class GhostService {
67
82
  return `${this.siteUrl}/ghost/api/admin`;
68
83
  }
69
84
  async getPosts(page = 1, limit = 10, status = "all") {
70
- const params = new URLSearchParams({ page: String(page), limit: String(limit), filter: `status:${status}` });
85
+ const params = new URLSearchParams({
86
+ page: String(page),
87
+ limit: String(limit),
88
+ filter: `status:${status}`,
89
+ });
71
90
  if (status === "all")
72
91
  params.delete("filter");
73
92
  else
74
93
  params.set("filter", `status:${status}`);
75
- return fetchJson(`${this.adminBase}/posts?${params}`, { method: "GET", headers: this.headers }, postsResponseSchema);
94
+ return fetchJson(`${this.adminBase}/posts?${params}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, postsResponseSchema);
95
+ }
96
+ // Ghost's Admin API supports image upload as its own endpoint — the returned
97
+ // URL is then just set on `feature_image` (or embedded in html/lexical) like any
98
+ // other image, no special reference type needed elsewhere.
99
+ async uploadImage(content, filename = "image.jpg") {
100
+ const formData = new FormData();
101
+ const buffer = Buffer.from(content, "base64");
102
+ formData.append("file", new Blob([buffer]), filename);
103
+ formData.append("purpose", "image");
104
+ const response = await fetch(`${this.adminBase}/images/upload/`, {
105
+ method: "POST",
106
+ headers: {
107
+ Authorization: this.headers.Authorization ?? "",
108
+ "Accept-Version": "v5.0",
109
+ },
110
+ body: formData,
111
+ dispatcher: this.dispatcher,
112
+ });
113
+ if (!response.ok) {
114
+ throw new Error(`Ghost image upload error (${response.status}): ${await response.text()}`);
115
+ }
116
+ return imageUploadSchema.parse(await response.json()).images[0]?.url ?? "";
76
117
  }
77
- async createPost(title, html, lexical, status = "draft", tags = [], excerpt, publishedAt) {
118
+ async createPost(title, html, lexical, status = "draft", tags = [], excerpt, publishedAt, featureImage) {
78
119
  const post = {
79
120
  title,
80
121
  status,
@@ -88,10 +129,13 @@ export class GhostService {
88
129
  post.custom_excerpt = excerpt;
89
130
  if (publishedAt)
90
131
  post.published_at = publishedAt;
132
+ if (featureImage)
133
+ post.feature_image = featureImage;
91
134
  return fetchJson(`${this.adminBase}/posts`, {
92
135
  method: "POST",
93
136
  headers: this.headers,
94
137
  body: JSON.stringify({ posts: [post] }),
138
+ dispatcher: this.dispatcher,
95
139
  }, singlePostResponseSchema);
96
140
  }
97
141
  async updatePost(id, updatedAt, updates) {
@@ -102,12 +146,14 @@ export class GhostService {
102
146
  method: "PUT",
103
147
  headers: this.headers,
104
148
  body: JSON.stringify({ posts: [body] }),
149
+ dispatcher: this.dispatcher,
105
150
  }, singlePostResponseSchema);
106
151
  }
107
152
  async deletePost(id) {
108
153
  const response = await fetch(`${this.adminBase}/posts/${id}`, {
109
154
  method: "DELETE",
110
155
  headers: this.headers,
156
+ dispatcher: this.dispatcher,
111
157
  });
112
158
  if (!response.ok) {
113
159
  throw new Error(`Ghost API error ${response.status}: ${response.statusText}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ghost-service.js","sourceRoot":"","sources":["../../src/services/ghost-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ghost-service.js","sourceRoot":"","sources":["../../src/services/ghost-service.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,14 @@
1
1
  export interface InstagramCredentials {
2
2
  accessToken: string;
3
+ proxyUrl?: string;
3
4
  }
4
5
  export declare class InstagramService {
5
6
  private baseUrl;
6
7
  private headers;
8
+ private dispatcher?;
7
9
  constructor(credentials?: InstagramCredentials);
8
- createPost(userId: string, imageUrl: string, caption: string): Promise<{
10
+ private waitUntilReady;
11
+ createPost(userId: string, mediaUrl: string, caption: string, mediaType?: "IMAGE" | "VIDEO" | "REELS"): Promise<{
9
12
  id: string;
10
13
  }>;
11
14
  getPosts(userId: string, limit?: number): Promise<{
@@ -14,6 +17,8 @@ export declare class InstagramService {
14
17
  media_type: string;
15
18
  timestamp: string;
16
19
  caption?: string | undefined;
20
+ media_url?: string | undefined;
21
+ permalink?: string | undefined;
17
22
  }[];
18
23
  }>;
19
24
  }
@@ -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 instagramMediaSchema = z.object({
6
7
  id: z.string(),
7
8
  });
@@ -9,14 +10,20 @@ const instagramMediaDetailSchema = z.object({
9
10
  id: z.string(),
10
11
  caption: z.string().optional(),
11
12
  media_type: z.string(),
13
+ media_url: z.string().optional(),
14
+ permalink: z.string().optional(),
12
15
  timestamp: z.string(),
13
16
  });
14
17
  const instagramMediaListSchema = z.object({
15
18
  data: z.array(instagramMediaDetailSchema),
16
19
  });
20
+ const containerStatusSchema = z.object({
21
+ status_code: z.string(),
22
+ });
17
23
  export class InstagramService {
18
24
  baseUrl = config.instagram.baseUrl;
19
25
  headers;
26
+ dispatcher;
20
27
  constructor(credentials) {
21
28
  const accessToken = credentials?.accessToken ?? config.instagram.accessToken;
22
29
  if (!accessToken) {
@@ -26,23 +33,53 @@ export class InstagramService {
26
33
  "Content-Type": "application/json",
27
34
  Authorization: `Bearer ${accessToken}`,
28
35
  };
36
+ this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
37
+ }
38
+ // Video/Reels containers process asynchronously — publishing before status_code
39
+ // reaches FINISHED fails the publish call outright rather than just being slow.
40
+ async waitUntilReady(containerId, timeoutMs = 90_000) {
41
+ const start = Date.now();
42
+ while (Date.now() - start < timeoutMs) {
43
+ const status = await fetchJson(`${this.baseUrl}/${containerId}?fields=status_code`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, containerStatusSchema);
44
+ if (status.status_code === "FINISHED")
45
+ return;
46
+ if (status.status_code === "ERROR" || status.status_code === "EXPIRED") {
47
+ throw new Error(`Instagram media container failed to process (${status.status_code})`);
48
+ }
49
+ await new Promise((resolve) => setTimeout(resolve, 2000));
50
+ }
51
+ throw new Error("Timed out waiting for Instagram media container to finish processing");
29
52
  }
30
- async createPost(userId, imageUrl, caption) {
53
+ async createPost(userId, mediaUrl, caption, mediaType = "IMAGE") {
54
+ const body = { caption };
55
+ if (mediaType === "IMAGE") {
56
+ body.image_url = mediaUrl;
57
+ }
58
+ else {
59
+ body.media_type = mediaType;
60
+ body.video_url = mediaUrl;
61
+ }
31
62
  const containerResponse = await fetchJson(`${this.baseUrl}/${userId}/media`, {
32
63
  method: "POST",
33
64
  headers: this.headers,
34
- body: JSON.stringify({ image_url: imageUrl, caption }),
65
+ body: JSON.stringify(body),
66
+ dispatcher: this.dispatcher,
35
67
  }, z.object({ id: z.string() }));
68
+ if (mediaType !== "IMAGE") {
69
+ await this.waitUntilReady(containerResponse.id);
70
+ }
36
71
  return fetchJson(`${this.baseUrl}/${userId}/media_publish`, {
37
72
  method: "POST",
38
73
  headers: this.headers,
39
74
  body: JSON.stringify({ creation_id: containerResponse.id }),
75
+ dispatcher: this.dispatcher,
40
76
  }, instagramMediaSchema);
41
77
  }
42
78
  async getPosts(userId, limit = 10) {
43
- return fetchJson(`${this.baseUrl}/${userId}/media?fields=id,caption,media_type,timestamp&limit=${limit}`, {
79
+ return fetchJson(`${this.baseUrl}/${userId}/media?fields=id,caption,media_type,media_url,permalink,timestamp&limit=${limit}`, {
44
80
  method: "GET",
45
81
  headers: this.headers,
82
+ dispatcher: this.dispatcher,
46
83
  }, instagramMediaListSchema);
47
84
  }
48
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instagram-service.js","sourceRoot":"","sources":["../../src/services/instagram-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;AAE3C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC;CACzC,CAAC,CAAC;AAMH,MAAM,OAAO,gBAAgB;IACpB,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACnC,OAAO,CAAyB;IAExC,YAAY,WAAkC;QAC7C,MAAM,WAAW,GAAG,WAAW,EAAE,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;QAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;SACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAe;QACjE,MAAM,iBAAiB,GAAG,MAAM,SAAS,CACxC,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,QAAQ,EACjC;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SACtD,EACD,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC5B,CAAC;QACF,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,gBAAgB,EACzC;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC;SAC3D,EACD,oBAAoB,CACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAK,GAAG,EAAE;QACxC,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,uDAAuD,KAAK,EAAE,EACvF;YACC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,EACD,wBAAwB,CACxB,CAAC;IACH,CAAC;CACD;AAED,IAAI,SAAuC,CAAC;AAC5C,MAAM,UAAU,mBAAmB;IAClC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnD,OAAO,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"instagram-service.js","sourceRoot":"","sources":["../../src/services/instagram-service.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
1
1
  export interface LinkedInCredentials {
2
2
  accessToken: string;
3
+ proxyUrl?: string;
4
+ }
5
+ export interface LinkedInImage {
6
+ /** Base64-encoded image bytes. */
7
+ content: string;
8
+ title?: string;
3
9
  }
4
10
  export declare class LinkedInService {
5
11
  private baseUrl;
6
12
  private headers;
13
+ private dispatcher?;
7
14
  constructor(credentials?: LinkedInCredentials);
8
15
  getProfile(): Promise<{
9
16
  id: string;
@@ -11,7 +18,8 @@ export declare class LinkedInService {
11
18
  localizedLastName?: string | undefined;
12
19
  localizedHeadline?: string | undefined;
13
20
  }>;
14
- createPost(authorUrn: string, text: string, visibility?: string): Promise<{
21
+ private uploadImage;
22
+ createPost(authorUrn: string, text: string, visibility?: string, image?: LinkedInImage): Promise<{
15
23
  id: string;
16
24
  }>;
17
25
  getPosts(authorUrn: string, count?: number): Promise<{
@@ -2,6 +2,17 @@ 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";
6
+ const registerUploadSchema = z.object({
7
+ value: z.object({
8
+ asset: z.string(),
9
+ uploadMechanism: z.object({
10
+ "com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest": z.object({
11
+ uploadUrl: z.string(),
12
+ }),
13
+ }),
14
+ }),
15
+ });
5
16
  const linkedInProfileSchema = z.object({
6
17
  id: z.string(),
7
18
  localizedFirstName: z.string().optional(),
@@ -52,6 +63,7 @@ const linkedInSearchResponseSchema = z.object({
52
63
  export class LinkedInService {
53
64
  baseUrl = config.linkedin.baseUrl;
54
65
  headers;
66
+ dispatcher;
55
67
  constructor(credentials) {
56
68
  const accessToken = credentials?.accessToken ?? config.linkedin.accessToken;
57
69
  if (!accessToken) {
@@ -62,19 +74,60 @@ export class LinkedInService {
62
74
  Authorization: `Bearer ${accessToken}`,
63
75
  "X-Restli-Protocol-Version": "2.0.0",
64
76
  };
77
+ this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
65
78
  }
66
79
  async getProfile() {
67
- return fetchJson(`${this.baseUrl}/me`, { method: "GET", headers: this.headers }, linkedInProfileSchema);
80
+ return fetchJson(`${this.baseUrl}/me`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, linkedInProfileSchema);
81
+ }
82
+ // LinkedIn's UGC API has no "give me a URL" shortcut for media — every image goes
83
+ // through: register an upload slot, PUT the bytes to it, then reference the asset
84
+ // URN it gave you. Three round trips just to attach one picture.
85
+ async uploadImage(authorUrn, content) {
86
+ const registered = await fetchJson(`${this.baseUrl}/assets?action=registerUpload`, {
87
+ method: "POST",
88
+ headers: this.headers,
89
+ body: JSON.stringify({
90
+ registerUploadRequest: {
91
+ recipes: ["urn:li:digitalmediaRecipe:feedshare-image"],
92
+ owner: authorUrn,
93
+ serviceRelationships: [
94
+ {
95
+ relationshipType: "OWNER",
96
+ identifier: "urn:li:userGeneratedContent",
97
+ },
98
+ ],
99
+ },
100
+ }),
101
+ dispatcher: this.dispatcher,
102
+ }, registerUploadSchema);
103
+ const uploadUrl = registered.value.uploadMechanism["com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"].uploadUrl;
104
+ const uploadRes = await fetch(uploadUrl, {
105
+ method: "PUT",
106
+ headers: { Authorization: this.headers.Authorization ?? "" },
107
+ body: Buffer.from(content, "base64"),
108
+ dispatcher: this.dispatcher,
109
+ });
110
+ if (!uploadRes.ok) {
111
+ throw new Error(`LinkedIn image upload error (${uploadRes.status}): ${await uploadRes.text()}`);
112
+ }
113
+ return registered.value.asset;
68
114
  }
69
- async createPost(authorUrn, text, visibility = "PUBLIC") {
115
+ async createPost(authorUrn, text, visibility = "PUBLIC", image) {
116
+ const shareContent = {
117
+ shareCommentary: { text },
118
+ shareMediaCategory: image ? "IMAGE" : "NONE",
119
+ };
120
+ if (image) {
121
+ const asset = await this.uploadImage(authorUrn, image.content);
122
+ shareContent.media = [
123
+ { status: "READY", media: asset, title: { text: image.title ?? "" } },
124
+ ];
125
+ }
70
126
  const body = {
71
127
  author: authorUrn,
72
128
  lifecycleState: "PUBLISHED",
73
129
  specificContent: {
74
- "com.linkedin.ugc.ShareContent": {
75
- shareCommentary: { text },
76
- shareMediaCategory: "NONE",
77
- },
130
+ "com.linkedin.ugc.ShareContent": shareContent,
78
131
  },
79
132
  visibility: {
80
133
  "com.linkedin.ugc.MemberNetworkVisibility": visibility,
@@ -84,11 +137,12 @@ export class LinkedInService {
84
137
  method: "POST",
85
138
  headers: this.headers,
86
139
  body: JSON.stringify(body),
140
+ dispatcher: this.dispatcher,
87
141
  }, linkedInUGCPostSchema);
88
142
  }
89
143
  async getPosts(authorUrn, count = 10) {
90
144
  const encoded = encodeURIComponent(authorUrn);
91
- return fetchJson(`${this.baseUrl}/ugcPosts?q=authors&authors=List(${encoded})&count=${count}`, { method: "GET", headers: this.headers }, linkedInPostsResponseSchema);
145
+ return fetchJson(`${this.baseUrl}/ugcPosts?q=authors&authors=List(${encoded})&count=${count}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, linkedInPostsResponseSchema);
92
146
  }
93
147
  async likePost(actorUrn, ugcPostUrn) {
94
148
  const encoded = encodeURIComponent(ugcPostUrn);
@@ -100,6 +154,7 @@ export class LinkedInService {
100
154
  method: "POST",
101
155
  headers: this.headers,
102
156
  body: JSON.stringify(body),
157
+ dispatcher: this.dispatcher,
103
158
  }, linkedInShareSchema);
104
159
  }
105
160
  async addComment(actorUrn, ugcPostUrn, text) {
@@ -113,6 +168,7 @@ export class LinkedInService {
113
168
  method: "POST",
114
169
  headers: this.headers,
115
170
  body: JSON.stringify(body),
171
+ dispatcher: this.dispatcher,
116
172
  }, linkedInShareSchema);
117
173
  }
118
174
  async deletePost(ugcPostUrn) {
@@ -120,6 +176,7 @@ export class LinkedInService {
120
176
  const response = await fetch(`${this.baseUrl}/ugcPosts/${encoded}`, {
121
177
  method: "DELETE",
122
178
  headers: this.headers,
179
+ dispatcher: this.dispatcher,
123
180
  });
124
181
  if (!response.ok) {
125
182
  throw new Error(`LinkedIn API error ${response.status}: ${await response.text()}`);
@@ -131,7 +188,7 @@ export class LinkedInService {
131
188
  keywords,
132
189
  count: String(count),
133
190
  });
134
- return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers }, linkedInSearchResponseSchema);
191
+ return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, linkedInSearchResponseSchema);
135
192
  }
136
193
  }
137
194
  let _instance;
@@ -1 +1 @@
1
- {"version":3,"file":"linkedin-service.js","sourceRoot":"","sources":["../../src/services/linkedin-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;AAE3C,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAChB,CAAC,CAAC,MAAM,CAAC;QACR,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,CAAC;aACR,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,CAAC;aACD,QAAQ,EAAE;QACZ,eAAe,EAAE,CAAC;aAChB,MAAM,CAAC;YACP,+BAA+B,EAAE,CAAC;iBAChC,MAAM,CAAC;gBACP,eAAe,EAAE,CAAC;qBAChB,MAAM,CAAC;oBACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;iBAChB,CAAC;qBACD,QAAQ,EAAE;aACZ,CAAC;iBACD,QAAQ,EAAE;SACZ,CAAC;aACD,QAAQ,EAAE;KACZ,CAAC,CACF;CACD,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAChB,CAAC,CAAC,MAAM,CAAC;QACR,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACxC,CAAC,CACF;IACD,QAAQ,EAAE,CAAC;SACT,MAAM,CAAC;QACP,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC1C,CAAC;SACD,QAAQ,EAAE;CACZ,CAAC,CAAC;AAMH,MAAM,OAAO,eAAe;IACnB,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IAClC,OAAO,CAAyB;IAExC,YAAY,WAAiC;QAC5C,MAAM,WAAW,GAAG,WAAW,EAAE,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5E,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,2BAA2B,EAAE,OAAO;SACpC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACf,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,KAAK,EACpB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACxC,qBAAqB,CACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,IAAY,EAAE,UAAU,GAAG,QAAQ;QACtE,MAAM,IAAI,GAAG;YACZ,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,WAAW;YAC3B,eAAe,EAAE;gBAChB,+BAA+B,EAAE;oBAChC,eAAe,EAAE,EAAE,IAAI,EAAE;oBACzB,kBAAkB,EAAE,MAAM;iBAC1B;aACD;YACD,UAAU,EAAE;gBACX,0CAA0C,EAAE,UAAU;aACtD;SACD,CAAC;QACF,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,WAAW,EAC1B;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC1B,EACD,qBAAqB,CACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,oCAAoC,OAAO,WAAW,KAAK,EAAE,EAC5E,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACxC,2BAA2B,CAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAkB;QAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,UAAU;SAClB,CAAC;QACF,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,kBAAkB,OAAO,QAAQ,EAChD;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC1B,EACD,mBAAmB,CACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,UAAkB,EAAE,IAAY;QAClE,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,EAAE,IAAI,EAAE;SACjB,CAAC;QACF,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,kBAAkB,OAAO,WAAW,EACnD;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC1B,EACD,mBAAmB,CACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QAClC,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,OAAO,EAAE,EAAE;YACnE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACd,sBAAsB,QAAQ,CAAC,MAAM,KAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CACjE,CAAC;QACH,CAAC;IACF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,KAAK,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YAClC,CAAC,EAAE,QAAQ;YACX,QAAQ;YACR,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACpB,CAAC,CAAC;QACH,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,WAAW,MAAM,EAAE,EAClC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACxC,4BAA4B,CAC5B,CAAC;IACH,CAAC;CACD;AAED,IAAI,SAAsC,CAAC;AAC3C,MAAM,UAAU,kBAAkB;IACjC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IAClD,OAAO,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"linkedin-service.js","sourceRoot":"","sources":["../../src/services/linkedin-service.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
1
  export interface MastodonCredentials {
2
2
  accessToken: string;
3
3
  instanceUrl?: string;
4
+ proxyUrl?: string;
5
+ }
6
+ export interface MastodonMediaAttachment {
7
+ /** Base64-encoded file bytes. */
8
+ content: string;
9
+ filename?: string;
10
+ description?: string;
4
11
  }
5
12
  export declare class MastodonService {
6
13
  private baseUrl;
7
14
  private headers;
15
+ private dispatcher?;
8
16
  constructor(credentials?: MastodonCredentials);
9
17
  getProfile(): Promise<{
10
18
  id: string;
@@ -17,7 +25,8 @@ export declare class MastodonService {
17
25
  statuses_count?: number | undefined;
18
26
  url?: string | undefined;
19
27
  }>;
20
- createPost(status: string, visibility?: "public" | "unlisted" | "private" | "direct"): Promise<{
28
+ uploadMedia(attachment: MastodonMediaAttachment): Promise<string>;
29
+ createPost(status: string, visibility?: "public" | "unlisted" | "private" | "direct", mediaIds?: string[]): Promise<{
21
30
  id: string;
22
31
  content: string;
23
32
  url?: string | undefined;
@@ -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 mastodonAccountSchema = z.object({
6
7
  id: z.string(),
7
8
  username: z.string(),
@@ -28,6 +29,7 @@ const mastodonSearchSchema = z.object({
28
29
  export class MastodonService {
29
30
  baseUrl;
30
31
  headers;
32
+ dispatcher;
31
33
  constructor(credentials) {
32
34
  const accessToken = credentials?.accessToken ?? config.mastodon.accessToken;
33
35
  const instanceUrl = credentials?.instanceUrl ?? config.mastodon.instanceUrl;
@@ -39,15 +41,40 @@ export class MastodonService {
39
41
  "Content-Type": "application/json",
40
42
  Authorization: `Bearer ${accessToken}`,
41
43
  };
44
+ this.dispatcher = createProxyDispatcher(credentials?.proxyUrl);
42
45
  }
43
46
  async getProfile() {
44
- return fetchJson(`${this.baseUrl}/accounts/verify_credentials`, { method: "GET", headers: this.headers }, mastodonAccountSchema);
47
+ return fetchJson(`${this.baseUrl}/accounts/verify_credentials`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, mastodonAccountSchema);
45
48
  }
46
- async createPost(status, visibility = "public") {
49
+ // v2/media uploads a file and returns its attachment id, which a status then
50
+ // references via media_ids — Mastodon has no way to carry bytes inline on a post.
51
+ async uploadMedia(attachment) {
52
+ const formData = new FormData();
53
+ const buffer = Buffer.from(attachment.content, "base64");
54
+ formData.append("file", new Blob([buffer]), attachment.filename ?? "file");
55
+ if (attachment.description)
56
+ formData.append("description", attachment.description);
57
+ const response = await fetch(`${this.baseUrl.replace("/api/v1", "/api/v2")}/media`, {
58
+ method: "POST",
59
+ headers: { Authorization: this.headers.Authorization ?? "" },
60
+ body: formData,
61
+ dispatcher: this.dispatcher,
62
+ });
63
+ if (!response.ok) {
64
+ throw new Error(`Mastodon media upload error (${response.status}): ${await response.text()}`);
65
+ }
66
+ return z.object({ id: z.string() }).parse(await response.json()).id;
67
+ }
68
+ async createPost(status, visibility = "public", mediaIds) {
47
69
  return fetchJson(`${this.baseUrl}/statuses`, {
48
70
  method: "POST",
49
71
  headers: this.headers,
50
- body: JSON.stringify({ status, visibility }),
72
+ body: JSON.stringify({
73
+ status,
74
+ visibility,
75
+ ...(mediaIds?.length ? { media_ids: mediaIds } : {}),
76
+ }),
77
+ dispatcher: this.dispatcher,
51
78
  }, mastodonStatusSchema);
52
79
  }
53
80
  async replyToPost(status, inReplyToId, visibility = "public") {
@@ -59,22 +86,24 @@ export class MastodonService {
59
86
  in_reply_to_id: inReplyToId,
60
87
  visibility,
61
88
  }),
89
+ dispatcher: this.dispatcher,
62
90
  }, mastodonStatusSchema);
63
91
  }
64
92
  async deletePost(statusId) {
65
93
  const response = await fetch(`${this.baseUrl}/statuses/${statusId}`, {
66
94
  method: "DELETE",
67
95
  headers: this.headers,
96
+ dispatcher: this.dispatcher,
68
97
  });
69
98
  if (!response.ok) {
70
99
  throw new Error(`Mastodon API error ${response.status}: ${await response.text()}`);
71
100
  }
72
101
  }
73
102
  async boostPost(statusId) {
74
- return fetchJson(`${this.baseUrl}/statuses/${statusId}/reblog`, { method: "POST", headers: this.headers }, mastodonStatusSchema);
103
+ return fetchJson(`${this.baseUrl}/statuses/${statusId}/reblog`, { method: "POST", headers: this.headers, dispatcher: this.dispatcher }, mastodonStatusSchema);
75
104
  }
76
105
  async favouritePost(statusId) {
77
- return fetchJson(`${this.baseUrl}/statuses/${statusId}/favourite`, { method: "POST", headers: this.headers }, mastodonStatusSchema);
106
+ return fetchJson(`${this.baseUrl}/statuses/${statusId}/favourite`, { method: "POST", headers: this.headers, dispatcher: this.dispatcher }, mastodonStatusSchema);
78
107
  }
79
108
  async searchPosts(query, limit = 10) {
80
109
  const params = new URLSearchParams({
@@ -82,7 +111,7 @@ export class MastodonService {
82
111
  type: "statuses",
83
112
  limit: String(limit),
84
113
  });
85
- return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers }, mastodonSearchSchema);
114
+ return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers, dispatcher: this.dispatcher }, mastodonSearchSchema);
86
115
  }
87
116
  }
88
117
  let _instance;
@@ -1 +1 @@
1
- {"version":3,"file":"mastodon-service.js","sourceRoot":"","sources":["../../src/services/mastodon-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mastodon-service.js","sourceRoot":"","sources":["../../src/services/mastodon-service.ts"],"names":[],"mappings":"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"}