@ratio-mcp/setup 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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +138 -0
- package/dist/setup.js.map +1 -0
- package/package.json +21 -0
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,GAAG,EAAE,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AA8HA,wBAAgB,GAAG,IAAI,IAAI,CAiC1B"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const MCP_SERVER_ENTRIES = {
|
|
5
|
+
'ratio-docs': {
|
|
6
|
+
command: 'npx',
|
|
7
|
+
args: ['-y', '@ratio-mcp/docs-server@latest'],
|
|
8
|
+
},
|
|
9
|
+
'ratio-dev': {
|
|
10
|
+
command: 'npx',
|
|
11
|
+
args: ['-y', '@ratio-mcp/dev-server@latest'],
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
function getConfigPaths() {
|
|
15
|
+
const home = os.homedir();
|
|
16
|
+
const platform = process.platform;
|
|
17
|
+
const paths = [
|
|
18
|
+
// Claude Code (all platforms)
|
|
19
|
+
path.join(home, '.claude', 'claude_desktop_config.json'),
|
|
20
|
+
];
|
|
21
|
+
// Claude Desktop (platform-specific)
|
|
22
|
+
if (platform === 'darwin') {
|
|
23
|
+
paths.push(path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'));
|
|
24
|
+
}
|
|
25
|
+
else if (platform === 'win32') {
|
|
26
|
+
const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');
|
|
27
|
+
paths.push(path.join(appData, 'Claude', 'claude_desktop_config.json'));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Linux
|
|
31
|
+
paths.push(path.join(home, '.config', 'Claude', 'claude_desktop_config.json'));
|
|
32
|
+
}
|
|
33
|
+
return paths;
|
|
34
|
+
}
|
|
35
|
+
function backupFile(filePath) {
|
|
36
|
+
const backupPath = filePath + '.bak';
|
|
37
|
+
fs.copyFileSync(filePath, backupPath);
|
|
38
|
+
console.log(` Backup saved to ${backupPath}`);
|
|
39
|
+
}
|
|
40
|
+
function atomicWrite(filePath, content) {
|
|
41
|
+
const tmpPath = filePath + '.tmp';
|
|
42
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
43
|
+
fs.renameSync(tmpPath, filePath);
|
|
44
|
+
}
|
|
45
|
+
function updateConfig(filePath) {
|
|
46
|
+
console.log(`\nFound config: ${filePath}`);
|
|
47
|
+
// Read existing file
|
|
48
|
+
let raw;
|
|
49
|
+
try {
|
|
50
|
+
raw = fs.readFileSync(filePath, 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
console.error(` Error: Could not read file. Skipping.`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Validate JSON
|
|
57
|
+
let config;
|
|
58
|
+
try {
|
|
59
|
+
config = JSON.parse(raw);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
console.error(` Error: Invalid JSON. Skipping this file.`);
|
|
63
|
+
console.error(` Fix the JSON manually or restore from a backup.`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Validate config is an object
|
|
67
|
+
if (typeof config !== 'object' || config === null || Array.isArray(config)) {
|
|
68
|
+
console.error(` Error: Config is not a JSON object. Skipping.`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Backup before modifying
|
|
72
|
+
backupFile(filePath);
|
|
73
|
+
// Ensure mcpServers exists and is an object
|
|
74
|
+
if (!('mcpServers' in config)) {
|
|
75
|
+
config.mcpServers = {};
|
|
76
|
+
}
|
|
77
|
+
else if (typeof config.mcpServers !== 'object' ||
|
|
78
|
+
config.mcpServers === null ||
|
|
79
|
+
Array.isArray(config.mcpServers)) {
|
|
80
|
+
console.error(` Warning: mcpServers is not an object. Replacing it.`);
|
|
81
|
+
config.mcpServers = {};
|
|
82
|
+
}
|
|
83
|
+
// Merge our server entries (preserves existing servers)
|
|
84
|
+
const servers = config.mcpServers;
|
|
85
|
+
for (const [name, entry] of Object.entries(MCP_SERVER_ENTRIES)) {
|
|
86
|
+
servers[name] = entry;
|
|
87
|
+
}
|
|
88
|
+
// Atomic write
|
|
89
|
+
atomicWrite(filePath, JSON.stringify(config, null, 2) + '\n');
|
|
90
|
+
console.log(` Configured ratio-docs and ratio-dev servers.`);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
function createFreshConfig(filePath) {
|
|
94
|
+
console.log(`\nNo existing Claude config found.`);
|
|
95
|
+
console.log(`Creating new config at: ${filePath}`);
|
|
96
|
+
// Create directory if needed
|
|
97
|
+
const dir = path.dirname(filePath);
|
|
98
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
99
|
+
const config = {
|
|
100
|
+
mcpServers: { ...MCP_SERVER_ENTRIES },
|
|
101
|
+
};
|
|
102
|
+
atomicWrite(filePath, JSON.stringify(config, null, 2) + '\n');
|
|
103
|
+
console.log(` Configured ratio-docs and ratio-dev servers.`);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
export function run() {
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log('Ratio MCP Server Setup');
|
|
109
|
+
console.log('======================');
|
|
110
|
+
const allPaths = getConfigPaths();
|
|
111
|
+
const existingPaths = allPaths.filter((p) => fs.existsSync(p));
|
|
112
|
+
let configured = 0;
|
|
113
|
+
if (existingPaths.length > 0) {
|
|
114
|
+
// Update all existing config files
|
|
115
|
+
for (const configPath of existingPaths) {
|
|
116
|
+
if (updateConfig(configPath)) {
|
|
117
|
+
configured++;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// No config found — create Claude Code config as default
|
|
123
|
+
const defaultPath = allPaths[0]; // ~/.claude/claude_desktop_config.json
|
|
124
|
+
if (createFreshConfig(defaultPath)) {
|
|
125
|
+
configured++;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
console.log('');
|
|
129
|
+
if (configured > 0) {
|
|
130
|
+
console.log(`Done! ${configured} config file(s) updated.`);
|
|
131
|
+
console.log('Open Claude and start building!');
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log('No config files were updated. Please check the errors above.');
|
|
135
|
+
}
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ratio-mcp/setup",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "One-command setup for Ratio MCP servers in Claude",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"ratio-mcp-setup": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": ["dist"],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"prepublishOnly": "pnpm build"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^20.0.0",
|
|
19
|
+
"typescript": "^5.4.0"
|
|
20
|
+
}
|
|
21
|
+
}
|