@metalabdesign/mcp-client 1.0.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/CHANGELOG.md +43 -0
- package/README.md +243 -0
- package/dist/bin/cli.d.ts +14 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +216 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/metalab-mcp-config.d.ts +9 -0
- package/dist/bin/metalab-mcp-config.d.ts.map +1 -0
- package/dist/bin/metalab-mcp-config.js +224 -0
- package/dist/bin/metalab-mcp-config.js.map +1 -0
- package/dist/bin/metalab-mcp.d.ts +14 -0
- package/dist/bin/metalab-mcp.d.ts.map +1 -0
- package/dist/bin/metalab-mcp.js +242 -0
- package/dist/bin/metalab-mcp.js.map +1 -0
- package/dist/config/aws-sso.d.ts +21 -0
- package/dist/config/aws-sso.d.ts.map +1 -0
- package/dist/config/aws-sso.js +67 -0
- package/dist/config/aws-sso.js.map +1 -0
- package/dist/config/defaults.d.ts +14 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +20 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +34 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +401 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +39 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +203 -0
- package/dist/proxy.js.map +1 -0
- package/dist/storage.d.ts +15 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +64 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +40 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +42 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +89 -0
- package/dist/utils.js.map +1 -0
- package/package.json +51 -0
- package/src/bin/cli.ts +242 -0
- package/src/bin/metalab-mcp-config.ts +262 -0
- package/src/bin/metalab-mcp.ts +284 -0
- package/src/config/aws-sso.ts +78 -0
- package/src/config/defaults.ts +26 -0
- package/src/config/index.ts +8 -0
- package/src/index.ts +54 -0
- package/src/oauth.ts +540 -0
- package/src/proxy.ts +274 -0
- package/src/storage.ts +81 -0
- package/src/types.ts +79 -0
- package/src/utils.ts +115 -0
- package/tsconfig.json +25 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@metalabdesign/mcp-client` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.1] - 2026-01-28
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Switched package registry from GitHub Packages to npmjs.org for easier installation
|
|
12
|
+
- No authentication required to install - just run `npx @metalabdesign/mcp-client`
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- TypeScript strict mode errors in `metalab-mcp-config.ts`
|
|
16
|
+
- CI workflow now allows publishing same version with `--allow-same-version`
|
|
17
|
+
|
|
18
|
+
## [1.0.0] - 2026-01-28
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Initial public release as `@metalabdesign/mcp-client`
|
|
22
|
+
- **Zero-config CLI** (`metalab-mcp`) - automatically discovers MCP Gateway URL via:
|
|
23
|
+
- AWS SSM Parameter Store (`/mcp/gateway-url`)
|
|
24
|
+
- `MCP_SERVER_URL` environment variable
|
|
25
|
+
- Hardcoded production fallback
|
|
26
|
+
- **Config generator** (`metalab-mcp-config`) for multiple MCP clients:
|
|
27
|
+
- Claude Desktop (macOS/Windows/Linux)
|
|
28
|
+
- Windsurf
|
|
29
|
+
- Cursor
|
|
30
|
+
- VS Code (Cline)
|
|
31
|
+
- **MCP Inspector integration** via `--inspect` flag
|
|
32
|
+
- **AWS SSO profile support** via `--profile` flag
|
|
33
|
+
- **Per-user service token forwarding**:
|
|
34
|
+
- Figma (`--figma-token` / `FIGMA_ACCESS_TOKEN`)
|
|
35
|
+
- Notion (`--notion-token` / `NOTION_ACCESS_TOKEN`)
|
|
36
|
+
- OAuth 2.1 with PKCE authentication
|
|
37
|
+
- Automatic token refresh and persistence
|
|
38
|
+
- GitHub Actions CI/CD pipeline for automated releases
|
|
39
|
+
|
|
40
|
+
### Migration from `@metalab/mcp-local-proxy`
|
|
41
|
+
- Package renamed to `@metalabdesign/mcp-client`
|
|
42
|
+
- New convenience commands: `metalab-mcp` and `metalab-mcp-config`
|
|
43
|
+
- Original `mcp-local-proxy` CLI still available for advanced usage
|
package/README.md
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# @metalabdesign/mcp-client
|
|
2
|
+
|
|
3
|
+
MCP client for connecting to Metalab's MCP Gateway with OAuth 2.1 authentication.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run directly - zero config needed!
|
|
9
|
+
npx @metalabdesign/mcp-client
|
|
10
|
+
|
|
11
|
+
# Generate config for your MCP client (Claude, Windsurf, Cursor, etc.)
|
|
12
|
+
npx @metalabdesign/mcp-client-config --client claude
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
The package is published on **npmjs.org** (public, no authentication needed).
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Run directly with npx (recommended)
|
|
21
|
+
npx @metalabdesign/mcp-client
|
|
22
|
+
|
|
23
|
+
# Or install globally
|
|
24
|
+
npm install -g @metalabdesign/mcp-client
|
|
25
|
+
metalab-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Registry Configuration
|
|
29
|
+
|
|
30
|
+
If your `~/.npmrc` maps `@metalabdesign` to GitHub Packages for other internal packages, you'll need to explicitly use the npmjs.org registry for this package:
|
|
31
|
+
|
|
32
|
+
**Option 1: Use `--registry` flag**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx --registry=https://registry.npmjs.org @metalabdesign/mcp-client
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Option 2: Configure registry per-package in `~/.npmrc`**
|
|
39
|
+
|
|
40
|
+
```ini
|
|
41
|
+
# Other @metalabdesign packages from GitHub Packages
|
|
42
|
+
@metalabdesign:registry=https://npm.pkg.github.com
|
|
43
|
+
|
|
44
|
+
# Override for mcp-client to use npmjs.org
|
|
45
|
+
@metalabdesign/mcp-client:registry=https://registry.npmjs.org
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Option 3: Remove the GitHub Packages override** (simplest)
|
|
49
|
+
|
|
50
|
+
If you don't need other `@metalabdesign` packages locally, remove the registry override from your `~/.npmrc`:
|
|
51
|
+
```bash
|
|
52
|
+
# Remove this line if present:
|
|
53
|
+
# @metalabdesign:registry=https://npm.pkg.github.com
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Commands
|
|
57
|
+
|
|
58
|
+
### metalab-mcp
|
|
59
|
+
|
|
60
|
+
Zero-config connection to Metalab MCP Gateway.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Basic usage (auto-detects gateway URL)
|
|
64
|
+
metalab-mcp
|
|
65
|
+
|
|
66
|
+
# With Figma token
|
|
67
|
+
metalab-mcp --figma-token figd_YOUR_TOKEN
|
|
68
|
+
|
|
69
|
+
# With MCP Inspector for debugging
|
|
70
|
+
metalab-mcp --inspect
|
|
71
|
+
|
|
72
|
+
# Use specific AWS profile for SSM lookup
|
|
73
|
+
metalab-mcp --profile metalab-dev
|
|
74
|
+
|
|
75
|
+
# Using environment variables
|
|
76
|
+
FIGMA_ACCESS_TOKEN=figd_YOUR_TOKEN metalab-mcp
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Gateway URL Resolution**:
|
|
80
|
+
|
|
81
|
+
1. AWS SSM Parameter Store (`/mcp/gateway-url`) - if AWS credentials available
|
|
82
|
+
2. `MCP_SERVER_URL` environment variable
|
|
83
|
+
3. Hardcoded production URL (fallback)
|
|
84
|
+
|
|
85
|
+
### metalab-mcp-config
|
|
86
|
+
|
|
87
|
+
Generate configuration for various MCP clients.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Interactive mode
|
|
91
|
+
metalab-mcp-config
|
|
92
|
+
|
|
93
|
+
# Generate config for specific client
|
|
94
|
+
metalab-mcp-config --client claude
|
|
95
|
+
metalab-mcp-config --client windsurf
|
|
96
|
+
metalab-mcp-config --client cursor
|
|
97
|
+
metalab-mcp-config --client cline
|
|
98
|
+
|
|
99
|
+
# Include tokens in config
|
|
100
|
+
metalab-mcp-config --client claude --figma-token figd_YOUR_TOKEN
|
|
101
|
+
|
|
102
|
+
# Write directly to client's config file
|
|
103
|
+
metalab-mcp-config --client claude --output
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Supported Clients**:
|
|
107
|
+
|
|
108
|
+
| Client | Config File Location |
|
|
109
|
+
|--------|---------------------|
|
|
110
|
+
| Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
111
|
+
| Claude Desktop (Windows) | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
112
|
+
| Claude Desktop (Linux) | `~/.config/Claude/claude_desktop_config.json` |
|
|
113
|
+
| Windsurf | `~/.codeium/windsurf/mcp_config.json` |
|
|
114
|
+
| Cursor | `~/.cursor/mcp.json` |
|
|
115
|
+
| Cline (VS Code) | `.vscode/cline_mcp_settings.json` |
|
|
116
|
+
|
|
117
|
+
## Claude Desktop Configuration
|
|
118
|
+
|
|
119
|
+
**Option 1: Use the config generator**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npx @metalabdesign/mcp-client-config --client claude --output
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Option 2: Manual configuration**
|
|
126
|
+
|
|
127
|
+
Add to your Claude Desktop config file:
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"mcpServers": {
|
|
132
|
+
"metalab": {
|
|
133
|
+
"command": "npx",
|
|
134
|
+
"args": ["@metalabdesign/mcp-client"]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**With service tokens**:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"mcpServers": {
|
|
145
|
+
"metalab": {
|
|
146
|
+
"command": "npx",
|
|
147
|
+
"args": ["@metalabdesign/mcp-client"],
|
|
148
|
+
"env": {
|
|
149
|
+
"FIGMA_ACCESS_TOKEN": "figd_YOUR_TOKEN_HERE",
|
|
150
|
+
"NOTION_ACCESS_TOKEN": "secret_YOUR_TOKEN_HERE"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Service Tokens
|
|
158
|
+
|
|
159
|
+
| Service | CLI Option | Environment Variable | Status |
|
|
160
|
+
|---------|------------|---------------------|--------|
|
|
161
|
+
| Figma | `--figma-token` | `FIGMA_ACCESS_TOKEN` | Full per-user support |
|
|
162
|
+
| Notion | `--notion-token` | `NOTION_ACCESS_TOKEN` | Limited (see docs) |
|
|
163
|
+
|
|
164
|
+
### Getting Your Figma Token
|
|
165
|
+
|
|
166
|
+
1. Log in to your Figma account
|
|
167
|
+
2. Go to **Settings** > **Account**
|
|
168
|
+
3. Scroll to **Personal access tokens**
|
|
169
|
+
4. Click **Generate new token**
|
|
170
|
+
5. Copy the token (starts with `figd_`)
|
|
171
|
+
|
|
172
|
+
## AWS SSO Integration
|
|
173
|
+
|
|
174
|
+
For automatic gateway URL discovery via SSM Parameter Store:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Configure AWS SSO profile
|
|
178
|
+
aws configure sso --profile metalab-dev
|
|
179
|
+
|
|
180
|
+
# Log in
|
|
181
|
+
aws sso login --profile metalab-dev
|
|
182
|
+
|
|
183
|
+
# Now metalab-mcp will auto-detect the gateway URL
|
|
184
|
+
metalab-mcp --profile metalab-dev
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Advanced Options
|
|
188
|
+
|
|
189
|
+
The underlying `mcp-local-proxy` CLI is also available:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
mcp-local-proxy \
|
|
193
|
+
--remote-url https://your-gateway.example.com/mcp \
|
|
194
|
+
--callback-url http://localhost:9861/oauth/callback \
|
|
195
|
+
--figma-token figd_YOUR_TOKEN
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
| Option | Description | Default |
|
|
199
|
+
|--------|-------------|---------|
|
|
200
|
+
| `--remote-url` | Remote MCP server URL | Required |
|
|
201
|
+
| `--callback-url` | OAuth callback URL | Required |
|
|
202
|
+
| `--token-dir` | Directory for token storage | `~/.metalab/mcp-client/tokens` |
|
|
203
|
+
| `--timeout` | Request timeout in ms | 30000 |
|
|
204
|
+
| `--no-browser` | Don't auto-open browser | false |
|
|
205
|
+
| `--log-level` | debug, info, warn, error | info |
|
|
206
|
+
| `--figma-token` | Figma access token | `FIGMA_ACCESS_TOKEN` env var |
|
|
207
|
+
| `--notion-token` | Notion access token | `NOTION_ACCESS_TOKEN` env var |
|
|
208
|
+
|
|
209
|
+
## How It Works
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
MCP Client metalab-mcp MCP Gateway MCP Services
|
|
213
|
+
(Claude, etc.) (proxy) (Figma, Notion...)
|
|
214
|
+
| | | |
|
|
215
|
+
|----stdio---> | | |
|
|
216
|
+
| |----HTTPS+OAuth---> | |
|
|
217
|
+
| | |----aggregate---> |
|
|
218
|
+
| |<---MCP responses------|<---------------------|
|
|
219
|
+
|<---stdio-----------| | |
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
1. **Auto-config**: Discovers gateway URL from SSM/env/hardcoded fallback
|
|
223
|
+
2. **OAuth 2.1**: Handles authentication with Okta via browser
|
|
224
|
+
3. **Token Management**: Persists and refreshes tokens automatically
|
|
225
|
+
4. **MCP Proxy**: Bridges stdio (local) to HTTPS (remote)
|
|
226
|
+
5. **Service Tokens**: Forwards per-user tokens to downstream services
|
|
227
|
+
|
|
228
|
+
## Security
|
|
229
|
+
|
|
230
|
+
- **PKCE**: Uses SHA-256 code challenge for OAuth 2.1
|
|
231
|
+
- **Token Storage**: Tokens stored with 0600 permissions (owner read/write only)
|
|
232
|
+
- **Localhost Binding**: Callback server binds to 127.0.0.1 only
|
|
233
|
+
- **Gateway Protected**: MCP Gateway requires Okta authentication
|
|
234
|
+
- **Public Package**: Safe because gateway still requires authentication
|
|
235
|
+
|
|
236
|
+
## Requirements
|
|
237
|
+
|
|
238
|
+
- Node.js 20 or later
|
|
239
|
+
- (Optional) AWS CLI for SSM-based gateway URL discovery
|
|
240
|
+
|
|
241
|
+
## License
|
|
242
|
+
|
|
243
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Local Proxy CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* mcp-local-proxy --remote-url <url> --callback-url <url> [options]
|
|
7
|
+
*
|
|
8
|
+
* Example:
|
|
9
|
+
* mcp-local-proxy \
|
|
10
|
+
* --remote-url https://mcp.example.com/mcp \
|
|
11
|
+
* --callback-url http://localhost:9876/callback
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
package/dist/bin/cli.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Local Proxy CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* mcp-local-proxy --remote-url <url> --callback-url <url> [options]
|
|
7
|
+
*
|
|
8
|
+
* Example:
|
|
9
|
+
* mcp-local-proxy \
|
|
10
|
+
* --remote-url https://mcp.example.com/mcp \
|
|
11
|
+
* --callback-url http://localhost:9876/callback
|
|
12
|
+
*/
|
|
13
|
+
import { createProxy } from '../index.js';
|
|
14
|
+
function printHelp() {
|
|
15
|
+
console.error(`
|
|
16
|
+
MCP Local Proxy - Connect to remote OAuth-protected MCP servers
|
|
17
|
+
|
|
18
|
+
USAGE:
|
|
19
|
+
mcp-local-proxy --remote-url <url> --callback-url <url> [options]
|
|
20
|
+
|
|
21
|
+
REQUIRED:
|
|
22
|
+
--remote-url <url> Remote MCP server URL
|
|
23
|
+
--callback-url <url> OAuth callback URL with port (e.g., http://localhost:9876/callback)
|
|
24
|
+
|
|
25
|
+
OPTIONS:
|
|
26
|
+
--token-dir <dir> Directory for token storage (default: ~/.metalab/mcp-local-proxy/tokens)
|
|
27
|
+
--timeout <ms> Request timeout in milliseconds (default: 30000)
|
|
28
|
+
--no-browser Don't auto-open browser for auth
|
|
29
|
+
--log-level <level> Log level: debug, info, warn, error (default: info)
|
|
30
|
+
--figma-token <token> Figma access token (alternative: FIGMA_ACCESS_TOKEN env var)
|
|
31
|
+
--notion-token <token> Notion access token (alternative: NOTION_ACCESS_TOKEN env var)
|
|
32
|
+
--help, -h Show this help message
|
|
33
|
+
|
|
34
|
+
EXAMPLES:
|
|
35
|
+
# Basic usage
|
|
36
|
+
mcp-local-proxy \\
|
|
37
|
+
--remote-url https://mcp.example.com/mcp \\
|
|
38
|
+
--callback-url http://localhost:9876/callback
|
|
39
|
+
|
|
40
|
+
# With custom callback port (specify in URL)
|
|
41
|
+
mcp-local-proxy \\
|
|
42
|
+
--remote-url https://mcp.example.com/mcp \\
|
|
43
|
+
--callback-url http://localhost:3000/oauth/callback
|
|
44
|
+
|
|
45
|
+
# Debug mode
|
|
46
|
+
mcp-local-proxy \\
|
|
47
|
+
--remote-url https://mcp.example.com/mcp \\
|
|
48
|
+
--callback-url http://localhost:9876/callback \\
|
|
49
|
+
--log-level debug
|
|
50
|
+
|
|
51
|
+
# With Figma token
|
|
52
|
+
mcp-local-proxy \\
|
|
53
|
+
--remote-url https://mcp.example.com/mcp \\
|
|
54
|
+
--callback-url http://localhost:9876/callback \\
|
|
55
|
+
--figma-token figd_xxxxx
|
|
56
|
+
|
|
57
|
+
# Multiple service tokens
|
|
58
|
+
mcp-local-proxy \\
|
|
59
|
+
--remote-url https://mcp.example.com/mcp \\
|
|
60
|
+
--callback-url http://localhost:9876/callback \\
|
|
61
|
+
--figma-token figd_xxxxx \\
|
|
62
|
+
--notion-token secret_xxxxx
|
|
63
|
+
|
|
64
|
+
CLAUDE DESKTOP CONFIGURATION:
|
|
65
|
+
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
|
|
66
|
+
|
|
67
|
+
# Basic configuration
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"my-remote-server": {
|
|
71
|
+
"command": "npx",
|
|
72
|
+
"args": [
|
|
73
|
+
"@metalab/mcp-local-proxy",
|
|
74
|
+
"--remote-url", "https://mcp.example.com/mcp",
|
|
75
|
+
"--callback-url", "http://localhost:9876/callback"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# With service tokens (CLI args)
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"metalab-mcp": {
|
|
85
|
+
"command": "npx",
|
|
86
|
+
"args": [
|
|
87
|
+
"@metalab/mcp-local-proxy",
|
|
88
|
+
"--remote-url", "https://mcp.example.com/mcp",
|
|
89
|
+
"--callback-url", "http://localhost:9876/callback",
|
|
90
|
+
"--figma-token", "figd_xxxxx"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# With service tokens (environment variables)
|
|
97
|
+
{
|
|
98
|
+
"mcpServers": {
|
|
99
|
+
"metalab-mcp": {
|
|
100
|
+
"command": "npx",
|
|
101
|
+
"args": [
|
|
102
|
+
"@metalab/mcp-local-proxy",
|
|
103
|
+
"--remote-url", "https://mcp.example.com/mcp",
|
|
104
|
+
"--callback-url", "http://localhost:9876/callback"
|
|
105
|
+
],
|
|
106
|
+
"env": {
|
|
107
|
+
"FIGMA_ACCESS_TOKEN": "figd_xxxxx"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
`);
|
|
113
|
+
}
|
|
114
|
+
function parseArgs(argv) {
|
|
115
|
+
const args = {
|
|
116
|
+
serviceTokens: {},
|
|
117
|
+
};
|
|
118
|
+
let i = 2; // Skip 'node' and script path
|
|
119
|
+
while (i < argv.length) {
|
|
120
|
+
const arg = argv[i];
|
|
121
|
+
switch (arg) {
|
|
122
|
+
case '--remote-url':
|
|
123
|
+
args.remoteUrl = argv[++i];
|
|
124
|
+
break;
|
|
125
|
+
case '--callback-url':
|
|
126
|
+
args.callbackUrl = argv[++i];
|
|
127
|
+
break;
|
|
128
|
+
case '--token-dir':
|
|
129
|
+
args.tokenStorageDir = argv[++i];
|
|
130
|
+
break;
|
|
131
|
+
case '--timeout':
|
|
132
|
+
args.timeout = Number.parseInt(argv[++i] ?? '', 10);
|
|
133
|
+
break;
|
|
134
|
+
case '--no-browser':
|
|
135
|
+
args.openBrowser = false;
|
|
136
|
+
break;
|
|
137
|
+
case '--log-level':
|
|
138
|
+
args.logLevel = argv[++i];
|
|
139
|
+
break;
|
|
140
|
+
case '--figma-token':
|
|
141
|
+
case '--figma':
|
|
142
|
+
args.serviceTokens.figma = argv[++i] ?? '';
|
|
143
|
+
break;
|
|
144
|
+
case '--notion-token':
|
|
145
|
+
case '--notion':
|
|
146
|
+
args.serviceTokens.notion = argv[++i] ?? '';
|
|
147
|
+
break;
|
|
148
|
+
case '--help':
|
|
149
|
+
case '-h':
|
|
150
|
+
args.help = true;
|
|
151
|
+
break;
|
|
152
|
+
default:
|
|
153
|
+
if (arg?.startsWith('-')) {
|
|
154
|
+
console.error(`Unknown option: ${arg}`);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
i++;
|
|
159
|
+
}
|
|
160
|
+
// Load service tokens from environment variables (fallback)
|
|
161
|
+
if (process.env.FIGMA_ACCESS_TOKEN) {
|
|
162
|
+
args.serviceTokens.figma = args.serviceTokens.figma || process.env.FIGMA_ACCESS_TOKEN;
|
|
163
|
+
}
|
|
164
|
+
if (process.env.NOTION_ACCESS_TOKEN) {
|
|
165
|
+
args.serviceTokens.notion = args.serviceTokens.notion || process.env.NOTION_ACCESS_TOKEN;
|
|
166
|
+
}
|
|
167
|
+
// Clean up empty serviceTokens object
|
|
168
|
+
if (Object.keys(args.serviceTokens).length === 0) {
|
|
169
|
+
delete args.serviceTokens;
|
|
170
|
+
}
|
|
171
|
+
return args;
|
|
172
|
+
}
|
|
173
|
+
async function main() {
|
|
174
|
+
const args = parseArgs(process.argv);
|
|
175
|
+
if (args.help) {
|
|
176
|
+
printHelp();
|
|
177
|
+
process.exit(0);
|
|
178
|
+
}
|
|
179
|
+
if (!args.remoteUrl) {
|
|
180
|
+
console.error('Error: --remote-url is required');
|
|
181
|
+
console.error('Run with --help for usage information');
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
if (!args.callbackUrl) {
|
|
185
|
+
console.error('Error: --callback-url is required');
|
|
186
|
+
console.error('Run with --help for usage information');
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const proxy = await createProxy({
|
|
191
|
+
remoteUrl: args.remoteUrl,
|
|
192
|
+
callbackUrl: args.callbackUrl,
|
|
193
|
+
tokenStorageDir: args.tokenStorageDir,
|
|
194
|
+
timeout: args.timeout,
|
|
195
|
+
openBrowser: args.openBrowser ?? true,
|
|
196
|
+
logLevel: args.logLevel ?? 'info',
|
|
197
|
+
serviceTokens: args.serviceTokens,
|
|
198
|
+
});
|
|
199
|
+
// Handle shutdown gracefully
|
|
200
|
+
const shutdown = async () => {
|
|
201
|
+
console.error('Shutting down...');
|
|
202
|
+
await proxy.disconnect();
|
|
203
|
+
process.exit(0);
|
|
204
|
+
};
|
|
205
|
+
process.on('SIGINT', shutdown);
|
|
206
|
+
process.on('SIGTERM', shutdown);
|
|
207
|
+
// Start the proxy
|
|
208
|
+
await proxy.start();
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
console.error('Failed to start proxy:', error);
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
main();
|
|
216
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa1C,SAAS,SAAS;IACd,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGjB,CAAC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC7B,MAAM,IAAI,GAAY;QAClB,aAAa,EAAE,EAAE;KACpB,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;IAEzC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACV,KAAK,cAAc;gBACf,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACV,KAAK,gBAAgB;gBACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM;YACV,KAAK,aAAa;gBACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,MAAM;YACV,KAAK,WAAW;gBACZ,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM;YACV,KAAK,cAAc;gBACf,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAM;YACV,KAAK,aAAa;gBACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAwB,CAAC;gBACjD,MAAM;YACV,KAAK,eAAe,CAAC;YACrB,KAAK,SAAS;gBACV,IAAI,CAAC,aAAc,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM;YACV,KAAK,gBAAgB,CAAC;YACtB,KAAK,UAAU;gBACX,IAAI,CAAC,aAAc,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM;YACV,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,MAAM;YACV;gBACI,IAAI,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;oBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;QACT,CAAC;QACD,CAAC,EAAE,CAAC;IACR,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACjC,IAAI,CAAC,aAAc,CAAC,KAAK,GAAG,IAAI,CAAC,aAAc,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC5F,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAClC,IAAI,CAAC,aAAc,CAAC,MAAM,GAAG,IAAI,CAAC,aAAc,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC/F,CAAC;IAED,sCAAsC;IACtC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACf,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;YACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;SACpC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAClC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,kBAAkB;QAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metalab-mcp-config.d.ts","sourceRoot":"","sources":["../../src/bin/metalab-mcp-config.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|