@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.
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/platforms/facebook.d.ts +23 -0
- package/dist/platforms/facebook.d.ts.map +1 -0
- package/dist/platforms/facebook.js +145 -0
- package/dist/platforms/facebook.js.map +1 -0
- package/dist/platforms/index.d.ts +4 -0
- package/dist/platforms/index.d.ts.map +1 -0
- package/dist/platforms/index.js +29 -0
- package/dist/platforms/index.js.map +1 -0
- package/dist/platforms/instagram.d.ts +22 -0
- package/dist/platforms/instagram.d.ts.map +1 -0
- package/dist/platforms/instagram.js +95 -0
- package/dist/platforms/instagram.js.map +1 -0
- package/dist/platforms/linkedin.d.ts +27 -0
- package/dist/platforms/linkedin.d.ts.map +1 -0
- package/dist/platforms/linkedin.js +157 -0
- package/dist/platforms/linkedin.js.map +1 -0
- package/dist/platforms/platform.d.ts +12 -0
- package/dist/platforms/platform.d.ts.map +1 -0
- package/dist/platforms/platform.js +2 -0
- package/dist/platforms/platform.js.map +1 -0
- package/dist/platforms/tiktok.d.ts +22 -0
- package/dist/platforms/tiktok.d.ts.map +1 -0
- package/dist/platforms/tiktok.js +95 -0
- package/dist/platforms/tiktok.js.map +1 -0
- package/dist/platforms/twitter.d.ts +23 -0
- package/dist/platforms/twitter.d.ts.map +1 -0
- package/dist/platforms/twitter.js +156 -0
- package/dist/platforms/twitter.js.map +1 -0
- package/dist/platforms/youtube.d.ts +23 -0
- package/dist/platforms/youtube.d.ts.map +1 -0
- package/dist/platforms/youtube.js +177 -0
- package/dist/platforms/youtube.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Social Media MCP Server
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Social Media MCP Server
|
|
2
|
+
|
|
3
|
+
A universal MCP (Model Context Protocol) server that provides access to 6 social media platforms: YouTube, LinkedIn, Facebook, Instagram, TikTok, and Twitter/X. This server dynamically exposes tools based on the API keys you provide.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Dynamic Tool Registration**: Only shows tools for platforms with configured API keys
|
|
8
|
+
- **Comprehensive API Coverage**: Access to all major endpoints for each platform
|
|
9
|
+
- **Secure**: API keys are never stored or logged, only used in memory
|
|
10
|
+
- **Easy Distribution**: Run via npx without installation
|
|
11
|
+
- **MCP Compliant**: Works with Claude Desktop, Claude Code, and other MCP clients
|
|
12
|
+
|
|
13
|
+
## Supported Platforms
|
|
14
|
+
|
|
15
|
+
| Platform | Status | Authentication |
|
|
16
|
+
|----------|--------|----------------|
|
|
17
|
+
| YouTube | ✅ Implemented | API Key |
|
|
18
|
+
| LinkedIn | ✅ Implemented | OAuth 2.0 |
|
|
19
|
+
| Facebook | ✅ Implemented | Access Token |
|
|
20
|
+
| Instagram | ✅ Implemented | Access Token |
|
|
21
|
+
| TikTok | ✅ Implemented | Access Token |
|
|
22
|
+
| Twitter/X | ✅ Implemented | Bearer Token |
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
### 1. Get API Keys
|
|
27
|
+
|
|
28
|
+
You need to obtain API keys for the platforms you want to use:
|
|
29
|
+
|
|
30
|
+
#### YouTube
|
|
31
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
32
|
+
2. Create a new project
|
|
33
|
+
3. Enable YouTube Data API v3
|
|
34
|
+
4. Create credentials (API Key)
|
|
35
|
+
|
|
36
|
+
#### Other Platforms
|
|
37
|
+
- **LinkedIn**: [LinkedIn Developer Portal](https://developer.linkedin.com/)
|
|
38
|
+
- **Facebook/Instagram**: [Meta for Developers](https://developers.facebook.com/)
|
|
39
|
+
- **TikTok**: [TikTok for Developers](https://developers.tiktok.com/)
|
|
40
|
+
- **Twitter/X**: [Twitter Developer Portal](https://developer.twitter.com/)
|
|
41
|
+
|
|
42
|
+
### 2. Configure Claude
|
|
43
|
+
|
|
44
|
+
Add to your Claude Desktop configuration (`claude_desktop_config.json`):
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"social-media": {
|
|
50
|
+
"command": "npx",
|
|
51
|
+
"args": ["-y", "social-media-mcp-server"],
|
|
52
|
+
"env": {
|
|
53
|
+
"YOUTUBE_API_KEY": "your_youtube_api_key_here",
|
|
54
|
+
"LINKEDIN_CLIENT_ID": "your_linkedin_client_id",
|
|
55
|
+
"LINKEDIN_CLIENT_SECRET": "your_linkedin_client_secret",
|
|
56
|
+
"FACEBOOK_ACCESS_TOKEN": "your_facebook_token",
|
|
57
|
+
"INSTAGRAM_ACCESS_TOKEN": "your_instagram_token",
|
|
58
|
+
"TIKTOK_ACCESS_TOKEN": "your_tiktok_token",
|
|
59
|
+
"TWITTER_BEARER_TOKEN": "your_twitter_bearer_token"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Start Using
|
|
67
|
+
|
|
68
|
+
Once configured, Claude will automatically discover available tools. Only tools for platforms with valid API keys will be shown.
|
|
69
|
+
|
|
70
|
+
## Available Tools
|
|
71
|
+
|
|
72
|
+
### YouTube
|
|
73
|
+
|
|
74
|
+
- `youtube_search` - Search for videos
|
|
75
|
+
- `youtube_get_video` - Get video details
|
|
76
|
+
- `youtube_get_comments` - Get video comments
|
|
77
|
+
|
|
78
|
+
### LinkedIn
|
|
79
|
+
|
|
80
|
+
- `linkedin_post` - Create a post
|
|
81
|
+
- `linkedin_get_profile` - Get profile information
|
|
82
|
+
|
|
83
|
+
### Facebook
|
|
84
|
+
|
|
85
|
+
- `facebook_post` - Create a page post
|
|
86
|
+
- `facebook_get_page` - Get page information
|
|
87
|
+
- `facebook_get_insights` - Get page analytics
|
|
88
|
+
|
|
89
|
+
### Instagram
|
|
90
|
+
|
|
91
|
+
- `instagram_get_media` - Get media/posts
|
|
92
|
+
- `instagram_get_insights` - Get account insights
|
|
93
|
+
|
|
94
|
+
### TikTok
|
|
95
|
+
|
|
96
|
+
- `tiktok_get_user_info` - Get user information
|
|
97
|
+
- `tiktok_get_videos` - Get user videos
|
|
98
|
+
|
|
99
|
+
### Twitter/X
|
|
100
|
+
|
|
101
|
+
- `twitter_post` - Create a tweet (requires paid API access)
|
|
102
|
+
- `twitter_get_user` - Get user information
|
|
103
|
+
- `twitter_search` - Search tweets (requires paid API access)
|
|
104
|
+
|
|
105
|
+
## Security
|
|
106
|
+
|
|
107
|
+
- **No Persistent Storage**: API keys are only held in memory during execution
|
|
108
|
+
- **No Logging**: Keys are never logged or written to disk
|
|
109
|
+
- **Environment-Based**: Keys are passed via environment variables
|
|
110
|
+
- **Validation**: Keys are validated before tool registration
|
|
111
|
+
|
|
112
|
+
## Development
|
|
113
|
+
|
|
114
|
+
### Prerequisites
|
|
115
|
+
|
|
116
|
+
- Node.js 18+
|
|
117
|
+
- npm or yarn
|
|
118
|
+
|
|
119
|
+
### Setup
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
git clone https://github.com/yourusername/social-media-mcp-server.git
|
|
123
|
+
cd social-media-mcp-server
|
|
124
|
+
npm install
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Build
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm run build
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Development Mode
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npm run dev
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Testing
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npm test
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Architecture
|
|
146
|
+
|
|
147
|
+
This project follows the architecture decision records (ADRs) documented in the `history/adr/` directory:
|
|
148
|
+
|
|
149
|
+
1. **ADR-0001**: Technology Stack (TypeScript/Node.js)
|
|
150
|
+
2. **ADR-0002**: Authentication Strategy (Environment-based)
|
|
151
|
+
3. **ADR-0003**: Dynamic Tool Registration
|
|
152
|
+
4. **ADR-0004**: npx Distribution Model
|
|
153
|
+
|
|
154
|
+
## Contributing
|
|
155
|
+
|
|
156
|
+
Contributions are welcome! Please see our contributing guidelines for details.
|
|
157
|
+
|
|
158
|
+
## License
|
|
159
|
+
|
|
160
|
+
MIT License - see LICENSE file for details.
|
|
161
|
+
|
|
162
|
+
## Support
|
|
163
|
+
|
|
164
|
+
For issues and feature requests, please use the GitHub issue tracker.
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
3
|
+
youtube: z.ZodOptional<z.ZodObject<{
|
|
4
|
+
apiKey: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
}, {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
}>>;
|
|
10
|
+
linkedin: z.ZodOptional<z.ZodObject<{
|
|
11
|
+
clientId: z.ZodString;
|
|
12
|
+
clientSecret: z.ZodString;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
clientId: string;
|
|
15
|
+
clientSecret: string;
|
|
16
|
+
}, {
|
|
17
|
+
clientId: string;
|
|
18
|
+
clientSecret: string;
|
|
19
|
+
}>>;
|
|
20
|
+
facebook: z.ZodOptional<z.ZodObject<{
|
|
21
|
+
accessToken: z.ZodString;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
accessToken: string;
|
|
24
|
+
}, {
|
|
25
|
+
accessToken: string;
|
|
26
|
+
}>>;
|
|
27
|
+
instagram: z.ZodOptional<z.ZodObject<{
|
|
28
|
+
accessToken: z.ZodString;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
accessToken: string;
|
|
31
|
+
}, {
|
|
32
|
+
accessToken: string;
|
|
33
|
+
}>>;
|
|
34
|
+
tiktok: z.ZodOptional<z.ZodObject<{
|
|
35
|
+
accessToken: z.ZodString;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
accessToken: string;
|
|
38
|
+
}, {
|
|
39
|
+
accessToken: string;
|
|
40
|
+
}>>;
|
|
41
|
+
twitter: z.ZodOptional<z.ZodObject<{
|
|
42
|
+
bearerToken: z.ZodString;
|
|
43
|
+
}, "strip", z.ZodTypeAny, {
|
|
44
|
+
bearerToken: string;
|
|
45
|
+
}, {
|
|
46
|
+
bearerToken: string;
|
|
47
|
+
}>>;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
youtube?: {
|
|
50
|
+
apiKey: string;
|
|
51
|
+
} | undefined;
|
|
52
|
+
linkedin?: {
|
|
53
|
+
clientId: string;
|
|
54
|
+
clientSecret: string;
|
|
55
|
+
} | undefined;
|
|
56
|
+
facebook?: {
|
|
57
|
+
accessToken: string;
|
|
58
|
+
} | undefined;
|
|
59
|
+
instagram?: {
|
|
60
|
+
accessToken: string;
|
|
61
|
+
} | undefined;
|
|
62
|
+
tiktok?: {
|
|
63
|
+
accessToken: string;
|
|
64
|
+
} | undefined;
|
|
65
|
+
twitter?: {
|
|
66
|
+
bearerToken: string;
|
|
67
|
+
} | undefined;
|
|
68
|
+
}, {
|
|
69
|
+
youtube?: {
|
|
70
|
+
apiKey: string;
|
|
71
|
+
} | undefined;
|
|
72
|
+
linkedin?: {
|
|
73
|
+
clientId: string;
|
|
74
|
+
clientSecret: string;
|
|
75
|
+
} | undefined;
|
|
76
|
+
facebook?: {
|
|
77
|
+
accessToken: string;
|
|
78
|
+
} | undefined;
|
|
79
|
+
instagram?: {
|
|
80
|
+
accessToken: string;
|
|
81
|
+
} | undefined;
|
|
82
|
+
tiktok?: {
|
|
83
|
+
accessToken: string;
|
|
84
|
+
} | undefined;
|
|
85
|
+
twitter?: {
|
|
86
|
+
bearerToken: string;
|
|
87
|
+
} | undefined;
|
|
88
|
+
}>;
|
|
89
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
90
|
+
export declare function loadConfig(): Config;
|
|
91
|
+
export declare function getEnabledPlatforms(config: Config): string[];
|
|
92
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6BxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CA4CnC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAI5D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const YouTubeConfigSchema = z.object({
|
|
3
|
+
apiKey: z.string().min(1),
|
|
4
|
+
});
|
|
5
|
+
const LinkedInConfigSchema = z.object({
|
|
6
|
+
clientId: z.string().min(1),
|
|
7
|
+
clientSecret: z.string().min(1),
|
|
8
|
+
});
|
|
9
|
+
const FacebookConfigSchema = z.object({
|
|
10
|
+
accessToken: z.string().min(1),
|
|
11
|
+
});
|
|
12
|
+
const InstagramConfigSchema = z.object({
|
|
13
|
+
accessToken: z.string().min(1),
|
|
14
|
+
});
|
|
15
|
+
const TikTokConfigSchema = z.object({
|
|
16
|
+
accessToken: z.string().min(1),
|
|
17
|
+
});
|
|
18
|
+
const TwitterConfigSchema = z.object({
|
|
19
|
+
bearerToken: z.string().min(1),
|
|
20
|
+
});
|
|
21
|
+
export const ConfigSchema = z.object({
|
|
22
|
+
youtube: YouTubeConfigSchema.optional(),
|
|
23
|
+
linkedin: LinkedInConfigSchema.optional(),
|
|
24
|
+
facebook: FacebookConfigSchema.optional(),
|
|
25
|
+
instagram: InstagramConfigSchema.optional(),
|
|
26
|
+
tiktok: TikTokConfigSchema.optional(),
|
|
27
|
+
twitter: TwitterConfigSchema.optional(),
|
|
28
|
+
});
|
|
29
|
+
export function loadConfig() {
|
|
30
|
+
const config = {};
|
|
31
|
+
const youtubeKey = process.env.YOUTUBE_API_KEY;
|
|
32
|
+
if (youtubeKey) {
|
|
33
|
+
config.youtube = { apiKey: youtubeKey };
|
|
34
|
+
}
|
|
35
|
+
const linkedinClientId = process.env.LINKEDIN_CLIENT_ID;
|
|
36
|
+
const linkedinClientSecret = process.env.LINKEDIN_CLIENT_SECRET;
|
|
37
|
+
if (linkedinClientId && linkedinClientSecret) {
|
|
38
|
+
config.linkedin = {
|
|
39
|
+
clientId: linkedinClientId,
|
|
40
|
+
clientSecret: linkedinClientSecret,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const facebookToken = process.env.FACEBOOK_ACCESS_TOKEN;
|
|
44
|
+
if (facebookToken) {
|
|
45
|
+
config.facebook = { accessToken: facebookToken };
|
|
46
|
+
}
|
|
47
|
+
const instagramToken = process.env.INSTAGRAM_ACCESS_TOKEN;
|
|
48
|
+
if (instagramToken) {
|
|
49
|
+
config.instagram = { accessToken: instagramToken };
|
|
50
|
+
}
|
|
51
|
+
const tiktokToken = process.env.TIKTOK_ACCESS_TOKEN;
|
|
52
|
+
if (tiktokToken) {
|
|
53
|
+
config.tiktok = { accessToken: tiktokToken };
|
|
54
|
+
}
|
|
55
|
+
const twitterToken = process.env.TWITTER_BEARER_TOKEN;
|
|
56
|
+
if (twitterToken) {
|
|
57
|
+
config.twitter = { bearerToken: twitterToken };
|
|
58
|
+
}
|
|
59
|
+
return config;
|
|
60
|
+
}
|
|
61
|
+
export function getEnabledPlatforms(config) {
|
|
62
|
+
return Object.entries(config)
|
|
63
|
+
.filter(([_, value]) => value !== undefined)
|
|
64
|
+
.map(([key]) => key);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { loadConfig } from "./config.js";
|
|
6
|
+
import { getAvailablePlatforms } from "./platforms/index.js";
|
|
7
|
+
async function main() {
|
|
8
|
+
const config = loadConfig();
|
|
9
|
+
const platforms = getAvailablePlatforms(config);
|
|
10
|
+
const server = new Server({
|
|
11
|
+
name: "social-media-mcp-server",
|
|
12
|
+
version: "1.0.0",
|
|
13
|
+
}, {
|
|
14
|
+
capabilities: {
|
|
15
|
+
tools: {},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
const allTools = platforms.flatMap(platform => platform.getTools());
|
|
19
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
20
|
+
return {
|
|
21
|
+
tools: allTools,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
25
|
+
const { name, arguments: args } = request.params;
|
|
26
|
+
const platform = platforms.find(p => p.getTools().some(tool => tool.name === name));
|
|
27
|
+
if (!platform) {
|
|
28
|
+
throw new Error(`Tool "${name}" not found. Make sure the corresponding platform API key is configured.`);
|
|
29
|
+
}
|
|
30
|
+
return await platform.executeTool(name, args);
|
|
31
|
+
});
|
|
32
|
+
const transport = new StdioServerTransport();
|
|
33
|
+
await server.connect(transport);
|
|
34
|
+
console.error("Social Media MCP Server running on stdio");
|
|
35
|
+
}
|
|
36
|
+
main().catch(console.error);
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAGF,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpE,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAGjD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAC9C,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,0EAA0E,CAAC,CAAC;QAC3G,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { Platform } from "./platform.js";
|
|
3
|
+
interface FacebookConfig {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class FacebookPlatform implements Platform {
|
|
7
|
+
name: string;
|
|
8
|
+
private accessToken;
|
|
9
|
+
private baseUrl;
|
|
10
|
+
constructor(config: FacebookConfig);
|
|
11
|
+
getTools(): Tool[];
|
|
12
|
+
executeTool(name: string, args: unknown): Promise<{
|
|
13
|
+
content: Array<{
|
|
14
|
+
type: string;
|
|
15
|
+
text: string;
|
|
16
|
+
}>;
|
|
17
|
+
}>;
|
|
18
|
+
private createPost;
|
|
19
|
+
private getPage;
|
|
20
|
+
private getInsights;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=facebook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../src/platforms/facebook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,IAAI,SAAc;IAClB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,EAAE,cAAc;IAIlC,QAAQ,IAAI,IAAI,EAAE;IA2DZ,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,UAAU;YA4BV,OAAO;YAyBP,WAAW;CAwB1B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
export class FacebookPlatform {
|
|
2
|
+
name = "facebook";
|
|
3
|
+
accessToken;
|
|
4
|
+
baseUrl = "https://graph.facebook.com/v18.0";
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.accessToken = config.accessToken;
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
name: "facebook_post",
|
|
12
|
+
description: "Create a post on Facebook page",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {
|
|
16
|
+
pageId: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Facebook Page ID"
|
|
19
|
+
},
|
|
20
|
+
message: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Post message content"
|
|
23
|
+
},
|
|
24
|
+
link: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Optional link to include"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
required: ["pageId", "message"]
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "facebook_get_page",
|
|
34
|
+
description: "Get Facebook page information",
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: "object",
|
|
37
|
+
properties: {
|
|
38
|
+
pageId: {
|
|
39
|
+
type: "string",
|
|
40
|
+
description: "Facebook Page ID"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
required: ["pageId"]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "facebook_get_insights",
|
|
48
|
+
description: "Get Facebook page insights",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
pageId: {
|
|
53
|
+
type: "string",
|
|
54
|
+
description: "Facebook Page ID"
|
|
55
|
+
},
|
|
56
|
+
metric: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "Insight metric (page_impressions, page_engaged_users, etc.)"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
required: ["pageId", "metric"]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
async executeTool(name, args) {
|
|
67
|
+
switch (name) {
|
|
68
|
+
case "facebook_post":
|
|
69
|
+
return this.createPost(args);
|
|
70
|
+
case "facebook_get_page":
|
|
71
|
+
return this.getPage(args);
|
|
72
|
+
case "facebook_get_insights":
|
|
73
|
+
return this.getInsights(args);
|
|
74
|
+
default:
|
|
75
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async createPost(args) {
|
|
79
|
+
const url = new URL(`${this.baseUrl}/${args.pageId}/feed`);
|
|
80
|
+
url.searchParams.append("access_token", this.accessToken);
|
|
81
|
+
url.searchParams.append("message", args.message);
|
|
82
|
+
if (args.link) {
|
|
83
|
+
url.searchParams.append("link", args.link);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch(url.toString(), { method: "POST" });
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
throw new Error(`Facebook API error: ${response.status} ${response.statusText}`);
|
|
89
|
+
}
|
|
90
|
+
const data = await response.json();
|
|
91
|
+
return {
|
|
92
|
+
content: [{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: `Post created successfully! Post ID: ${data.id}`
|
|
95
|
+
}]
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new Error(`Failed to create Facebook post: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async getPage(args) {
|
|
103
|
+
const url = new URL(`${this.baseUrl}/${args.pageId}`);
|
|
104
|
+
url.searchParams.append("access_token", this.accessToken);
|
|
105
|
+
url.searchParams.append("fields", "name,about,fan_count,link,category");
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(url.toString());
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error(`Facebook API error: ${response.status} ${response.statusText}`);
|
|
110
|
+
}
|
|
111
|
+
const data = await response.json();
|
|
112
|
+
return {
|
|
113
|
+
content: [{
|
|
114
|
+
type: "text",
|
|
115
|
+
text: JSON.stringify(data, null, 2)
|
|
116
|
+
}]
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new Error(`Failed to get Facebook page: ${error}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async getInsights(args) {
|
|
124
|
+
const url = new URL(`${this.baseUrl}/${args.pageId}/insights`);
|
|
125
|
+
url.searchParams.append("access_token", this.accessToken);
|
|
126
|
+
url.searchParams.append("metric", args.metric);
|
|
127
|
+
try {
|
|
128
|
+
const response = await fetch(url.toString());
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new Error(`Facebook 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 Facebook insights: ${error}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=facebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facebook.js","sourceRoot":"","sources":["../../src/platforms/facebook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platforms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CA4BhE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { YouTubePlatform } from "./youtube.js";
|
|
2
|
+
import { LinkedInPlatform } from "./linkedin.js";
|
|
3
|
+
import { FacebookPlatform } from "./facebook.js";
|
|
4
|
+
import { InstagramPlatform } from "./instagram.js";
|
|
5
|
+
import { TikTokPlatform } from "./tiktok.js";
|
|
6
|
+
import { TwitterPlatform } from "./twitter.js";
|
|
7
|
+
export function getAvailablePlatforms(config) {
|
|
8
|
+
const platforms = [];
|
|
9
|
+
if (config.youtube) {
|
|
10
|
+
platforms.push(new YouTubePlatform(config.youtube));
|
|
11
|
+
}
|
|
12
|
+
if (config.linkedin) {
|
|
13
|
+
platforms.push(new LinkedInPlatform(config.linkedin));
|
|
14
|
+
}
|
|
15
|
+
if (config.facebook) {
|
|
16
|
+
platforms.push(new FacebookPlatform(config.facebook));
|
|
17
|
+
}
|
|
18
|
+
if (config.instagram) {
|
|
19
|
+
platforms.push(new InstagramPlatform(config.instagram));
|
|
20
|
+
}
|
|
21
|
+
if (config.tiktok) {
|
|
22
|
+
platforms.push(new TikTokPlatform(config.tiktok));
|
|
23
|
+
}
|
|
24
|
+
if (config.twitter) {
|
|
25
|
+
platforms.push(new TwitterPlatform(config.twitter));
|
|
26
|
+
}
|
|
27
|
+
return platforms;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platforms/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,SAAS,GAAe,EAAE,CAAC;IAEjC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { Platform } from "./platform.js";
|
|
3
|
+
interface InstagramConfig {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class InstagramPlatform implements Platform {
|
|
7
|
+
name: string;
|
|
8
|
+
private accessToken;
|
|
9
|
+
private baseUrl;
|
|
10
|
+
constructor(config: InstagramConfig);
|
|
11
|
+
getTools(): Tool[];
|
|
12
|
+
executeTool(name: string, args: unknown): Promise<{
|
|
13
|
+
content: Array<{
|
|
14
|
+
type: string;
|
|
15
|
+
text: string;
|
|
16
|
+
}>;
|
|
17
|
+
}>;
|
|
18
|
+
private getMedia;
|
|
19
|
+
private getInsights;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=instagram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../src/platforms/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,IAAI,SAAe;IACnB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAoC;gBAEvC,MAAM,EAAE,eAAe;IAInC,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;YAWY,QAAQ;YA2BR,WAAW;CAwB1B"}
|