granttap-mcp 0.8.7 → 0.8.8
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
|
@@ -217,6 +217,19 @@ codex plugin add granttap@granttap
|
|
|
217
217
|
# Claude Code
|
|
218
218
|
claude plugin marketplace add sergii-ziborov/granttap-mcp
|
|
219
219
|
claude plugin install granttap@granttap
|
|
220
|
+
|
|
221
|
+
# Grok Build
|
|
222
|
+
grok plugin marketplace add sergii-ziborov/granttap-mcp
|
|
223
|
+
grok plugin install granttap --trust
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Install **GrantTap** from the Cursor plugin marketplace, then open
|
|
227
|
+
**Cursor Settings → MCP → GrantTap → Authorize**. From a source checkout the
|
|
228
|
+
same plugin can be linked locally:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
mkdir -p "$HOME/.cursor/plugins/local"
|
|
232
|
+
ln -sfn "$PWD/cursor-plugin" "$HOME/.cursor/plugins/local/granttap"
|
|
220
233
|
```
|
|
221
234
|
|
|
222
235
|
Open GrantTap from the plugin page or ask `Show my GrantTap pairing QR.` Codex
|
|
@@ -4,6 +4,9 @@ import { generateKeyPair, randomId } from "../../../../packages/core/crypto";
|
|
|
4
4
|
import type { PeerConfig } from "../../../../packages/core/relay-client";
|
|
5
5
|
import { configDir } from "./paths";
|
|
6
6
|
|
|
7
|
+
export const DEFAULT_RELAY_URL = "wss://relay.granttap.com";
|
|
8
|
+
export const LEGACY_RELAY_URL = "wss://granttap-relay.sergii-ziborov.workers.dev";
|
|
9
|
+
|
|
7
10
|
export function saveConfig(path: string, cfg: PeerConfig): void {
|
|
8
11
|
mkdirSync(configDir(), { recursive: true });
|
|
9
12
|
if (existsSync(path)) {
|
|
@@ -25,7 +28,12 @@ export function saveConfig(path: string, cfg: PeerConfig): void {
|
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
export function loadConfig(path: string): PeerConfig {
|
|
28
|
-
|
|
31
|
+
const cfg = JSON.parse(readFileSync(path, "utf8")) as PeerConfig;
|
|
32
|
+
if (cfg.relayUrl === LEGACY_RELAY_URL) {
|
|
33
|
+
cfg.relayUrl = DEFAULT_RELAY_URL;
|
|
34
|
+
saveConfig(path, cfg);
|
|
35
|
+
}
|
|
36
|
+
return cfg;
|
|
29
37
|
}
|
|
30
38
|
|
|
31
39
|
const b64url = (value: string): string =>
|
|
@@ -54,7 +62,8 @@ export function normalizeRelayUrl(value: string): string {
|
|
|
54
62
|
if (url.username || url.password || url.hash || url.search) {
|
|
55
63
|
throw new Error("relay URL must not contain credentials, a query, or a fragment");
|
|
56
64
|
}
|
|
57
|
-
|
|
65
|
+
const normalized = url.toString().replace(/\/$/, "");
|
|
66
|
+
return normalized === LEGACY_RELAY_URL ? DEFAULT_RELAY_URL : normalized;
|
|
58
67
|
}
|
|
59
68
|
|
|
60
69
|
function validPairingKey(value: string): boolean {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "./install";
|
|
9
9
|
import {
|
|
10
10
|
createPairing,
|
|
11
|
+
DEFAULT_RELAY_URL,
|
|
11
12
|
loadConfig,
|
|
12
13
|
machineConfigPath,
|
|
13
14
|
normalizeRelayUrl,
|
|
@@ -16,7 +17,7 @@ import {
|
|
|
16
17
|
} from "./config";
|
|
17
18
|
import type { PeerConfig } from "../../../packages/core/relay-client";
|
|
18
19
|
|
|
19
|
-
export const DEFAULT_RELAY =
|
|
20
|
+
export const DEFAULT_RELAY = DEFAULT_RELAY_URL;
|
|
20
21
|
export const PAIRING_CODE_TTL_MINUTES = 15;
|
|
21
22
|
|
|
22
23
|
function validConfig(config: PeerConfig, role: PeerConfig["role"]): boolean {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "granttap",
|
|
3
3
|
"owner": {
|
|
4
|
-
"name": "GrantTap"
|
|
4
|
+
"name": "GrantTap",
|
|
5
|
+
"email": "support@granttap.com"
|
|
5
6
|
},
|
|
6
7
|
"metadata": {
|
|
7
|
-
"description": "GrantTap for Cursor — local HTTP MCP authorization and exactly correlated phone approvals"
|
|
8
|
+
"description": "GrantTap for Cursor — local HTTP MCP authorization and exactly correlated phone approvals",
|
|
9
|
+
"version": "0.1.1"
|
|
8
10
|
},
|
|
9
11
|
"plugins": [
|
|
10
12
|
{
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "granttap",
|
|
3
3
|
"displayName": "GrantTap",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"description": "GrantTap for Cursor: loopback HTTP MCP authorization, phone pairing, and exactly correlated dual-channel approvals. Start with granttap authorize.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "GrantTap",
|
|
8
|
+
"email": "support@granttap.com",
|
|
8
9
|
"url": "https://granttap.com"
|
|
9
10
|
},
|
|
10
11
|
"publisher": "GrantTap",
|
package/cursor-plugin/README.md
CHANGED
|
@@ -36,19 +36,21 @@ The OAuth service listens only at `http://127.0.0.1:17342/mcp`. Cursor cannot
|
|
|
36
36
|
show **Authorize** for a stdio (`command`/`args`) MCP entry, so do not replace the
|
|
37
37
|
plugin's HTTP configuration with stdio.
|
|
38
38
|
|
|
39
|
-
## Install
|
|
39
|
+
## Install from the Cursor marketplace
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
a
|
|
41
|
+
Install **GrantTap** from Cursor's plugin marketplace, then reload Cursor.
|
|
42
|
+
The plugin adds the `/connect` command, a connect skill, and the
|
|
43
|
+
exact-correlation rule; `granttap setup` still configures the MCP endpoint
|
|
44
|
+
itself.
|
|
45
|
+
|
|
46
|
+
From a source checkout, the same plugin can be linked locally:
|
|
43
47
|
|
|
44
48
|
```bash
|
|
45
49
|
mkdir -p "$HOME/.cursor/plugins/local"
|
|
46
50
|
ln -sfn "$PWD/cursor-plugin" "$HOME/.cursor/plugins/local/granttap"
|
|
47
51
|
```
|
|
48
52
|
|
|
49
|
-
Run those commands from the repository root.
|
|
50
|
-
command, a connect skill, and the exact-correlation rule; `granttap setup`
|
|
51
|
-
still configures the MCP endpoint itself.
|
|
53
|
+
Run those commands from the repository root.
|
|
52
54
|
|
|
53
55
|
## Exact dual-channel behavior
|
|
54
56
|
|
|
@@ -62,7 +64,8 @@ prompt must never resolve the current request.
|
|
|
62
64
|
| Path | Purpose |
|
|
63
65
|
| --- | --- |
|
|
64
66
|
| `.cursor-plugin/plugin.json` | Cursor plugin manifest |
|
|
65
|
-
| `.cursor-plugin/marketplace.json` |
|
|
67
|
+
| `.cursor-plugin/marketplace.json` | Plugin-local marketplace metadata |
|
|
68
|
+
| `../.cursor-plugin/marketplace.json` | Repository marketplace index Cursor publishes |
|
|
66
69
|
| `mcp.json` | Loopback Streamable HTTP MCP endpoint |
|
|
67
70
|
| `assets/logo.svg` | Plugin logo |
|
|
68
71
|
| `rules/dual-channel.mdc` | Exact prompt/correlation rule |
|