@remcp/remcp 0.1.2 → 0.1.4

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.
Files changed (56) hide show
  1. package/README.md +54 -107
  2. package/package.json +12 -52
  3. package/src/agent.mjs +19 -24
  4. package/src/cli.mjs +42 -19
  5. package/src/runtime.mjs +15 -0
  6. package/src/version.mjs +0 -2
  7. package/THIRD_PARTY_NOTICES.md +0 -7
  8. package/assets/remcp-icon.png +0 -0
  9. package/mcp.json +0 -9
  10. package/plugin.json +0 -37
  11. package/public/android-chrome-192x192.png +0 -0
  12. package/public/android-chrome-512x512.png +0 -0
  13. package/public/app.js +0 -95
  14. package/public/apple-touch-icon.png +0 -0
  15. package/public/assets/art/hero-relay.webp +0 -0
  16. package/public/assets/art/relay-detail.webp +0 -0
  17. package/public/assets/icon-120.png +0 -0
  18. package/public/assets/icon-16.png +0 -0
  19. package/public/assets/icon-180.png +0 -0
  20. package/public/assets/icon-192.png +0 -0
  21. package/public/assets/icon-256.png +0 -0
  22. package/public/assets/icon-32.png +0 -0
  23. package/public/assets/icon-48.png +0 -0
  24. package/public/assets/icon-512.png +0 -0
  25. package/public/assets/og-remcp.png +0 -0
  26. package/public/authorize.html +0 -70
  27. package/public/copy.js +0 -49
  28. package/public/docs.html +0 -94
  29. package/public/favicon-16x16.png +0 -0
  30. package/public/favicon-32x32.png +0 -0
  31. package/public/favicon-48x48.png +0 -0
  32. package/public/favicon.ico +0 -0
  33. package/public/index.html +0 -154
  34. package/public/oauth-app.js +0 -54
  35. package/public/privacy.html +0 -60
  36. package/public/remcp-darkmode-16x16.png +0 -0
  37. package/public/remcp-darkmode-192x192.png +0 -0
  38. package/public/remcp-darkmode-32x32.png +0 -0
  39. package/public/remcp-darkmode-48x48.png +0 -0
  40. package/public/remcp-darkmode-512x512.png +0 -0
  41. package/public/security.html +0 -57
  42. package/public/site.webmanifest +0 -23
  43. package/public/style.css +0 -259
  44. package/public/support.html +0 -59
  45. package/public/terms.html +0 -60
  46. package/skills/remcp-operator/SKILL.md +0 -36
  47. package/src/auth.mjs +0 -71
  48. package/src/config.mjs +0 -51
  49. package/src/db.mjs +0 -102
  50. package/src/mcp.mjs +0 -95
  51. package/src/oauth.mjs +0 -164
  52. package/src/relay.mjs +0 -97
  53. package/src/review-sandbox.mjs +0 -96
  54. package/src/server.mjs +0 -159
  55. package/src/tool-catalog.json +0 -796
  56. package/src/util.mjs +0 -24
