@remcp/remcp 0.1.0 → 0.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 CHANGED
@@ -16,23 +16,42 @@ ChatGPT / MCP client ── OAuth + HTTPS ──> ReMCP server
16
16
 
17
17
  The central service stores account/device metadata, hashed reusable credentials and OAuth state. Actual filesystem and process access stays on the paired computer.
18
18
 
19
- ## Install
19
+ ## Install and pair
20
20
 
21
- Requires Node.js 22.5 or newer.
21
+ Requires Node.js 22.5 or newer. Generate a one-time pairing code after signing in at https://remcp.delio24.com, then run:
22
22
 
23
23
  ```bash
24
- npx @remcp/remcp connect --server https://remcp.delio24.com --code YOUR_PAIRING_CODE --install
24
+ npx --yes @remcp/remcp@latest connect --server https://remcp.delio24.com --code YOUR_PAIRING_CODE --install
25
25
  ```
26
26
 
27
- Generate the one-time pairing code after signing in at https://remcp.delio24.com.
27
+ `--install` creates a persistent global `remcp` CLI and Linux user service. The initial `npx` execution is only the bootstrap step.
28
+
29
+ Verify:
30
+
31
+ ```bash
32
+ remcp --version
33
+ remcp status
34
+ ```
35
+
36
+ ## Update
37
+
38
+ ```bash
39
+ remcp update
40
+ ```
41
+
42
+ This updates the global CLI to the latest published release, refreshes the compatible local runtime, and restarts the installed user service.
43
+
28
44
  ## CLI
29
45
 
30
46
  ```text
31
- remcp connect Pair this computer with a ReMCP server
32
- remcp start Run the device agent in the foreground
33
- remcp status Check the saved configuration and server
34
- remcp install Install the user service where supported
35
- remcp uninstall Remove the installed user service
47
+ remcp start Run the device agent in the foreground
48
+ remcp status Check pairing, version and server health
49
+ remcp doctor Alias for status
50
+ remcp update Update ReMCP and restart the installed service
51
+ remcp install Install or repair the user service
52
+ remcp uninstall Remove the user service
53
+ remcp uninstall --purge Remove the service and global ReMCP packages
54
+ remcp --version Print the installed CLI version
36
55
  ```
37
56
 
38
57
  ## Self-host the server
@@ -78,6 +97,4 @@ npm audit --omit=dev
78
97
 
79
98
  ## License
80
99
 
81
- ReMCP is MIT licensed. `@wonderwhy-er/desktop-commander` is a separate MIT-licensed dependency; its notices are preserved in `THIRD_PARTY_NOTICES.md`.
82
-
83
- ReMCP does not require or depend on the proprietary Remote Desktop Commander hosted relay service.
100
+ ReMCP is MIT licensed. Third-party notices for the local device runtime are preserved in `THIRD_PARTY_NOTICES.md`. ReMCP is self-hostable and does not depend on a proprietary hosted relay.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remcp/remcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Self-hosted remote MCP bridge for securely controlling your own computers from MCP clients.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,7 +30,6 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@modelcontextprotocol/sdk": "^1.30.0",
33
- "@wonderwhy-er/desktop-commander": "^0.2.50",
34
33
  "express": "^5.2.1",
35
34
  "express-rate-limit": "^8.7.0",
36
35
  "helmet": "^8.3.0",
@@ -8,7 +8,7 @@
8
8
  <title>Authorize · ReMCP</title>
9
9
  <meta name="description" content="Authorize an MCP client to access computers paired to your ReMCP account.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,7 +28,7 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="oauth-main" class="oauth-shell">
34
34
  <section class="oauth-card">
@@ -62,7 +62,7 @@
62
62
  </div>
63
63
  <p id="status" class="muted" aria-live="polite"></p>
64
64
  <p id="error" class="error" role="alert" aria-live="assertive"></p>
65
- <p class="footer-mini"><a href="/privacy">Privacy</a> · <a href="/terms">Terms</a> · <a href="/security">Security</a></p>
65
+ <p class="footer-mini"><a href="/docs">Docs</a> · <a href="/docs#install">Install</a> · <a href="/docs#update">Update</a> · <a href="/security">Security</a> · <a href="/privacy">Privacy</a> · <a href="/terms">Terms</a></p>
66
66
  </section>
