@muhammadhamidraza/social-media-mcp-server 1.0.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -0
  3. package/dist/config.d.ts +92 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +66 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +37 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/platforms/facebook.d.ts +23 -0
  12. package/dist/platforms/facebook.d.ts.map +1 -0
  13. package/dist/platforms/facebook.js +145 -0
  14. package/dist/platforms/facebook.js.map +1 -0
  15. package/dist/platforms/index.d.ts +4 -0
  16. package/dist/platforms/index.d.ts.map +1 -0
  17. package/dist/platforms/index.js +29 -0
  18. package/dist/platforms/index.js.map +1 -0
  19. package/dist/platforms/instagram.d.ts +22 -0
  20. package/dist/platforms/instagram.d.ts.map +1 -0
  21. package/dist/platforms/instagram.js +95 -0
  22. package/dist/platforms/instagram.js.map +1 -0
  23. package/dist/platforms/linkedin.d.ts +27 -0
  24. package/dist/platforms/linkedin.d.ts.map +1 -0
  25. package/dist/platforms/linkedin.js +157 -0
  26. package/dist/platforms/linkedin.js.map +1 -0
  27. package/dist/platforms/platform.d.ts +12 -0
  28. package/dist/platforms/platform.d.ts.map +1 -0
  29. package/dist/platforms/platform.js +2 -0
  30. package/dist/platforms/platform.js.map +1 -0
  31. package/dist/platforms/tiktok.d.ts +22 -0
  32. package/dist/platforms/tiktok.d.ts.map +1 -0
  33. package/dist/platforms/tiktok.js +95 -0
  34. package/dist/platforms/tiktok.js.map +1 -0
  35. package/dist/platforms/twitter.d.ts +23 -0
  36. package/dist/platforms/twitter.d.ts.map +1 -0
  37. package/dist/platforms/twitter.js +156 -0
  38. package/dist/platforms/twitter.js.map +1 -0
  39. package/dist/platforms/youtube.d.ts +23 -0
  40. package/dist/platforms/youtube.d.ts.map +1 -0
  41. package/dist/platforms/youtube.js +177 -0
  42. package/dist/platforms/youtube.js.map +1 -0
  43. package/package.json +49 -0