@@ -1,60 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <meta name="color-scheme" content="light">
7
- <meta name="theme-color" content="#f7f7f5">
8
- <title>Privacy Policy · ReMCP</title>
9
- <meta name="description" content="How ReMCP processes account, device, OAuth and remote-computer data.">
10
- <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=remcp-012">
12
- <meta property="og:site_name" content="ReMCP">
13
- <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
- <link rel="icon" href="/favicon.ico" sizes="any">
15
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" media="(prefers-color-scheme: light)">
16
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" media="(prefers-color-scheme: light)">
17
- <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" media="(prefers-color-scheme: light)">
18
- <link rel="icon" type="image/png" sizes="16x16" href="/remcp-darkmode-16x16.png" media="(prefers-color-scheme: dark)">
19
- <link rel="icon" type="image/png" sizes="32x32" href="/remcp-darkmode-32x32.png" media="(prefers-color-scheme: dark)">
20
- <link rel="icon" type="image/png" sizes="48x48" href="/remcp-darkmode-48x48.png" media="(prefers-color-scheme: dark)">
21
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
22
- <link rel="manifest" href="/site.webmanifest">
23
- </head>
24
- <body>
25
- <a class="skip-link" href="#main">Skip to content</a>
26
- <header class="site-header">
27
- <a class="wordmark" href="/" aria-label="ReMCP home">
28
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
- <span translate="no">ReMCP</span>
30
- </a>
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
- </header>
33
- <main id="main" class="doc-shell">
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
- <article class="prose">
36
- <p class="eyebrow">Privacy</p>
37
- <h1>Privacy Policy</h1>
38
- <p><strong>Effective September 16, 2026.</strong> This policy describes the hosted ReMCP service at remcp.delio24.com. A self-hosted deployment is operated by its own administrator and may have different practices.</p>
39
- <h2>What ReMCP does</h2><p>ReMCP authenticates an MCP client, identifies computers you have paired, and relays authorized tool calls between that client and the selected computer. Device agents connect outbound to the ReMCP service.</p>
40
- <h2>Account and Google Sign-In data</h2><p>Authentication is provided by Firebase Authentication. If you choose Google Sign-In, Firebase may provide ReMCP with your Firebase user identifier, email address and display name. ReMCP uses this information only to authenticate you, keep your devices separated from other accounts, and administer your ReMCP account. ReMCP does not request Gmail, Google Drive, Google Calendar or other Google API data.</p>
41
- <h2>Device and security metadata</h2><p>ReMCP stores device identifiers, device names and basic platform metadata, one-way hashes of device credentials, pairing records, OAuth client metadata, and one-way hashes of refresh credentials. Pairing codes are short-lived and single-use. Raw device credentials are returned to the paired device and are not stored in plaintext by the service.</p>
42
- <h2>Files, commands and tool results</h2><p>When you use an MCP tool, its request and response may pass through the ReMCP relay. This can include filenames, file contents, command output and process information that you explicitly ask the paired computer to process. ReMCP does not intentionally retain those tool payloads as product data. Operational security logs may retain limited metadata such as timestamps, status codes and errors.</p>
43
- <h2>How data is used and shared</h2><p>Data is used to provide authentication, device pairing, OAuth authorization, request routing, abuse prevention, security and reliability. ReMCP does not sell personal information and does not serve advertising. Data may be processed by infrastructure and authentication providers only as needed to operate the service, including Firebase/Google for authentication.</p>
44
- <h2>Retention and control</h2><p>Pairing codes expire after 10 minutes by default. MCP access tokens expire after 1 hour by default. Refresh credentials expire after 30 days by default and are rotated on use. Device records remain until you revoke or remove the device. ReMCP does not intentionally retain MCP tool request or response payloads as product data. Hosted Nginx access and error logs are rotated daily with 14 rotated copies. Application container logs are size-bounded to three files of at most 50 MB each rather than retained for a fixed number of days. These operational logs are used only for security, reliability, and troubleshooting and are not intended to contain authentication secrets or MCP tool payloads. You can revoke a paired device from the ReMCP workspace, and account-data or deletion requests can be made through the Support page.</p>
45
- <h2>Restricted data</h2><p>ReMCP is not intended to collect or process passwords, MFA or OTP codes, API or private keys, payment-card data, protected health information, or government identifiers through plugin tool calls. Users should keep those data out of ReMCP requests and use a safer local workflow when a requested file or command would expose them.</p>
46
- <h2>Security and international processing</h2><p>ReMCP uses TLS for network transport, hashes reusable credentials before storage, and scopes device access to the authenticated account. Internet services may process data in more than one country depending on infrastructure and authentication providers. See the <a href="/security">Security page</a> for the current security model.</p>
47
- <h2>Children</h2><p>ReMCP is a developer and systems-administration tool and is not directed to children under 13.</p>
48
- <h2>Changes</h2><p>Material changes to this policy will be published at this URL with an updated effective date.</p>
49
- </article>
50
- </main>
51
- <footer class="site-footer">
52
- <div class="wordmark">
53
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
54
- <span translate="no">ReMCP</span>
55
- </div>
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>
57
- <p>Open-source remote MCP infrastructure.</p>
58
- </footer>
59
- </body>
60
- </html>
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,57 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <meta name="color-scheme" content="light">
7
- <meta name="theme-color" content="#f7f7f5">
8
- <title>Security · ReMCP</title>
9
- <meta name="description" content="How ReMCP isolates accounts, devices, credentials and remote MCP tool access.">
10
- <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=remcp-012">
12
- <meta property="og:site_name" content="ReMCP">
13
- <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
- <link rel="icon" href="/favicon.ico" sizes="any">
15
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" media="(prefers-color-scheme: light)">
16
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" media="(prefers-color-scheme: light)">
17
- <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" media="(prefers-color-scheme: light)">
18
- <link rel="icon" type="image/png" sizes="16x16" href="/remcp-darkmode-16x16.png" media="(prefers-color-scheme: dark)">
19
- <link rel="icon" type="image/png" sizes="32x32" href="/remcp-darkmode-32x32.png" media="(prefers-color-scheme: dark)">
20
- <link rel="icon" type="image/png" sizes="48x48" href="/remcp-darkmode-48x48.png" media="(prefers-color-scheme: dark)">
21
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
22
- <link rel="manifest" href="/site.webmanifest">
23
- </head>
24
- <body>
25
- <a class="skip-link" href="#main">Skip to content</a>
26
- <header class="site-header">
27
- <a class="wordmark" href="/" aria-label="ReMCP home">
28
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
- <span translate="no">ReMCP</span>
30
- </a>
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
- </header>
33
- <main id="main" class="doc-shell">
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
- <article class="prose">
36
- <p class="eyebrow">Security</p>
37
- <h1>A narrow relay between the model and your machine.</h1>
38
- <p>ReMCP treats remote computer control as privileged access. Authentication, device isolation and explicit tool behavior are part of the core design.</p>
39
- <h2>Identity and tenancy</h2><p>User authentication is handled with Firebase Authentication. MCP sessions and paired device records are scoped to the same authenticated user identity.</p>
40
- <h2>Device credentials</h2><p>Pairing codes are short-lived and one-time. Each paired computer receives an independent random credential. Server storage keeps a one-way hash of that credential.</p>
41
- <h2>Network model</h2><p>The local agent opens an outbound secure WebSocket connection to the relay. No inbound port needs to be opened on the laptop or workstation.</p>
42
- <h2>Tool risk</h2><p>Tool descriptors explicitly declare read-only, destructive and open-world hints. Terminal execution can change local or external state depending on the command supplied.</p>
43
- <h2>Revocation</h2><p>Revoke a device from the signed-in workspace if a computer is lost, retired, or no longer trusted. Revoked credentials cannot reconnect.</p>
44
- <h2>Transport</h2><p>Production traffic uses HTTPS/WSS. OAuth uses PKCE S256. Tokens and device credentials are not placed in public source or page markup.</p>
45
- <div class="notice"><strong>Operator trust.</strong><p>If you use a third-party ReMCP deployment, that deployment operator controls the relay infrastructure. For highest control, run your own deployment.</p></div>
46
- </article>
47
- </main>
48
- <footer class="site-footer">
49
- <div class="wordmark">
50
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
51
- <span translate="no">ReMCP</span>
52
- </div>
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>
54
- <p>Open-source remote MCP infrastructure.</p>
55
- </footer>
56
- </body>
57
- </html>
@@ -1,23 +0,0 @@
1
- {
2
- "name": "ReMCP",
3
- "short_name": "ReMCP",
4
- "description": "Secure remote MCP access to computers you pair.",
5
- "start_url": "/",
6
- "display": "standalone",
7
- "background_color": "#f7f6f2",
8
- "theme_color": "#111114",
9
- "icons": [
10
- {
11
- "src": "/android-chrome-192x192.png",
12
- "sizes": "192x192",
13
- "type": "image/png",
14
- "purpose": "any"
15
- },
16
- {
17
- "src": "/android-chrome-512x512.png",
18
- "sizes": "512x512",
19
- "type": "image/png",
20
- "purpose": "any"
21
- }
22
- ]
23
- }
package/public/style.css DELETED
@@ -1,259 +0,0 @@
1
- :root {
2
- --bg: #f7f7f5;
3
- --surface: #ffffff;
4
- --surface-subtle: #f1f1ee;
5
- --ink: #171719;
6
- --muted: #68686f;
7
- --line: #e1e1dc;
8
- --line-strong: #cfcfc8;
9
- --accent: #4c50d8;
10
- --accent-hover: #3f43c3;
11
- --accent-soft: #f0f0ff;
12
- --danger: #b42318;
13
- --danger-soft: #fff2f0;
14
- --ok: #16875b;
15
- --ok-soft: #edf8f3;
16
- --radius: 12px;
17
- --container: 1180px;
18
- color: var(--ink);
19
- background: var(--bg);
20
- font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
21
- font-synthesis: none;
22
- text-rendering: optimizeLegibility;
23
- }
24
-
25
- * { box-sizing: border-box; }
26
- html { scroll-behavior: smooth; background: var(--bg); }
27
- body { margin: 0; min-width: 320px; background: var(--bg); color: var(--ink); line-height: 1.55; -webkit-font-smoothing: antialiased; }
28
- a { color: inherit; text-decoration: none; }
29
- button, input { font: inherit; }
30
- button, a { touch-action: manipulation; -webkit-tap-highlight-color: transparent; }
31
- button { cursor: pointer; }
32
- button:disabled { cursor: not-allowed; opacity: .58; }
33
- img, svg { display: block; }
34
- .hidden { display: none !important; }
35
-
36
- .skip-link { position: fixed; top: 12px; left: 12px; z-index: 100; transform: translateY(-160%); padding: 10px 14px; border-radius: 8px; background: var(--ink); color: #fff; font-weight: 650; transition: transform 140ms ease; }
37
- .skip-link:focus { transform: translateY(0); }
38
-
39
- .site-header { min-height: 68px; display: flex; align-items: center; justify-content: space-between; gap: 28px; padding: 0 max(20px, calc((100vw - var(--container)) / 2)); border-bottom: 1px solid var(--line); background: rgba(247, 247, 245, .94); }
40
- .wordmark { display: inline-flex; align-items: center; gap: 9px; min-width: 0; font-size: 15px; font-weight: 760; letter-spacing: -.025em; }
41
- .wordmark span[translate="no"] { white-space: nowrap; }
42
- .brand-mark { width: 30px; height: 30px; flex: 0 0 30px; border-radius: 8px; }
43
- .site-header nav, .site-footer nav { display: flex; align-items: center; gap: 22px; }
44
- .site-header nav a, .site-footer nav a { color: var(--muted); font-size: 14px; font-weight: 550; }
45
- .site-header nav a:hover, .site-footer nav a:hover, .site-header nav a[aria-current="page"] { color: var(--ink); }
46
- .site-header nav a[aria-current="page"] { font-weight: 680; }
47
-
48
- main { display: block; }
49
- .hero { max-width: var(--container); min-height: 650px; margin: 0 auto; padding: clamp(72px, 9vw, 112px) 20px; display: grid; grid-template-columns: minmax(0, 1.03fr) minmax(360px, .97fr); align-items: center; gap: clamp(48px, 7vw, 96px); }
50
- .hero-copy { max-width: 650px; }
51
- .eyebrow { margin: 0 0 16px; color: var(--accent); font-size: 12px; font-weight: 760; letter-spacing: .13em; text-transform: uppercase; }
52
- .hero h1, .section-heading h2, .final-cta h2, .prose h1 { text-wrap: balance; }
53
- .hero h1 { margin: 0; max-width: 680px; font-size: clamp(52px, 6.2vw, 82px); line-height: .98; letter-spacing: -.06em; }
54
- .lede { max-width: 610px; margin: 25px 0 0; color: var(--muted); font-size: clamp(18px, 1.8vw, 21px); line-height: 1.58; text-wrap: pretty; }
55
- .hero-actions { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; margin-top: 30px; }
56
-
57
- .button { min-height: 44px; display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 16px; border: 1px solid var(--ink); border-radius: 9px; background: var(--ink); color: #fff; font-weight: 680; line-height: 1.2; transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, transform 140ms ease; }
58
- .button:hover { background: #29292d; border-color: #29292d; }
59
- .button:active { transform: translateY(1px); }
60
- .button.secondary { border-color: var(--line-strong); background: var(--surface); color: var(--ink); }
61
- .button.secondary:hover { border-color: #b8b8b1; background: var(--surface-subtle); }
62
- .button.ghost { border-color: transparent; background: transparent; color: var(--muted); }
63
- .button.ghost:hover { border-color: var(--line); background: var(--surface-subtle); color: var(--ink); }
64
- .text-link { display: inline-flex; align-items: center; gap: 6px; padding: 7px 0; color: var(--ink); font-weight: 650; border-bottom: 1px solid var(--line-strong); }
65
- .text-link:hover { border-color: var(--ink); }
66
-
67
- .google-button { position: relative; width: min(100%, 400px); min-height: 44px; padding: 9px 16px 9px 44px; border: 1px solid #747775; border-radius: 4px; background: #fff; color: #1f1f1f; font-family: Roboto, Arial, sans-serif; font-size: 14px; font-weight: 500; letter-spacing: .1px; box-shadow: none; }
68
- .google-button:hover { border-color: #6f7274; background: #f8fafd; color: #1f1f1f; }
69
- .google-button:active { background: #f1f3f4; transform: none; }
70
- .google-icon { position: absolute; left: 12px; top: 50%; width: 20px; height: 20px; transform: translateY(-50%); }
71
-
72
- .hero-visual { width: 100%; max-width: 520px; margin-left: auto; }
73
- .node { min-height: 62px; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 17px 18px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); }
74
- .node span { font-weight: 690; }
75
- .node b { color: var(--muted); font-size: 12px; font-weight: 600; }
76
- .node.relay { border-color: #aeb0f4; background: #fbfbff; }
77
- .node.device-node { position: relative; padding-right: 94px; }
78
- .node .pulse { position: absolute; right: 16px; padding: 4px 8px; border-radius: 999px; background: var(--ok-soft); color: var(--ok); font-size: 11px; font-style: normal; font-weight: 650; }
79
- .rail { position: relative; height: 58px; display: grid; place-items: center; }
80
- .rail span { position: absolute; inset: 0 auto; width: 1px; background: var(--line-strong); }
81
- .rail i { position: relative; padding: 3px 8px; background: var(--bg); color: var(--muted); font-size: 11px; font-style: normal; }
82
-
83
- .principles { max-width: var(--container); margin: 0 auto; padding: 0 20px 72px; display: grid; grid-template-columns: repeat(3, 1fr); border-top: 1px solid var(--line); }
84
- .principles > div { min-height: 210px; padding: 36px 34px 0 0; }
85
- .principles > div + div { padding-left: 34px; border-left: 1px solid var(--line); }
86
- .principles span { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; }
87
- .principles h2 { margin: 28px 0 9px; font-size: 21px; line-height: 1.2; letter-spacing: -.025em; }
88
- .principles p { max-width: 330px; margin: 0; color: var(--muted); font-size: 15px; }
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
-
103
- .workspace { padding: clamp(72px, 9vw, 112px) 20px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); background: var(--surface); }
104
- .workspace > * { max-width: var(--container); margin-left: auto; margin-right: auto; }
105
- .section-heading { max-width: 720px; margin-bottom: 45px; }
106
- .section-heading h2, .final-cta h2 { margin: 0; font-size: clamp(38px, 5vw, 58px); line-height: 1.02; letter-spacing: -.05em; }
107
- .section-heading > p:last-child, .final-cta > p { max-width: 620px; margin: 16px 0 0; color: var(--muted); font-size: 18px; }
108
- .workspace-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
109
- .auth-pane, .endpoint-pane { min-width: 0; padding: 34px 0 38px; }
110
- .auth-pane { padding-right: 48px; border-right: 1px solid var(--line); }
111
- .endpoint-pane { padding-left: 48px; }
112
- .auth-pane h3, .endpoint-pane h3, .pair-panel h3, .devices-panel h3, .oauth-card h2 { margin: 0 0 9px; font-size: 20px; line-height: 1.25; letter-spacing: -.025em; }
113
- .stack { display: flex; flex-direction: column; gap: 10px; }
114
- .muted { color: var(--muted); }
115
- label { display: block; margin: 10px 0 6px; color: #343438; font-size: 13px; font-weight: 650; }
116
- .stack label { margin: 3px 0 -4px; }
117
- input { width: 100%; min-height: 44px; padding: 10px 12px; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--surface); color: var(--ink); transition: border-color 140ms ease, box-shadow 140ms ease; }
118
- input:hover { border-color: #b9b9b2; }
119
- input:focus-visible { border-color: var(--accent); }
120
- .button-row { display: flex; gap: 9px; margin-top: 5px; }
121
- .divider { display: flex; align-items: center; gap: 11px; margin: 7px 0; color: var(--muted); font-size: 12px; }
122
- .divider::before, .divider::after { content: ""; flex: 1; height: 1px; background: var(--line); }
123
- .error { margin: 2px 0 0; color: var(--danger); font-size: 13px; }
124
- p:empty, .error:empty, #status:empty { display: none; }
125
- .identity { display: flex; align-items: center; gap: 11px; }
126
- .identity small { display: block; color: var(--muted); }
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); }
128
-
129
- .command-row, .pairing-output { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 9px; align-items: start; margin-top: 20px; }
130
- .command-row code, .pairing-output code, .code-block { overflow: auto; padding: 12px 13px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-subtle); font: 12.5px/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; word-break: break-all; }
131
- .copy-button { min-height: 42px; padding: 9px 12px; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--surface); color: var(--ink); font-weight: 650; }
132
- .copy-button:hover { background: var(--surface-subtle); }
133
- .endpoint-facts { margin: 28px 0 0; border-top: 1px solid var(--line); }
134
- .endpoint-facts div { display: flex; justify-content: space-between; gap: 20px; padding: 12px 0; border-bottom: 1px solid var(--line); }
135
- .endpoint-facts dt { color: var(--muted); }
136
- .endpoint-facts dd { margin: 0; text-align: right; font-weight: 650; }
137
- .device-workspace { margin-top: 52px; }
138
- .pair-panel { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 20px; align-items: center; padding-bottom: 34px; border-bottom: 1px solid var(--line); }
139
- .pairing-output { grid-column: 1 / -1; }
140
- .pairing-output p { grid-column: 1 / -1; margin: 0; }
141
- .devices-panel { padding-top: 34px; }
142
- .panel-title { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; }
143
- .device-list { margin-top: 14px; border-top: 1px solid var(--line); }
144
- .device { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 18px; padding: 17px 0; border-bottom: 1px solid var(--line); }
145
- .device strong { font-size: 15px; }
146
- .device .muted { overflow-wrap: anywhere; font-size: 13px; }
147
- .online, .offline { display: inline-flex; align-items: center; gap: 6px; margin-top: 4px; font-size: 12px; }
148
- .online { color: var(--ok); }
149
- .offline { color: var(--muted); }
150
- .danger { min-height: 38px; padding: 8px 11px; border: 1px solid #e7c3be; border-radius: 8px; background: transparent; color: var(--danger); font-weight: 650; }
151
- .danger:hover { background: var(--danger-soft); }
152
-
153
- .final-cta { max-width: var(--container); margin: 0 auto; padding: clamp(72px, 9vw, 112px) 20px; }
154
- .final-cta .text-link { margin-top: 24px; }
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; }
156
- .site-footer p { margin: 0; color: var(--muted); text-align: right; }
157
-
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); }
159
- .doc-nav { position: sticky; top: 28px; align-self: start; display: flex; flex-direction: column; gap: 4px; }
160
- .doc-nav a { padding: 8px 10px; border-radius: 7px; color: var(--muted); font-size: 14px; font-weight: 550; }
161
- .doc-nav a:hover { background: var(--surface-subtle); color: var(--ink); }
162
- .doc-nav a[aria-current="page"] { background: var(--surface-subtle); color: var(--ink); font-weight: 680; }
163
- .prose { min-width: 0; }
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; }
169
- .prose a { color: #3538ae; text-decoration: underline; text-decoration-color: #a5a7e9; text-underline-offset: 3px; }
170
- .prose a:hover { text-decoration-color: #3538ae; }
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; }
175
- .prose code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .9em; }
176
- .prose :not(pre) > code { padding: 2px 5px; border-radius: 5px; background: var(--surface-subtle); color: #34343a; }
177
- .prose hr { margin: 46px 0; border: 0; border-top: 1px solid var(--line); }
178
- .prose .notice { margin: 20px 0; padding: 13px 15px; border: 1px solid #d8d8f7; border-radius: 9px; background: var(--accent-soft); }
179
- .prose .notice p { margin: 5px 0 0; }
180
-
181
- .oauth-shell { min-height: calc(100svh - 68px); display: grid; place-items: center; padding: 56px 20px 80px; }
182
- .oauth-card { width: min(100%, 520px); padding: 30px; border: 1px solid var(--line); border-radius: 14px; background: var(--surface); }
183
- .oauth-card .eyebrow { margin-bottom: 11px; }
184
- .oauth-card > p:first-child { margin-top: 0; }
185
- .oauth-card .google-button { width: 100%; }
186
- .scope-list { margin: 24px 0; padding: 0; list-style: none; border-top: 1px solid var(--line); }
187
- .scope-list li { display: flex; justify-content: space-between; gap: 20px; padding: 13px 0; border-bottom: 1px solid var(--line); }
188
- .scope-list strong { color: var(--muted); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; font-weight: 600; }
189
- .oauth-actions { display: flex; gap: 9px; margin-top: 18px; }
190
- .oauth-meta { overflow-wrap: anywhere; color: var(--muted); font-size: 12px; }
191
- .footer-mini { margin: 26px 0 0; color: var(--muted); font-size: 12px; }
192
- .footer-mini a { text-decoration: underline; text-underline-offset: 3px; }
193
-
194
- input:focus-visible, button:focus-visible, a:focus-visible { outline: 3px solid rgba(76, 80, 216, .28); outline-offset: 2px; }
195
-
196
- @media (max-width: 900px) {
197
- .hero { min-height: auto; grid-template-columns: 1fr; padding-top: 76px; padding-bottom: 76px; }
198
- .hero-copy { max-width: 700px; }
199
- .hero-visual { max-width: 680px; margin: 4px 0 0; }
200
- .principles { grid-template-columns: 1fr; padding-bottom: 58px; }
201
- .principles > div, .principles > div + div { min-height: auto; padding: 28px 0; border-left: 0; border-bottom: 1px solid var(--line); }
202
- .principles > div:last-child { border-bottom: 0; }
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; }
207
- .auth-pane { padding-right: 0; border-right: 0; border-bottom: 1px solid var(--line); }
208
- .endpoint-pane { padding-left: 0; }
209
- .doc-shell { grid-template-columns: 1fr; gap: 0; padding-top: 34px; }
210
- .doc-nav { display: none; }
211
- .site-footer { grid-template-columns: 1fr; }
212
- .site-footer nav { flex-wrap: wrap; }
213
- .site-footer p { text-align: left; }
214
- }
215
-
216
- @media (max-width: 620px) {
217
- .site-header { min-height: 62px; padding: 0 16px; }
218
- .site-header { gap: 12px; }
219
- .site-header nav { max-width: calc(100vw - 116px); gap: 12px; }
220
- .site-header nav a { font-size: 12.5px; }
221
- .hero { padding: 58px 18px 64px; }
222
- .hero h1 { font-size: clamp(46px, 14vw, 60px); }
223
- .hero-actions { align-items: stretch; flex-direction: column; gap: 10px; }
224
- .hero-actions .button, .hero-actions .text-link { width: 100%; justify-content: center; }
225
- .node { align-items: flex-start; flex-direction: column; gap: 3px; }
226
- .node.device-node { padding-right: 18px; }
227
- .node .pulse { top: 15px; }
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; }
232
- .button-row, .oauth-actions { flex-direction: column; }
233
- .button-row .button, .oauth-actions .button { width: 100%; }
234
- .pair-panel { grid-template-columns: 1fr; }
235
- .pair-panel .button { justify-self: start; }
236
- .panel-title { align-items: flex-start; flex-direction: column; }
237
- .command-row, .pairing-output { grid-template-columns: minmax(0, 1fr) auto; }
238
- .copy-button { justify-self: stretch; }
239
- .endpoint-facts div { align-items: flex-start; flex-direction: column; gap: 2px; }
240
- .endpoint-facts dd { text-align: left; }
241
- .site-footer { padding: 24px 18px; }
242
- .site-footer nav { gap: 14px; }
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; }
251
- .oauth-shell { min-height: calc(100svh - 62px); padding: 28px 14px 60px; place-items: start center; }
252
- .oauth-card { padding: 22px 18px; }
253
- .scope-list li { align-items: flex-start; flex-direction: column; gap: 4px; }
254
- }
255
-
256
- @media (prefers-reduced-motion: reduce) {
257
- html { scroll-behavior: auto; }
258
- *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
259
- }
@@ -1,59 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <meta name="color-scheme" content="light">
7
- <meta name="theme-color" content="#f7f7f5">
8
- <title>Support · ReMCP</title>
9
- <meta name="description" content="Troubleshoot ReMCP sign-in, device pairing, agent connectivity and MCP authorization.">
10
- <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=remcp-012">
12
- <meta property="og:site_name" content="ReMCP">
13
- <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
- <link rel="icon" href="/favicon.ico" sizes="any">
15
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" media="(prefers-color-scheme: light)">
16
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" media="(prefers-color-scheme: light)">
17
- <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" media="(prefers-color-scheme: light)">
18
- <link rel="icon" type="image/png" sizes="16x16" href="/remcp-darkmode-16x16.png" media="(prefers-color-scheme: dark)">
19
- <link rel="icon" type="image/png" sizes="32x32" href="/remcp-darkmode-32x32.png" media="(prefers-color-scheme: dark)">
20
- <link rel="icon" type="image/png" sizes="48x48" href="/remcp-darkmode-48x48.png" media="(prefers-color-scheme: dark)">
21
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
22
- <link rel="manifest" href="/site.webmanifest">
23
- </head>
24
- <body>
25
- <a class="skip-link" href="#main">Skip to content</a>
26
- <header class="site-header">
27
- <a class="wordmark" href="/" aria-label="ReMCP home">
28
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
- <span translate="no">ReMCP</span>
30
- </a>
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
- </header>
33
- <main id="main" class="doc-shell">
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
- <article class="prose">
36
- <p class="eyebrow">Support</p>
37
- <h1>Troubleshoot ReMCP.</h1>
38
- <p>Most connection failures fall into one of three layers: account authentication, device pairing, or the local device agent.</p>
39
- <h2>Device shows offline</h2><p>Verify the ReMCP agent service is running and outbound HTTPS/WSS access to <code>remcp.delio24.com</code> is allowed. Re-pair the device if its credential was revoked.</p>
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
- <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
- <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>
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>
47
- </article>
48
- </main>
49
- <footer class="site-footer">
50
- <div class="wordmark">
51
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
52
- <span translate="no">ReMCP</span>
53
- </div>
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>
55
- <p>Open-source remote MCP infrastructure.</p>
56
- </footer>
57
- <script type="module" src="/copy.js?v=remcp-012"></script>
58
- </body>
59
- </html>
package/public/terms.html DELETED
@@ -1,60 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <meta name="color-scheme" content="light">
7
- <meta name="theme-color" content="#f7f7f5">
8
- <title>Terms of Service · ReMCP</title>
9
- <meta name="description" content="Terms for using the hosted ReMCP service and its remote-computer capabilities.">
10
- <link rel="preconnect" href="https://www.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/style.css?v=remcp-012">
12
- <meta property="og:site_name" content="ReMCP">
13
- <meta property="og:image" content="https://remcp.delio24.com/assets/og-remcp.png">
14
- <link rel="icon" href="/favicon.ico" sizes="any">
15
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" media="(prefers-color-scheme: light)">
16
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" media="(prefers-color-scheme: light)">
17
- <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" media="(prefers-color-scheme: light)">
18
- <link rel="icon" type="image/png" sizes="16x16" href="/remcp-darkmode-16x16.png" media="(prefers-color-scheme: dark)">
19
- <link rel="icon" type="image/png" sizes="32x32" href="/remcp-darkmode-32x32.png" media="(prefers-color-scheme: dark)">
20
- <link rel="icon" type="image/png" sizes="48x48" href="/remcp-darkmode-48x48.png" media="(prefers-color-scheme: dark)">
21
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
22
- <link rel="manifest" href="/site.webmanifest">
23
- </head>
24
- <body>
25
- <a class="skip-link" href="#main">Skip to content</a>
26
- <header class="site-header">
27
- <a class="wordmark" href="/" aria-label="ReMCP home">
28
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
29
- <span translate="no">ReMCP</span>
30
- </a>
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
- </header>
33
- <main id="main" class="doc-shell">
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
- <article class="prose">
36
- <p class="eyebrow">Legal</p>
37
- <h1>Terms of Service</h1>
38
- <p><strong>Effective September 16, 2026.</strong> These Terms apply to the hosted ReMCP service at remcp.delio24.com. The open-source software may also be self-hosted under its applicable software license.</p>
39
- <h2>Your account and devices</h2><p>You may connect only computers and accounts that you own or are authorized to administer. You are responsible for protecting your sign-in account, reviewing paired devices, and revoking devices or OAuth grants you no longer trust.</p>
40
- <h2>Remote actions</h2><p>ReMCP can expose powerful local operations, including reading and modifying files and starting or terminating processes. Some actions can be destructive or can affect external systems when a command run on your computer reaches them. You are responsible for reviewing and authorizing requested actions and for maintaining appropriate backups and operating-system permissions.</p>
41
- <h2>Acceptable use</h2><p>You may not use ReMCP to access systems without authorization, distribute malware, evade security controls, interfere with other users, conduct credential theft, or violate applicable law or third-party rights. You may not attempt to access devices belonging to another ReMCP account.</p>
42
- <h2>Service operation</h2><p>The hosted service may be updated, rate-limited, suspended or discontinued to protect users, respond to abuse, maintain security or operate the service. ReMCP does not guarantee uninterrupted availability. Self-hosted deployments are operated and secured by their administrators.</p>
43
- <h2>Third-party services and software</h2><p>Authentication may rely on Firebase/Google, and device functionality may rely on open-source dependencies. Those services and packages are subject to their own terms and licenses. ReMCP does not grant rights to third-party systems that you access from a paired device.</p>
44
- <h2>Open-source software</h2><p>The ReMCP source distribution includes software under open-source licenses. License notices in the source distribution govern those components independently of these hosted-service Terms.</p>
45
- <h2>No warranty</h2><p>To the maximum extent permitted by applicable law, the service and software are provided on an “as is” and “as available” basis without warranties of uninterrupted operation, fitness for a particular purpose, or freedom from all defects. Nothing in these Terms limits rights that cannot legally be excluded.</p>
46
- <h2>Responsibility for losses</h2><p>You are responsible for commands and changes made through devices you authorize. To the maximum extent permitted by applicable law, ReMCP is not responsible for indirect, incidental or consequential losses arising from device changes, lost data, third-party systems or service interruptions. Mandatory consumer or statutory rights remain unaffected.</p>
47
- <h2>Termination</h2><p>You may stop using the service and revoke your devices at any time. Access may be suspended for security, abuse or legal reasons. Provisions that by their nature should survive termination, including responsibility for prior actions and license obligations, continue to apply.</p>
48
- <h2>Changes</h2><p>Material changes to these Terms will be published at this URL with a new effective date. Continued use after changes become effective constitutes acceptance where permitted by law.</p>
49
- </article>
50
- </main>
51
- <footer class="site-footer">
52
- <div class="wordmark">
53
- <img class="brand-mark" src="/android-chrome-192x192.png" width="30" height="30" alt="" aria-hidden="true">
54
- <span translate="no">ReMCP</span>
55
- </div>
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>
57
- <p>Open-source remote MCP infrastructure.</p>
58
- </footer>
59
- </body>
60
- </html>
@@ -1,36 +0,0 @@
1
- ---
2
- name: remcp-operator
3
- description: Safely operate computers paired through ReMCP. Use when the user asks to inspect or change files, directories, local processes, terminal sessions, or ReMCP device state on one of their paired computers.
4
- ---
5
-
6
- # ReMCP Operator
7
-
8
- Use ReMCP only when the request actually needs a paired computer. Do not invoke ReMCP for general knowledge, writing, weather, web research, or conceptual questions that can be answered without the user's device.
9
-
10
- ## Device selection
11
-
12
- 1. Call `list_devices` before the first device operation unless a current ReMCP device id is already unambiguous in the conversation.
13
- 2. Prefer an online device whose user-facing name or hostname matches the request.
14
- 3. If more than one online device plausibly matches and choosing the wrong machine could change state, ask the user which device to use.
15
-
16
- ## Read before write
17
-
18
- Inspect the smallest amount of device state needed to understand the request before changing it. Prefer `list_directory`, `get_file_info`, `read_file`, `list_processes`, or existing process output before a write or terminal mutation.
19
- ## Changes
20
-
21
- - Use the narrowest tool that performs the requested change. Prefer `edit_block`, `write_file`, or `move_file` over a shell command when the dedicated tool expresses the action clearly.
22
- - Do not broaden a requested path, command, or target without a reason tied to the user's task.
23
- - Treat `set_config_value`, file replacement, process termination, and generic terminal commands as state-changing actions.
24
- - Generic terminal commands may also affect external services. Keep commands scoped to the user's stated goal and surface consequential effects before execution when they are not already clear from the request.
25
-
26
- ## Verification
27
-
28
- After a change, use the cheapest relevant read to verify the result. Examples: re-read the edited range, list the destination directory after a move, or read process output after starting a command.
29
-
30
- ## Long-running processes
31
-
32
- Use `start_process` once and then `read_process_output` or `interact_with_process` for the existing session. Avoid starting duplicate long-running processes just to obtain new output.
33
-
34
- ## Out-of-scope requests
35
-
36
- Do not use ReMCP to access a computer the user has not paired or is not authorized to control. Do not ask for or process passwords, MFA codes, private keys, API keys, payment-card data, protected health information, government identifiers, or other restricted credentials/data through ReMCP tools. If a requested file or command would expose those categories, ask the user to use a safer local workflow instead.