67
67
  </main>
68
68
  <script type="module" src="/oauth-app.js?v=36155fefb47e"></script>
package/public/copy.js ADDED
@@ -0,0 +1,49 @@
1
+ function legacyCopy(text) {
2
+ const input = document.createElement('textarea');
3
+ input.value = text;
4
+ input.setAttribute('readonly', '');
5
+ input.style.position = 'fixed';
6
+ input.style.inset = '0 auto auto -9999px';
7
+ document.body.append(input);
8
+ input.select();
9
+ input.setSelectionRange(0, input.value.length);
10
+ const copied = document.execCommand('copy');
11
+ input.remove();
12
+ if (!copied) throw new Error('Clipboard write failed');
13
+ }
14
+
15
+ async function copyText(text) {
16
+ if (window.isSecureContext && navigator.clipboard?.writeText) {
17
+ try {
18
+ await navigator.clipboard.writeText(text);
19
+ return;
20
+ } catch {
21
+ legacyCopy(text);
22
+ return;
23
+ }
24
+ }
25
+ legacyCopy(text);
26
+ }
27
+
28
+ document.addEventListener('click', async event => {
29
+ const button = event.target.closest('[data-copy]');
30
+ if (!button) return;
31
+ const target = document.querySelector(button.dataset.copy);
32
+ if (!target) return;
33
+
34
+ const original = button.textContent;
35
+ const originalLabel = button.getAttribute('aria-label') || 'Copy command';
36
+ try {
37
+ await copyText(target.textContent.trim());
38
+ button.textContent = 'Copied';
39
+ button.setAttribute('aria-label', 'Copied to clipboard');
40
+ } catch {
41
+ button.textContent = 'Copy failed';
42
+ button.setAttribute('aria-label', 'Copy failed. Select the command manually.');
43
+ }
44
+
45
+ window.setTimeout(() => {
46
+ button.textContent = original;
47
+ button.setAttribute('aria-label', originalLabel);
48
+ }, 1400);
49
+ });
package/public/docs.html CHANGED
@@ -8,7 +8,7 @@
8
8
  <title>Docs · ReMCP</title>
9
9
  <meta name="description" content="Connect a computer to ReMCP and configure the hosted MCP endpoint.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,20 +28,57 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs" aria-current="page">Docs</a><a href="/security">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs" aria-current="page">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="main" class="doc-shell">
34
- <aside class="doc-nav" aria-label="Documentation"><a href="/docs" aria-current="page">Setup</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
34
+ <aside class="doc-nav" aria-label="Documentation"><a href="/docs" aria-current="page">Setup</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
35
35
  <article class="prose">
36
36
  <p class="eyebrow">Documentation</p>
