@opentweet/mcp-server 1.0.0 → 1.1.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 +12 -2
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/installer.d.ts +2 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +115 -0
- package/dist/installer.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,9 +8,19 @@ MCP server for [OpenTweet](https://opentweet.io) — manage your Twitter/X prese
|
|
|
8
8
|
|
|
9
9
|
Sign up at [opentweet.io](https://opentweet.io) and create an API key from the [Developer Dashboard](https://opentweet.io/developer).
|
|
10
10
|
|
|
11
|
-
### 2.
|
|
11
|
+
### 2. Install
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
**One-command setup** (auto-detects Claude Code, Claude Desktop, Cursor, and Windsurf):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx -y @opentweet/mcp-server --install --api-key ot_your_key_here
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This will find all installed AI clients on your machine and configure them automatically. Restart your AI clients after running this.
|
|
20
|
+
|
|
21
|
+
### Manual Setup
|
|
22
|
+
|
|
23
|
+
If you prefer to configure manually, add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
14
24
|
|
|
15
25
|
```json
|
|
16
26
|
{
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,26 @@ import { registerAccountTools } from './tools/account.js';
|
|
|
9
9
|
import { registerMediaTools } from './tools/media.js';
|
|
10
10
|
import { registerResources } from './resources/index.js';
|
|
11
11
|
import { registerPrompts } from './prompts/index.js';
|
|
12
|
+
import { runInstaller } from './installer.js';
|
|
13
|
+
// Handle --install flag
|
|
14
|
+
if (process.argv.includes('--install')) {
|
|
15
|
+
const keyIndex = process.argv.indexOf('--api-key');
|
|
16
|
+
const apiKey = keyIndex !== -1 ? process.argv[keyIndex + 1] : undefined;
|
|
17
|
+
if (!apiKey) {
|
|
18
|
+
console.error('Error: --api-key is required with --install.');
|
|
19
|
+
console.error('');
|
|
20
|
+
console.error('Usage:');
|
|
21
|
+
console.error(' npx -y @opentweet/mcp-server --install --api-key ot_your_key_here');
|
|
22
|
+
console.error('');
|
|
23
|
+
console.error('Get your API key from: https://opentweet.io/developer');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
if (!apiKey.startsWith('ot_')) {
|
|
27
|
+
console.warn('Warning: API key does not start with "ot_". Proceeding anyway.');
|
|
28
|
+
}
|
|
29
|
+
runInstaller(apiKey);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
12
32
|
const API_KEY = process.env.OPENTWEET_API_KEY;
|
|
13
33
|
const BASE_URL = process.env.OPENTWEET_BASE_URL || 'https://opentweet.io';
|
|
14
34
|
if (!API_KEY) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AA+FA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoCjD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir, platform } from 'os';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
const HOME = homedir();
|
|
5
|
+
const clients = [
|
|
6
|
+
{
|
|
7
|
+
name: 'Claude Code',
|
|
8
|
+
paths: {
|
|
9
|
+
darwin: join(HOME, '.claude.json'),
|
|
10
|
+
linux: join(HOME, '.claude.json'),
|
|
11
|
+
win32: join(HOME, '.claude.json'),
|
|
12
|
+
},
|
|
13
|
+
detectParentDir: false,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Claude Desktop',
|
|
17
|
+
paths: {
|
|
18
|
+
darwin: join(HOME, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),
|
|
19
|
+
linux: join(HOME, '.config', 'Claude', 'claude_desktop_config.json'),
|
|
20
|
+
win32: join(process.env.APPDATA || join(HOME, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json'),
|
|
21
|
+
},
|
|
22
|
+
detectParentDir: true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'Cursor',
|
|
26
|
+
paths: {
|
|
27
|
+
darwin: join(HOME, '.cursor', 'mcp.json'),
|
|
28
|
+
linux: join(HOME, '.cursor', 'mcp.json'),
|
|
29
|
+
win32: join(HOME, '.cursor', 'mcp.json'),
|
|
30
|
+
},
|
|
31
|
+
detectParentDir: true,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Windsurf',
|
|
35
|
+
paths: {
|
|
36
|
+
darwin: join(HOME, '.codeium', 'windsurf', 'mcp_config.json'),
|
|
37
|
+
linux: join(HOME, '.codeium', 'windsurf', 'mcp_config.json'),
|
|
38
|
+
win32: join(HOME, '.codeium', 'windsurf', 'mcp_config.json'),
|
|
39
|
+
},
|
|
40
|
+
detectParentDir: true,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
function getConfigPath(client) {
|
|
44
|
+
const os = platform();
|
|
45
|
+
return client.paths[os] || client.paths.linux;
|
|
46
|
+
}
|
|
47
|
+
function isClientInstalled(client) {
|
|
48
|
+
const configPath = getConfigPath(client);
|
|
49
|
+
if (existsSync(configPath))
|
|
50
|
+
return true;
|
|
51
|
+
if (client.detectParentDir && existsSync(dirname(configPath)))
|
|
52
|
+
return true;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
function buildMcpEntry(apiKey) {
|
|
56
|
+
return {
|
|
57
|
+
command: 'npx',
|
|
58
|
+
args: ['-y', '@opentweet/mcp-server'],
|
|
59
|
+
env: {
|
|
60
|
+
OPENTWEET_API_KEY: apiKey,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function updateConfigFile(configPath, apiKey) {
|
|
65
|
+
let config = {};
|
|
66
|
+
if (existsSync(configPath)) {
|
|
67
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
68
|
+
config = JSON.parse(raw);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const dir = dirname(configPath);
|
|
72
|
+
if (!existsSync(dir)) {
|
|
73
|
+
mkdirSync(dir, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
77
|
+
config.mcpServers = {};
|
|
78
|
+
}
|
|
79
|
+
config.mcpServers.opentweet = buildMcpEntry(apiKey);
|
|
80
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
export function runInstaller(apiKey) {
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log('🔍 Detecting installed AI clients...');
|
|
85
|
+
console.log('');
|
|
86
|
+
let installedCount = 0;
|
|
87
|
+
for (const client of clients) {
|
|
88
|
+
const configPath = getConfigPath(client);
|
|
89
|
+
if (!isClientInstalled(client)) {
|
|
90
|
+
console.log(` ✗ ${client.name.padEnd(16)} — Not detected`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
updateConfigFile(configPath, apiKey);
|
|
95
|
+
console.log(` ✓ ${client.name.padEnd(16)} — Updated ${configPath}`);
|
|
96
|
+
installedCount++;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
console.error(` ✗ ${client.name.padEnd(16)} — Error: ${msg}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log('');
|
|
104
|
+
if (installedCount === 0) {
|
|
105
|
+
console.log('No AI clients detected. You can manually add this to your client config:');
|
|
106
|
+
console.log('');
|
|
107
|
+
console.log(JSON.stringify({ mcpServers: { opentweet: buildMcpEntry(apiKey) } }, null, 2));
|
|
108
|
+
console.log('');
|
|
109
|
+
console.log('See https://opentweet.io/mcp for setup guides.');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(`Done! Restart your AI client${installedCount > 1 ? 's' : ''} to start using OpenTweet.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|