@@ -0,0 +1,95 @@
1
+ export class InstagramPlatform {
2
+ name = "instagram";
3
+ accessToken;
4
+ baseUrl = "https://graph.instagram.com/me";
5
+ constructor(config) {
6
+ this.accessToken = config.accessToken;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ name: "instagram_get_media",
12
+ description: "Get Instagram media/posts",
13
+ inputSchema: {
14
+ type: "object",
15
+ properties: {
16
+ limit: {
17
+ type: "number",
18
+ description: "Number of media items to retrieve",
19
+ default: 10
20
+ }
21
+ }
22
+ }
23
+ },
24
+ {
25
+ name: "instagram_get_insights",
26
+ description: "Get Instagram account insights",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ metric: {
31
+ type: "string",
32
+ description: "Insight metric (impressions, reach, profile_views, etc.)"
33
+ }
34
+ },
35
+ required: ["metric"]
36
+ }
37
+ }
38
+ ];
39
+ }
40
+ async executeTool(name, args) {
41
+ switch (name) {
42
+ case "instagram_get_media":
43
+ return this.getMedia(args);
44
+ case "instagram_get_insights":
45
+ return this.getInsights(args);
46
+ default:
47
+ throw new Error(`Unknown tool: ${name}`);
48
+ }
49
+ }
50
+ async getMedia(args) {
51
+ const limit = args.limit || 10;
52
+ const url = new URL(`${this.baseUrl}/media`);
53
+ url.searchParams.append("access_token", this.accessToken);
54
+ url.searchParams.append("fields", "id,caption,media_type,media_url,permalink,timestamp");
55
+ url.searchParams.append("limit", limit.toString());
56
+ try {
57
+ const response = await fetch(url.toString());
58
+ if (!response.ok) {
59
+ throw new Error(`Instagram API error: ${response.status} ${response.statusText}`);
60
+ }
61
+ const data = await response.json();
62
+ return {
63
+ content: [{
64
+ type: "text",
65
+ text: JSON.stringify(data.data, null, 2)
66
+ }]
67
+ };
68
+ }
69
+ catch (error) {
70
+ throw new Error(`Failed to get Instagram media: ${error}`);
71
+ }
72
+ }
73
+ async getInsights(args) {
74
+ const url = new URL(`${this.baseUrl}/insights`);
75
+ url.searchParams.append("access_token", this.accessToken);
76
+ url.searchParams.append("metric", args.metric);
77
+ try {
78
+ const response = await fetch(url.toString());
79
+ if (!response.ok) {
80
+ throw new Error(`Instagram API error: ${response.status} ${response.statusText}`);
81
+ }
82
+ const data = await response.json();
83
+ return {
84
+ content: [{
85
+ type: "text",
86
+ text: JSON.stringify(data.data, null, 2)
87
+ }]
88
+ };
89
+ }
90
+ catch (error) {
91
+ throw new Error(`Failed to get Instagram insights: ${error}`);
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=instagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/platforms/instagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { Platform } from "./platform.js";
3
+ interface LinkedInConfig {
4
+ clientId: string;
5
+ clientSecret: string;
6
+ }
7
+ export declare class LinkedInPlatform implements Platform {
8
+ name: string;
9
+ private clientId;
10
+ private clientSecret;
11
+ private accessToken;
12
+ private baseUrl;
13
+ constructor(config: LinkedInConfig);
14
+ getTools(): Tool[];
15
+ executeTool(name: string, args: unknown): Promise<{
16
+ content: Array<{
17
+ type: string;
18
+ text: string;
19
+ }>;
20
+ }>;
21
+ private authenticate;
22
+ private createPost;
23
+ private getProfile;
24
+ private getPersonId;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=linkedin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../../src/platforms/linkedin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,IAAI,SAAc;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAiC;gBAEpC,MAAM,EAAE,cAAc;IAKlC,QAAQ,IAAI,IAAI,EAAE;IAiCZ,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QACtD,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;YAgBY,YAAY;YA6BZ,UAAU;YA8CV,UAAU;YA0BV,WAAW;CAe1B"}
@@ -0,0 +1,157 @@
1
+ export class LinkedInPlatform {
2
+ name = "linkedin";
3
+ clientId;
4
+ clientSecret;
5
+ accessToken = null;
6
+ baseUrl = "https://api.linkedin.com/v2";
7
+ constructor(config) {
8
+ this.clientId = config.clientId;
9
+ this.clientSecret = config.clientSecret;
10
+ }
11
+ getTools() {
12
+ return [
13
+ {
14
+ name: "linkedin_post",
15
+ description: "Create a post on LinkedIn",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ text: {
20
+ type: "string",
21
+ description: "Post content text"
22
+ },
23
+ visibility: {
24
+ type: "string",
25
+ description: "Post visibility (PUBLIC or CONNECTIONS)",
26
+ enum: ["PUBLIC", "CONNECTIONS"],
27
+ default: "PUBLIC"
28
+ }
29
+ },
30
+ required: ["text"]
31
+ }
32
+ },
33
+ {
34
+ name: "linkedin_get_profile",
35
+ description: "Get LinkedIn profile information",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {}
39
+ }
40
+ }
41
+ ];
42
+ }
43
+ async executeTool(name, args) {
44
+ if (!this.accessToken) {
45
+ await this.authenticate();
46
+ }
47
+ switch (name) {
48
+ case "linkedin_post":
49
+ return this.createPost(args);
50
+ case "linkedin_get_profile":
51
+ return this.getProfile();
52
+ default:
53
+ throw new Error(`Unknown tool: ${name}`);
54
+ }
55
+ }
56
+ async authenticate() {
57
+ const tokenUrl = "https://www.linkedin.com/oauth/v2/accessToken";
58
+ const params = new URLSearchParams({
59
+ grant_type: "client_credentials",
60
+ client_id: this.clientId,
61
+ client_secret: this.clientSecret
62
+ });
63
+ try {
64
+ const response = await fetch(tokenUrl, {
65
+ method: "POST",
66
+ headers: {
67
+ "Content-Type": "application/x-www-form-urlencoded"
68
+ },
69
+ body: params
70
+ });
71
+ if (!response.ok) {
72
+ throw new Error(`LinkedIn auth error: ${response.status} ${response.statusText}`);
73
+ }
74
+ const data = await response.json();
75
+ this.accessToken = data.access_token;
76
+ }
77
+ catch (error) {
78
+ throw new Error(`Failed to authenticate with LinkedIn: ${error}`);
79
+ }
80
+ }
81
+ async createPost(args) {
82
+ const visibility = args.visibility || "PUBLIC";
83
+ try {
84
+ const response = await fetch(`${this.baseUrl}/ugcPosts`, {
85
+ method: "POST",
86
+ headers: {
87
+ "Authorization": `Bearer ${this.accessToken}`,
88
+ "Content-Type": "application/json",
89
+ "X-Restli-Protocol-Version": "2.0.0"
90
+ },
91
+ body: JSON.stringify({
92
+ author: `urn:li:person:${await this.getPersonId()}`,
93
+ lifecycleState: "PUBLISHED",
94
+ specificContent: {
95
+ "com.linkedin.ugc.ShareContent": {
96
+ shareCommentary: {
97
+ text: args.text
98
+ },
99
+ shareMediaCategory: "NONE"
100
+ }
101
+ },
102
+ visibility: {
103
+ "com.linkedin.ugc.MemberNetworkVisibility": visibility
104
+ }
105
+ })
106
+ });
107
+ if (!response.ok) {
108
+ throw new Error(`LinkedIn API error: ${response.status} ${response.statusText}`);
109
+ }
110
+ const data = await response.json();
111
+ return {
112
+ content: [{
113
+ type: "text",
114
+ text: `Post created successfully! ID: ${data.id}`
115
+ }]
116
+ };
117
+ }
118
+ catch (error) {
119
+ throw new Error(`Failed to create LinkedIn post: ${error}`);
120
+ }
121
+ }
122
+ async getProfile() {
123
+ try {
124
+ const response = await fetch(`${this.baseUrl}/me`, {
125
+ headers: {
126
+ "Authorization": `Bearer ${this.accessToken}`
127
+ }
128
+ });
129
+ if (!response.ok) {
130
+ throw new Error(`LinkedIn API error: ${response.status} ${response.statusText}`);
131
+ }
132
+ const data = await response.json();
133
+ return {
134
+ content: [{
135
+ type: "text",
136
+ text: JSON.stringify(data, null, 2)
137
+ }]
138
+ };
139
+ }
140
+ catch (error) {
141
+ throw new Error(`Failed to get LinkedIn profile: ${error}`);
142
+ }
143
+ }
144
+ async getPersonId() {
145
+ const response = await fetch(`${this.baseUrl}/me`, {
146
+ headers: {
147
+ "Authorization": `Bearer ${this.accessToken}`
148
+ }
149
+ });
150
+ if (!response.ok) {
151
+ throw new Error("Failed to get person ID");
152
+ }
153
+ const data = await response.json();
154
+ return data.id;
155
+ }
156
+ }
157
+ //# sourceMappingURL=linkedin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/platforms/linkedin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export interface Platform {
3
+ name: string;
4
+ getTools(): Tool[];
5
+ executeTool(name: string, args: unknown): Promise<{
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ }>;
11
+ }
12
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/platforms/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,IAAI,IAAI,EAAE,CAAC;IACnB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QAChD,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platforms/platform.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { Platform } from "./platform.js";
3
+ interface TikTokConfig {
4
+ accessToken: string;
5
+ }
6
+ export declare class TikTokPlatform implements Platform {
7
+ name: string;
8
+ private accessToken;
9
+ private baseUrl;
10
+ constructor(config: TikTokConfig);
11
+ getTools(): Tool[];
12
+ executeTool(name: string, args: unknown): Promise<{
13
+ content: Array<{
14
+ type: string;
15
+ text: string;
16
+ }>;
17
+ }>;
18
+ private getUserInfo;
19
+ private getVideos;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=tiktok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../src/platforms/tiktok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAC7C,IAAI,SAAY;IAChB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAoC;gBAEvC,MAAM,EAAE,YAAY;IAIhC,QAAQ,IAAI,IAAI,EAAE;IA2BZ,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QACtD,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;YAWY,WAAW;YA6BX,SAAS;CA8BxB"}
@@ -0,0 +1,95 @@
1
+ export class TikTokPlatform {
2
+ name = "tiktok";
3
+ accessToken;
4
+ baseUrl = "https://open.tiktokapis.com/v2";
5
+ constructor(config) {
6
+ this.accessToken = config.accessToken;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ name: "tiktok_get_user_info",
12
+ description: "Get TikTok user information",
13
+ inputSchema: {
14
+ type: "object",
15
+ properties: {}
16
+ }
17
+ },
18
+ {
19
+ name: "tiktok_get_videos",
20
+ description: "Get TikTok user videos",
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ maxCount: {
25
+ type: "number",
26
+ description: "Maximum number of videos (default: 10)",
27
+ default: 10
28
+ }
29
+ }
30
+ }
31
+ }
32
+ ];
33
+ }
34
+ async executeTool(name, args) {
35
+ switch (name) {
36
+ case "tiktok_get_user_info":
37
+ return this.getUserInfo();
38
+ case "tiktok_get_videos":
39
+ return this.getVideos(args);
40
+ default:
41
+ throw new Error(`Unknown tool: ${name}`);
42
+ }
43
+ }
44
+ async getUserInfo() {
45
+ const url = new URL(`${this.baseUrl}/user/info/`);
46
+ url.searchParams.append("fields", "open_id,union_id,avatar_url,display_name");
47
+ try {
48
+ const response = await fetch(url.toString(), {
49
+ headers: {
50
+ "Authorization": `Bearer ${this.accessToken}`
51
+ }
52
+ });
53
+ if (!response.ok) {
54
+ throw new Error(`TikTok API error: ${response.status} ${response.statusText}`);
55
+ }
56
+ const data = await response.json();
57
+ return {
58
+ content: [{
59
+ type: "text",
60
+ text: JSON.stringify(data.data, null, 2)
61
+ }]
62
+ };
63
+ }
64
+ catch (error) {
65
+ throw new Error(`Failed to get TikTok user info: ${error}`);
66
+ }
67
+ }
68
+ async getVideos(args) {
69
+ const maxCount = args.maxCount || 10;
70
+ const url = new URL(`${this.baseUrl}/video/list/`);
71
+ url.searchParams.append("max_count", maxCount.toString());
72
+ url.searchParams.append("fields", "id,create_time,cover_image_url,share_url,title,video_description,duration");
73
+ try {
74
+ const response = await fetch(url.toString(), {
75
+ headers: {
76
+ "Authorization": `Bearer ${this.accessToken}`
77
+ }
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`TikTok API error: ${response.status} ${response.statusText}`);
81
+ }
82
+ const data = await response.json();
83
+ return {
84
+ content: [{
85
+ type: "text",
86
+ text: JSON.stringify(data.data, null, 2)
87
+ }]
88
+ };
89
+ }
90
+ catch (error) {
91
+ throw new Error(`Failed to get TikTok videos: ${error}`);
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=tiktok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../../src/platforms/tiktok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { Platform } from "./platform.js";
3
+ interface TwitterConfig {
4
+ bearerToken: string;
5
+ }
6
+ export declare class TwitterPlatform implements Platform {
7
+ name: string;
8
+ private bearerToken;
9
+ private baseUrl;
10
+ constructor(config: TwitterConfig);
11
+ getTools(): Tool[];
12
+ executeTool(name: string, args: unknown): Promise<{
13
+ content: Array<{
14
+ type: string;
15
+ text: string;
16
+ }>;
17
+ }>;
18
+ private createTweet;
19
+ private getUser;
20
+ private searchTweets;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=twitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../../src/platforms/twitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,IAAI,SAAa;IACjB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA+B;gBAElC,MAAM,EAAE,aAAa;IAIjC,QAAQ,IAAI,IAAI,EAAE;IAoDZ,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QACtD,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;YAaY,WAAW;YAiCX,OAAO;YA6BP,YAAY;CAmC3B"}
@@ -0,0 +1,156 @@
1
+ export class TwitterPlatform {
2
+ name = "twitter";
3
+ bearerToken;
4
+ baseUrl = "https://api.twitter.com/2";
5
+ constructor(config) {
6
+ this.bearerToken = config.bearerToken;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ name: "twitter_post",
12
+ description: "Create a tweet (requires paid Twitter API access)",
13
+ inputSchema: {
14
+ type: "object",
15
+ properties: {
16
+ text: {
17
+ type: "string",
18
+ description: "Tweet text content (max 280 characters)"
19
+ }
20
+ },
21
+ required: ["text"]
22
+ }
23
+ },
24
+ {
25
+ name: "twitter_get_user",
26
+ description: "Get Twitter user information",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ username: {
31
+ type: "string",
32
+ description: "Twitter username (without @)"
33
+ }
34
+ },
35
+ required: ["username"]
36
+ }
37
+ },
38
+ {
39
+ name: "twitter_search",
40
+ description: "Search tweets (requires paid Twitter API access)",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ query: {
45
+ type: "string",
46
+ description: "Search query"
47
+ },
48
+ maxResults: {
49
+ type: "number",
50
+ description: "Maximum results (default: 10)",
51
+ default: 10
52
+ }
53
+ },
54
+ required: ["query"]
55
+ }
56
+ }
57
+ ];
58
+ }
59
+ async executeTool(name, args) {
60
+ switch (name) {
61
+ case "twitter_post":
62
+ return this.createTweet(args);
63
+ case "twitter_get_user":
64
+ return this.getUser(args);
65
+ case "twitter_search":
66
+ return this.searchTweets(args);
67
+ default:
68
+ throw new Error(`Unknown tool: ${name}`);
69
+ }
70
+ }
71
+ async createTweet(args) {
72
+ try {
73
+ const response = await fetch(`${this.baseUrl}/tweets`, {
74
+ method: "POST",
75
+ headers: {
76
+ "Authorization": `Bearer ${this.bearerToken}`,
77
+ "Content-Type": "application/json"
78
+ },
79
+ body: JSON.stringify({ text: args.text })
80
+ });
81
+ if (!response.ok) {
82
+ const errorData = await response.json();
83
+ if (response.status === 403) {
84
+ throw new Error(`Twitter API requires paid access. Error: ${JSON.stringify(errorData)}`);
85
+ }
86
+ throw new Error(`Twitter API error: ${response.status} ${response.statusText}`);
87
+ }
88
+ const data = await response.json();
89
+ return {
90
+ content: [{
91
+ type: "text",
92
+ text: `Tweet created successfully! ID: ${data.data.id}`
93
+ }]
94
+ };
95
+ }
96
+ catch (error) {
97
+ throw new Error(`Failed to create tweet: ${error}`);
98
+ }
99
+ }
100
+ async getUser(args) {
101
+ const url = new URL(`${this.baseUrl}/users/by/username/${args.username}`);
102
+ url.searchParams.append("user.fields", "description,public_metrics,created_at,location,verified");
103
+ try {
104
+ const response = await fetch(url.toString(), {
105
+ headers: {
106
+ "Authorization": `Bearer ${this.bearerToken}`
107
+ }
108
+ });
109
+ if (!response.ok) {
110
+ throw new Error(`Twitter API error: ${response.status} ${response.statusText}`);
111
+ }
112
+ const data = await response.json();
113
+ return {
114
+ content: [{
115
+ type: "text",
116
+ text: JSON.stringify(data.data, null, 2)
117
+ }]
118
+ };
119
+ }
120
+ catch (error) {
121
+ throw new Error(`Failed to get Twitter user: ${error}`);
122
+ }
123
+ }
124
+ async searchTweets(args) {
125
+ const maxResults = args.maxResults || 10;
126
+ const url = new URL(`${this.baseUrl}/tweets/search/recent`);
127
+ url.searchParams.append("query", args.query);
128
+ url.searchParams.append("max_results", maxResults.toString());
129
+ url.searchParams.append("tweet.fields", "created_at,author_id,public_metrics");
130
+ try {
131
+ const response = await fetch(url.toString(), {
132
+ headers: {
133
+ "Authorization": `Bearer ${this.bearerToken}`
134
+ }
135
+ });
136
+ if (!response.ok) {
137
+ const errorData = await response.json();
138
+ if (response.status === 403) {
139
+ throw new Error(`Twitter API search requires paid access. Error: ${JSON.stringify(errorData)}`);
140
+ }
141
+ throw new Error(`Twitter API error: ${response.status} ${response.statusText}`);
142
+ }
143
+ const data = await response.json();
144
+ return {
145
+ content: [{
146
+ type: "text",
147
+ text: JSON.stringify(data.data, null, 2)
148
+ }]
149
+ };
150
+ }
151
+ catch (error) {
152
+ throw new Error(`Failed to search tweets: ${error}`);
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/platforms/twitter.ts"],"names":[],"mappings":"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"}