37
- <h1>Connect a computer to ReMCP.</h1>
38
- <p>ReMCP is a remote MCP relay. The hosted server authenticates the MCP client and routes each tool call to a paired local agent.</p>
39
- <h2>1. Sign in</h2><p>Open <a href="/">the ReMCP workspace</a> and authenticate. Generate a one-time pairing command from the device section.</p>
40
- <h2>2. Pair the computer</h2><pre><code>npx @remcp/remcp connect --server https://remcp.delio24.com --code YOUR_CODE --install</code></pre><p>The code is exchanged for a device-specific credential that can later be revoked.</p>
41
- <h2>3. Add the MCP server</h2><pre><code>https://remcp.delio24.com/mcp</code></pre><p>Choose OAuth when your MCP client asks for authentication. ReMCP uses authorization code flow with PKCE and refresh tokens.</p>
42
- <h2>Connection model</h2><p>The device agent creates an outbound secure WebSocket connection to the relay. You do not need to expose a listener on the computer.</p>
43
- <div class="notice"><strong>Review mutating actions.</strong><p>Some tools can write files or run processes. Review the action requested by your MCP client before approving it.</p></div>
44
- <h2>Self-hosting</h2><p>The central ReMCP service runs in Docker with persistent account, device and OAuth metadata. Device agents run natively so host access does not require a privileged container.</p>
37
+ <h1>Install, pair and keep ReMCP updated.</h1>
38
+ <p>Use <code>npx</code> once to pair a computer. With <code>--install</code>, ReMCP creates a persistent global CLI and a user service, so normal operation no longer depends on the temporary npx cache.</p>
39
+
40
+ <h2 id="requirements">1. Requirements</h2>
41
+ <p>Install Node.js 22.5 or newer. The computer needs outbound HTTPS/WSS access to <code>remcp.delio24.com</code>; no inbound device port is required.</p>
42
+
43
+ <h2 id="pair">2. Get a pairing code</h2>
44
+ <p>Open <a href="/#connect">the ReMCP workspace</a>, sign in, and choose <strong>Generate Command</strong>. Pairing codes are short-lived and single-use.</p>
45
+
46
+ <h2 id="install">3. Install and pair</h2>
47
+ <div class="code-row"><pre><code id="docs-command-1">npx --yes @remcp/remcp@latest connect --server https://remcp.delio24.com --code YOUR_CODE --install</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-1" aria-label="Copy command" aria-live="polite">Copy</button></div>
48
+ <p>This stores a device-specific credential locally, installs the persistent <code>remcp</code> CLI, installs the compatible local device runtime, and starts the ReMCP user service.</p>
49
+
50
+ <h3>Verify the installation</h3>
51
+ <div class="code-row"><pre><code id="docs-command-2">remcp --version
52
+ remcp status</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-2" aria-label="Copy command" aria-live="polite">Copy</button></div>
53
+ <p><code>status</code> shows the installed CLI version, paired device id, server URL and server health.</p>
54
+
55
+ <h2 id="mcp">4. Add the MCP endpoint</h2>
56
+ <div class="code-row"><pre><code id="docs-command-3">https://remcp.delio24.com/mcp</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-3" aria-label="Copy MCP endpoint" aria-live="polite">Copy</button></div>
57
+ <p>Choose OAuth when your MCP client asks for authentication. ReMCP uses authorization code flow with PKCE and refresh tokens.</p>
58
+
59
+ <h2 id="update">Update ReMCP</h2>
60
+ <div class="code-row"><pre><code id="docs-command-4">remcp update</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-4" aria-label="Copy command" aria-live="polite">Copy</button></div>
61
+ <p>The update command installs the latest published ReMCP CLI, refreshes the compatible local runtime, and restarts the user service when it is installed. Verify afterwards with <code>remcp --version</code> or <code>remcp status</code>.</p>
62
+
63
+ <h2 id="service">Service commands</h2>
64
+ <div class="code-row"><pre><code id="docs-command-5">remcp status
65
+ remcp doctor
66
+ remcp install
67
+ remcp start</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-5" aria-label="Copy command" aria-live="polite">Copy</button></div>
68
+ <p><code>start</code> runs the agent in the foreground. <code>install</code> repairs or reinstalls the persistent user service for an already paired computer.</p>
69
+
70
+ <h2 id="uninstall">Uninstall</h2>
71
+ <div class="code-row"><pre><code id="docs-command-6">remcp uninstall</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-6" aria-label="Copy command" aria-live="polite">Copy</button></div>
72
+ <p>This stops and removes the background user service but keeps the CLI and local pairing configuration.</p>
73
+ <div class="code-row"><pre><code id="docs-command-7">remcp uninstall --purge</code></pre><button class="copy-button code-copy" type="button" data-copy="#docs-command-7" aria-label="Copy command" aria-live="polite">Copy</button></div>
74
+ <p><code>--purge</code> also removes the globally installed ReMCP packages. The local pairing configuration remains in <code>~/.config/remcp</code> so it is not silently destroyed.</p>
75
+
76
+ <h2 id="connection-model">Connection model</h2>
77
+ <p>The device agent creates an outbound secure WebSocket connection to the relay. You do not need to expose a listener on the computer.</p>
78
+ <div class="notice"><strong>Review mutating actions.</strong><p>Some tools can write files or run processes. Review the action requested by your MCP client before approving it.</p></div>
79
+
80
+ <h2 id="self-hosting">Self-hosting</h2>
81
+ <p>The central ReMCP service runs in Docker with persistent account, device and OAuth metadata. Device agents run natively so host access does not require a privileged container.</p>
45
82
  </article>
46
83
  </main>
47
84
  <footer class="site-footer">
@@ -49,10 +86,9 @@
49
86
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
50
87
  <span translate="no">ReMCP</span>
51
88
  </div>
52
- <nav aria-label="Footer">
53
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
54
- </nav>
89
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
55
90
  <p>Open-source remote MCP infrastructure.</p>
56
91
  </footer>
92
+ <script type="module" src="/copy.js?v=remcp-012"></script>
57
93
  </body>
58
94
  </html>
package/public/index.html CHANGED
@@ -8,7 +8,7 @@
8
8
  <title>ReMCP — Your computers over MCP</title>
9
9
  <meta name="description" content="Securely pair your own computers and use their files, terminal and processes through authenticated MCP clients.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,7 +28,7 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="main">
34
34
  <section class="hero">
@@ -56,6 +56,32 @@
56
56
  <div><span>03</span><h2>Explicit control</h2><p>Read, write and destructive tools declare their behavior so MCP clients can apply the right review flow.</p></div>
57
57
  </section>
58
58
 
59
+ <section id="install" class="quickstart">
60
+ <div class="section-heading">
61
+ <p class="eyebrow">Quick start</p>
62
+ <h2>One command to pair. One command to update.</h2>
63
+ <p>Use npx only for the first pairing. <code>--install</code> creates a persistent <code>remcp</code> CLI and background user service.</p>
64
+ </div>
65
+ <div class="quickstart-grid">
66
+ <article class="command-card">
67
+ <span>01</span><h3>Install &amp; pair</h3>
68
+ <div class="command-row"><code id="install-command">npx --yes @remcp/remcp@latest connect --server https://remcp.delio24.com --code YOUR_CODE --install</code><button class="copy-button" type="button" data-copy="#install-command">Copy</button></div>
69
+ <p>Generate <code>YOUR_CODE</code> in the workspace below.</p>
70
+ </article>
71
+ <article class="command-card">
72
+ <span>02</span><h3>Check</h3>
73
+ <div class="command-row"><code id="status-command">remcp status</code><button class="copy-button" type="button" data-copy="#status-command">Copy</button></div>
74
+ <p>Confirm the local CLI version, pairing and server health.</p>
75
+ </article>
76
+ <article id="update" class="command-card">
77
+ <span>03</span><h3>Update</h3>
78
+ <div class="command-row"><code id="update-command">remcp update</code><button class="copy-button" type="button" data-copy="#update-command">Copy</button></div>
79
+ <p>Updates the CLI and restarts the installed user service.</p>
80
+ </article>
81
+ </div>
82
+ <a class="text-link" href="/docs">Full installation and CLI guide <span aria-hidden="true">→</span></a>
83
+ </section>
84
+
59
85
  <section id="connect" class="workspace">
60
86
  <div class="section-heading">
61
87
  <p class="eyebrow">Workspace</p>
@@ -120,9 +146,7 @@
120
146
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
121
147
  <span translate="no">ReMCP</span>
122
148
  </div>
123
- <nav aria-label="Footer">
124
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
125
- </nav>
149
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
126
150
  <p>Open-source remote MCP infrastructure.</p>
127
151
  </footer>
128
152
  <script type="module" src="/app.js?v=14a728f07dd1"></script>
@@ -8,7 +8,7 @@
8
8
  <title>Privacy Policy · ReMCP</title>
9
9
  <meta name="description" content="How ReMCP processes account, device, OAuth and remote-computer data.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,10 +28,10 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="main" class="doc-shell">
34
- <aside class="doc-nav" aria-label="Legal and policy navigation"><a href="/docs">Setup</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy" aria-current="page">Privacy</a><a href="/terms">Terms</a></aside>
34
+ <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy" aria-current="page">Privacy</a><a href="/terms">Terms</a></aside>
35
35
  <article class="prose">
36
36
  <p class="eyebrow">Privacy</p>
37
37
  <h1>Privacy Policy</h1>
@@ -52,9 +52,7 @@
52
52
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
53
53
  <span translate="no">ReMCP</span>
54
54
  </div>
55
- <nav aria-label="Footer">
56
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
57
- </nav>
55
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
58
56
  <p>Open-source remote MCP infrastructure.</p>
59
57
  </footer>
60
58
  </body>
@@ -8,7 +8,7 @@
8
8
  <title>Security · ReMCP</title>
9
9
  <meta name="description" content="How ReMCP isolates accounts, devices, credentials and remote MCP tool access.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,10 +28,10 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security" aria-current="page">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security" aria-current="page">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="main" class="doc-shell">
34
- <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/security" aria-current="page">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
34
+ <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security" aria-current="page">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
35
35
  <article class="prose">
36
36
  <p class="eyebrow">Security</p>
37
37
  <h1>A narrow relay between the model and your machine.</h1>
@@ -50,9 +50,7 @@
50
50
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
51
51
  <span translate="no">ReMCP</span>
52
52
  </div>
53
- <nav aria-label="Footer">
54
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
55
- </nav>
53
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
56
54
  <p>Open-source remote MCP infrastructure.</p>
57
55
  </footer>
58
56
  </body>
package/public/style.css CHANGED
@@ -87,6 +87,19 @@ main { display: block; }
87
87
  .principles h2 { margin: 28px 0 9px; font-size: 21px; line-height: 1.2; letter-spacing: -.025em; }
88
88
  .principles p { max-width: 330px; margin: 0; color: var(--muted); font-size: 15px; }
89
89
 
90
+
91
+ .quickstart { max-width: var(--container); margin: 0 auto; padding: clamp(72px, 9vw, 104px) 20px; border-top: 1px solid var(--line); }
92
+ .quickstart .section-heading { margin-left: 0; margin-right: 0; }
93
+ .quickstart-grid { display: grid; grid-template-columns: 1.35fr .8fr .8fr; gap: 0; margin: 34px 0 26px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
94
+ .command-card { min-width: 0; padding: 28px 28px 30px 0; }
95
+ .command-card + .command-card { padding-left: 28px; border-left: 1px solid var(--line); }
96
+ .command-card > span { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; }
97
+ .command-card h3 { margin: 18px 0 8px; font-size: 20px; letter-spacing: -.025em; }
98
+ .command-card p { margin: 12px 0 0; color: var(--muted); font-size: 14px; }
99
+ .command-card .command-row { margin-top: 14px; }
100
+ .site-header nav { min-width: 0; overflow-x: auto; scrollbar-width: none; }
101
+ .site-header nav::-webkit-scrollbar { display: none; }
102
+
90
103
  .workspace { padding: clamp(72px, 9vw, 112px) 20px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); background: var(--surface); }
91
104
  .workspace > * { max-width: var(--container); margin-left: auto; margin-right: auto; }
92
105
  .section-heading { max-width: 720px; margin-bottom: 45px; }
@@ -107,7 +120,8 @@ input:focus-visible { border-color: var(--accent); }
107
120
  .button-row { display: flex; gap: 9px; margin-top: 5px; }
108
121
  .divider { display: flex; align-items: center; gap: 11px; margin: 7px 0; color: var(--muted); font-size: 12px; }
109
122
  .divider::before, .divider::after { content: ""; flex: 1; height: 1px; background: var(--line); }
110
- .error { min-height: 20px; margin: 2px 0 0; color: var(--danger); font-size: 13px; }
123
+ .error { margin: 2px 0 0; color: var(--danger); font-size: 13px; }
124
+ p:empty, .error:empty, #status:empty { display: none; }
111
125
  .identity { display: flex; align-items: center; gap: 11px; }
112
126
  .identity small { display: block; color: var(--muted); }
113
127
  .status-dot { width: 9px; height: 9px; flex: 0 0 9px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 4px var(--ok-soft); }
@@ -141,24 +155,27 @@ input:focus-visible { border-color: var(--accent); }
141
155
  .site-footer { max-width: var(--container); min-height: 86px; margin: 0 auto; padding: 22px 20px; display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 26px; border-top: 1px solid var(--line); font-size: 13px; }
142
156
  .site-footer p { margin: 0; color: var(--muted); text-align: right; }
143
157
 
144
- .doc-shell { width: min(100%, var(--container)); margin: 0 auto; padding: 64px 20px 112px; display: grid; grid-template-columns: 190px minmax(0, 760px); gap: clamp(48px, 8vw, 96px); }
158
+ .doc-shell { width: min(100%, var(--container)); margin: 0 auto; padding: 48px 20px 76px; display: grid; grid-template-columns: 176px minmax(0, 760px); gap: clamp(36px, 6vw, 72px); }
145
159
  .doc-nav { position: sticky; top: 28px; align-self: start; display: flex; flex-direction: column; gap: 4px; }
146
160
  .doc-nav a { padding: 8px 10px; border-radius: 7px; color: var(--muted); font-size: 14px; font-weight: 550; }
147
161
  .doc-nav a:hover { background: var(--surface-subtle); color: var(--ink); }
148
162
  .doc-nav a[aria-current="page"] { background: var(--surface-subtle); color: var(--ink); font-weight: 680; }
149
163
  .prose { min-width: 0; }
150
- .prose h1 { margin: 0 0 22px; max-width: 740px; font-size: clamp(42px, 5.5vw, 62px); line-height: 1.02; letter-spacing: -.05em; }
151
- .prose h2 { scroll-margin-top: 28px; margin: 52px 0 12px; font-size: 25px; line-height: 1.2; letter-spacing: -.035em; }
152
- .prose h3 { scroll-margin-top: 28px; margin: 31px 0 8px; font-size: 18px; }
153
- .prose p, .prose li { color: #505057; font-size: 16px; text-wrap: pretty; }
154
- .prose p { margin: 0 0 16px; }
164
+ .prose h1 { margin: 0 0 18px; max-width: 700px; font-size: clamp(38px, 5vw, 54px); line-height: 1.04; letter-spacing: -.045em; }
165
+ .prose h2 { scroll-margin-top: 24px; margin: 36px 0 9px; font-size: 23px; line-height: 1.22; letter-spacing: -.03em; }
166
+ .prose h3 { scroll-margin-top: 24px; margin: 24px 0 7px; font-size: 17px; }
167
+ .prose p, .prose li { color: #505057; font-size: 15.5px; text-wrap: pretty; }
168
+ .prose p { margin: 0 0 12px; }
155
169
  .prose a { color: #3538ae; text-decoration: underline; text-decoration-color: #a5a7e9; text-underline-offset: 3px; }
156
170
  .prose a:hover { text-decoration-color: #3538ae; }
157
- .prose pre { overflow: auto; margin: 18px 0 24px; padding: 16px; border-radius: 10px; background: #1e1e21; color: #f4f4f2; }
171
+ .prose pre { min-width: 0; overflow: auto; margin: 0; padding: 13px 14px; background: transparent; color: #f4f4f2; }
172
+ .prose .code-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; margin: 12px 0 16px; overflow: hidden; border-radius: 10px; background: #1e1e21; }
173
+ .prose .code-row .code-copy { min-height: 34px; margin-right: 8px; padding: 7px 10px; border-color: #4b4b50; background: #2b2b2f; color: #f4f4f2; font-size: 12px; white-space: nowrap; }
174
+ .prose .code-row .code-copy:hover { border-color: #66666d; background: #38383d; }
158
175
  .prose code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .9em; }
159
176
  .prose :not(pre) > code { padding: 2px 5px; border-radius: 5px; background: var(--surface-subtle); color: #34343a; }
160
177
  .prose hr { margin: 46px 0; border: 0; border-top: 1px solid var(--line); }
161
- .prose .notice { margin: 28px 0; padding: 16px 18px; border: 1px solid #d8d8f7; border-radius: 9px; background: var(--accent-soft); }
178
+ .prose .notice { margin: 20px 0; padding: 13px 15px; border: 1px solid #d8d8f7; border-radius: 9px; background: var(--accent-soft); }
162
179
  .prose .notice p { margin: 5px 0 0; }
163
180
 
164
181
  .oauth-shell { min-height: calc(100svh - 68px); display: grid; place-items: center; padding: 56px 20px 80px; }
@@ -184,10 +201,13 @@ input:focus-visible, button:focus-visible, a:focus-visible { outline: 3px solid
184
201
  .principles > div, .principles > div + div { min-height: auto; padding: 28px 0; border-left: 0; border-bottom: 1px solid var(--line); }
185
202
  .principles > div:last-child { border-bottom: 0; }
186
203
  .workspace-grid { grid-template-columns: 1fr; }
204
+ .quickstart-grid { grid-template-columns: 1fr; }
205
+ .command-card, .command-card + .command-card { padding: 24px 0; border-left: 0; border-bottom: 1px solid var(--line); }
206
+ .command-card:last-child { border-bottom: 0; }
187
207
  .auth-pane { padding-right: 0; border-right: 0; border-bottom: 1px solid var(--line); }
188
208
  .endpoint-pane { padding-left: 0; }
189
- .doc-shell { grid-template-columns: 1fr; gap: 38px; padding-top: 42px; }
190
- .doc-nav { position: static; flex-direction: row; flex-wrap: wrap; gap: 4px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }
209
+ .doc-shell { grid-template-columns: 1fr; gap: 0; padding-top: 34px; }
210
+ .doc-nav { display: none; }
191
211
  .site-footer { grid-template-columns: 1fr; }
192
212
  .site-footer nav { flex-wrap: wrap; }
193
213
  .site-footer p { text-align: left; }
@@ -196,7 +216,7 @@ input:focus-visible, button:focus-visible, a:focus-visible { outline: 3px solid
196
216
  @media (max-width: 620px) {
197
217
  .site-header { min-height: 62px; padding: 0 16px; }
198
218
  .site-header { gap: 12px; }
199
- .site-header nav { gap: 10px; }
219
+ .site-header nav { max-width: calc(100vw - 116px); gap: 12px; }
200
220
  .site-header nav a { font-size: 12.5px; }
201
221
  .hero { padding: 58px 18px 64px; }
202
222
  .hero h1 { font-size: clamp(46px, 14vw, 60px); }
@@ -205,21 +225,29 @@ input:focus-visible, button:focus-visible, a:focus-visible { outline: 3px solid
205
225
  .node { align-items: flex-start; flex-direction: column; gap: 3px; }
206
226
  .node.device-node { padding-right: 18px; }
207
227
  .node .pulse { top: 15px; }
208
- .workspace, .final-cta { padding-left: 18px; padding-right: 18px; }
228
+ .workspace, .final-cta, .quickstart { padding: 50px 18px; }
229
+ .section-heading { margin-bottom: 30px; }
230
+ .section-heading h2, .final-cta h2 { font-size: 36px; }
231
+ .section-heading > p:last-child, .final-cta > p { margin-top: 12px; font-size: 16px; }
209
232
  .button-row, .oauth-actions { flex-direction: column; }
210
233
  .button-row .button, .oauth-actions .button { width: 100%; }
211
234
  .pair-panel { grid-template-columns: 1fr; }
212
235
  .pair-panel .button { justify-self: start; }
213
236
  .panel-title { align-items: flex-start; flex-direction: column; }
214
- .command-row, .pairing-output { grid-template-columns: 1fr; }
215
- .copy-button { justify-self: start; }
237
+ .command-row, .pairing-output { grid-template-columns: minmax(0, 1fr) auto; }
238
+ .copy-button { justify-self: stretch; }
216
239
  .endpoint-facts div { align-items: flex-start; flex-direction: column; gap: 2px; }
217
240
  .endpoint-facts dd { text-align: left; }
218
241
  .site-footer { padding: 24px 18px; }
219
242
  .site-footer nav { gap: 14px; }
220
- .doc-shell { padding: 34px 18px 80px; }
221
- .doc-nav { overflow-x: auto; flex-wrap: nowrap; margin: 0 -18px; padding: 0 18px 16px; }
222
- .doc-nav a { white-space: nowrap; }
243
+ .doc-shell { gap: 18px; padding: 24px 16px 56px; }
244
+ .prose h1 { margin-bottom: 14px; font-size: clamp(34px, 10vw, 42px); }
245
+ .prose h2 { margin-top: 28px; font-size: 21px; }
246
+ .prose h3 { margin-top: 21px; }
247
+ .prose p, .prose li { font-size: 15px; }
248
+ .prose .code-row { margin: 10px 0 14px; }
249
+ .prose .code-row pre { padding: 12px 10px 12px 13px; }
250
+ .prose .code-row .code-copy { margin-right: 7px; }
223
251
  .oauth-shell { min-height: calc(100svh - 62px); padding: 28px 14px 60px; place-items: start center; }
224
252
  .oauth-card { padding: 22px 18px; }
225
253
  .scope-list li { align-items: flex-start; flex-direction: column; gap: 4px; }
@@ -8,7 +8,7 @@
8
8
  <title>Support · ReMCP</title>
9
9
  <meta name="description" content="Troubleshoot ReMCP sign-in, device pairing, agent connectivity and MCP authorization.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,10 +28,10 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security">Security</a><a href="/support" aria-current="page">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support" aria-current="page">Support</a></nav>
32
32
  </header>
33
33
  <main id="main" class="doc-shell">
34
- <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/security">Security</a><a href="/support" aria-current="page">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
34
+ <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support" aria-current="page">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></aside>
35
35
  <article class="prose">
36
36
  <p class="eyebrow">Support</p>
37
37
  <h1>Troubleshoot ReMCP.</h1>
@@ -40,6 +40,9 @@
40
40
  <h2>OAuth does not complete</h2><p>Return to the authorization screen, sign in to the intended ReMCP account, review the requested access, and choose <strong>Authorize ReMCP Access</strong>.</p>
41
41
  <h2>MCP tool cannot run</h2><p>Confirm the target computer is online and use <code>list_devices</code> to obtain its current device id. Device tools require that id.</p>
42
42
  <h2>Pairing code expired</h2><p>Generate a new pairing command from the workspace. Pairing codes are intentionally short-lived and single-use.</p>
43
+ <h2>Check the installed agent</h2><div class="code-row"><pre><code id="support-command-1">remcp --version
44
+ remcp status</code></pre><button class="copy-button code-copy" type="button" data-copy="#support-command-1" aria-label="Copy command" aria-live="polite">Copy</button></div><p>If <code>remcp</code> is not found, repeat the <a href="/docs#install">install command</a>. The first npx invocation is temporary; <code>--install</code> creates the persistent CLI.</p>
45
+ <h2>Update or repair</h2><div class="code-row"><pre><code id="support-command-2">remcp update</code></pre><button class="copy-button code-copy" type="button" data-copy="#support-command-2" aria-label="Copy command" aria-live="polite">Copy</button></div><p>This refreshes the published CLI and restarts the installed user service. For an already paired device whose service is missing, run <code>remcp install</code>.</p>
43
46
  <h2>Need deployment help?</h2><p>For a self-hosted deployment, contact the operator who provisioned your ReMCP instance and include the affected layer: sign-in, pairing, agent connectivity, or MCP authorization.</p>
44
47
  </article>
45
48
  </main>
@@ -48,10 +51,9 @@
48
51
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
49
52
  <span translate="no">ReMCP</span>
50
53
  </div>
51
- <nav aria-label="Footer">
52
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
53
- </nav>
54
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
54
55
  <p>Open-source remote MCP infrastructure.</p>
55
56
  </footer>
57
+ <script type="module" src="/copy.js?v=remcp-012"></script>
56
58
  </body>
57
59
  </html>
package/public/terms.html CHANGED
@@ -8,7 +8,7 @@
8
8
  <title>Terms of Service · ReMCP</title>
9
9
  <meta name="description" content="Terms for using the hosted ReMCP service and its remote-computer capabilities.">
10
10
  <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=b92ac4c9219a">
11
+ <link rel="stylesheet" href="/style.css?v=remcp-012">
12
12
  <meta property="og:site_name" content="ReMCP">
13
13
  <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
14
  <link rel="icon" href="/favicon.ico" sizes="any">
@@ -28,10 +28,10 @@
28
28
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
29
  <span translate="no">ReMCP</span>
30
30
  </a>
31
- <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a></nav>
31
+ <nav aria-label="Primary"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a></nav>
32
32
  </header>
33
33
  <main id="main" class="doc-shell">
34
- <aside class="doc-nav" aria-label="Legal and policy navigation"><a href="/docs">Setup</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms" aria-current="page">Terms</a></aside>
34
+ <aside class="doc-nav" aria-label="Documentation"><a href="/docs">Setup</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms" aria-current="page">Terms</a></aside>
35
35
  <article class="prose">
36
36
  <p class="eyebrow">Legal</p>
37
37
  <h1>Terms of Service</h1>
@@ -53,9 +53,7 @@
53
53
  <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
54
54
  <span translate="no">ReMCP</span>
55
55
  </div>
56
- <nav aria-label="Footer">
57
- <a href="/docs">Docs</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a>
58
- </nav>
56
+ <nav aria-label="Footer"><a href="/docs">Docs</a><a href="/docs#install">Install</a><a href="/docs#update">Update</a><a href="/security">Security</a><a href="/support">Support</a><a href="/privacy">Privacy</a><a href="/terms">Terms</a></nav>
59
57
  <p>Open-source remote MCP infrastructure.</p>
60
58
  </footer>
61
59
  </body>