@rvry/mcp 0.4.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -22
- package/dist/client.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +100 -2
- package/dist/setup.js +0 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @rvry/mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Reasoning Depth Enforcement for LLMs.**
|
|
4
4
|
|
|
5
|
-
RVRY is
|
|
5
|
+
RVRY is an MCP server that improves AI reliability by forcing your model to finish thinking before it answers. When your AI raises a question, RVRY remembers it. When it makes an assumption, RVRY flags it. When it tries to wrap up while those are still unaddressed, RVRY doesn't let it.
|
|
6
6
|
|
|
7
7
|
## Quick Start
|
|
8
8
|
|
|
@@ -12,24 +12,24 @@ npx @rvry/mcp setup
|
|
|
12
12
|
|
|
13
13
|
The wizard will:
|
|
14
14
|
1. Open your browser to sign in (or prompt for a token)
|
|
15
|
-
2. Auto-detect
|
|
16
|
-
3. Configure
|
|
17
|
-
4. Install slash commands (`/deepthink`, `/problem-solve`)
|
|
15
|
+
2. Auto-detect supported clients on your machine
|
|
16
|
+
3. Configure them automatically
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
Supported clients: **Claude Code**, **Claude Desktop**, **Cursor**, **Gemini CLI**, **Codex**, **Anti-Gravity**
|
|
19
|
+
|
|
20
|
+
Restart any running clients after setup, and RVRY is ready.
|
|
20
21
|
|
|
21
22
|
### Options
|
|
22
23
|
|
|
23
24
|
```bash
|
|
24
|
-
npx @rvry/mcp setup --token rvry_abc123
|
|
25
|
-
npx @rvry/mcp setup --client code
|
|
26
|
-
npx @rvry/mcp setup --client desktop
|
|
25
|
+
npx @rvry/mcp setup --token rvry_abc123 # Skip browser auth, use token directly
|
|
26
|
+
npx @rvry/mcp setup --client code # Only configure Claude Code
|
|
27
|
+
npx @rvry/mcp setup --client desktop # Only configure Claude Desktop
|
|
28
|
+
npx @rvry/mcp setup --accept-terms # Accept ToS non-interactively
|
|
27
29
|
```
|
|
28
30
|
|
|
29
31
|
### Manual Installation
|
|
30
32
|
|
|
31
|
-
If you prefer to configure manually:
|
|
32
|
-
|
|
33
33
|
**Claude Code:**
|
|
34
34
|
```bash
|
|
35
35
|
claude mcp add -e RVRY_TOKEN=rvry_your_token -s user rvry -- npx @rvry/mcp
|
|
@@ -55,19 +55,31 @@ Config file locations:
|
|
|
55
55
|
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
56
56
|
- Linux: `~/.config/Claude/claude_desktop_config.json`
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
**Other MCP clients:**
|
|
59
|
+
|
|
60
|
+
Any client that supports MCP can use RVRY. Point it at `npx @rvry/mcp` with the environment variable `RVRY_TOKEN` set to your token.
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* **`
|
|
63
|
-
* **`
|
|
64
|
-
* **`RVRY_meta`**: Reflective examination of defaults, shifts, and reasoning posture.
|
|
62
|
+
## Tools
|
|
63
|
+
|
|
64
|
+
* **`RVRY_deepthink`** — Extended analysis that catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found.
|
|
65
|
+
* **`RVRY_problem_solve`** — Structured decision-making that forces your AI through orientation, anticipation, and evaluation before it commits to a recommendation.
|
|
65
66
|
|
|
66
67
|
## How it Works
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
Same model. Same question. Different answer.
|
|
70
|
+
|
|
71
|
+
Your AI already has the reasoning capacity. RVRY forces it to use that capacity by holding it accountable — when it raises a question, that question has to get answered. When it makes an assumption, that assumption has to get tested. It keeps working not because it was told to think harder, but because it hasn't finished what it started.
|
|
72
|
+
|
|
73
|
+
On hard questions, a smaller model with RVRY outperforms a bigger model without it. The bottleneck was never how smart the AI is. It was whether the AI finished thinking.
|
|
74
|
+
|
|
75
|
+
[Learn more →](https://rvry.ai/how-it-works)
|
|
76
|
+
|
|
77
|
+
## Pricing
|
|
78
|
+
|
|
79
|
+
| Plan | Runs | Price |
|
|
80
|
+
|------|------|-------|
|
|
81
|
+
| Free | 5/month | $0 |
|
|
82
|
+
| Pro | 25/month | $20/mo |
|
|
83
|
+
| Max | Unlimited | $100/mo |
|
|
72
84
|
|
|
73
|
-
|
|
85
|
+
Sign up at [rvry.ai](https://rvry.ai).
|
package/dist/client.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* RVRY MCP Client -- HTTP client for the RVRY engine /api/v1/think endpoint.
|
|
3
3
|
*/
|
|
4
4
|
/** Valid tool names for the RVRY engine */
|
|
5
|
-
export type RvryTool = 'deepthink' | 'problem_solve';
|
|
5
|
+
export type RvryTool = 'deepthink' | 'problem_solve' | 'think' | 'challenge' | 'meta';
|
|
6
6
|
export interface ScopingQuestion {
|
|
7
7
|
question: string;
|
|
8
8
|
options: Array<{
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Thin client that proxies tool calls to the RVRY engine HTTP API.
|
|
6
6
|
* Auth via RVRY_TOKEN env var (static rvry_ token).
|
|
7
7
|
*
|
|
8
|
-
* Exposes
|
|
8
|
+
* Exposes 5 tools (RVRY_deepthink, RVRY_problem_solve, RVRY_think, RVRY_challenge, RVRY_meta) + backward-compat aliases + 5 MCP Prompts.
|
|
9
9
|
*
|
|
10
10
|
* Also supports `npx @rvry/mcp setup` to install Claude Code commands.
|
|
11
11
|
*/
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Thin client that proxies tool calls to the RVRY engine HTTP API.
|
|
6
6
|
* Auth via RVRY_TOKEN env var (static rvry_ token).
|
|
7
7
|
*
|
|
8
|
-
* Exposes
|
|
8
|
+
* Exposes 5 tools (RVRY_deepthink, RVRY_problem_solve, RVRY_think, RVRY_challenge, RVRY_meta) + backward-compat aliases + 5 MCP Prompts.
|
|
9
9
|
*
|
|
10
10
|
* Also supports `npx @rvry/mcp setup` to install Claude Code commands.
|
|
11
11
|
*/
|
|
@@ -26,9 +26,15 @@ const TOOL_MAP = {
|
|
|
26
26
|
// Primary (rvry_ prefixed)
|
|
27
27
|
RVRY_deepthink: 'deepthink',
|
|
28
28
|
RVRY_problem_solve: 'problem_solve',
|
|
29
|
+
RVRY_think: 'think',
|
|
30
|
+
RVRY_challenge: 'challenge',
|
|
31
|
+
RVRY_meta: 'meta',
|
|
29
32
|
// Backward-compat aliases (unprefixed)
|
|
30
33
|
deepthink: 'deepthink',
|
|
31
34
|
problem_solve: 'problem_solve',
|
|
35
|
+
think: 'think',
|
|
36
|
+
challenge: 'challenge',
|
|
37
|
+
meta: 'meta',
|
|
32
38
|
};
|
|
33
39
|
const TOOL_DEFS = [
|
|
34
40
|
{
|
|
@@ -80,6 +86,80 @@ const TOOL_DEFS = [
|
|
|
80
86
|
required: ['input'],
|
|
81
87
|
},
|
|
82
88
|
},
|
|
89
|
+
{
|
|
90
|
+
name: 'RVRY_think',
|
|
91
|
+
description: 'Structured analysis for questions that need more depth than a quick answer. ' +
|
|
92
|
+
'Runs 2-4 rounds with constraint tracking. ' +
|
|
93
|
+
'Use for questions where you need to examine assumptions and consider alternatives. ' +
|
|
94
|
+
'Call with your question to start, then send your analysis with the returned sessionId to continue.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: {
|
|
98
|
+
input: {
|
|
99
|
+
type: 'string',
|
|
100
|
+
description: 'The question to analyze (new session) or your analysis findings (continuation).',
|
|
101
|
+
},
|
|
102
|
+
sessionId: {
|
|
103
|
+
type: 'string',
|
|
104
|
+
description: 'Session ID for continuing an existing session. Omit to start a new session.',
|
|
105
|
+
},
|
|
106
|
+
skipScoping: {
|
|
107
|
+
type: 'boolean',
|
|
108
|
+
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
required: ['input'],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'RVRY_challenge',
|
|
116
|
+
description: 'Adversarial analysis that stress-tests a proposal or idea. ' +
|
|
117
|
+
'Identifies weaknesses, tests assumptions, and surfaces failure modes. ' +
|
|
118
|
+
'Runs 4-6 rounds with strict gates. ' +
|
|
119
|
+
'Use when you need to find what\'s wrong with an idea before committing. ' +
|
|
120
|
+
'Call with your proposal to start, then send your analysis with the returned sessionId to continue.',
|
|
121
|
+
inputSchema: {
|
|
122
|
+
type: 'object',
|
|
123
|
+
properties: {
|
|
124
|
+
input: {
|
|
125
|
+
type: 'string',
|
|
126
|
+
description: 'The proposal to challenge (new session) or your analysis findings (continuation).',
|
|
127
|
+
},
|
|
128
|
+
sessionId: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'Session ID for continuing an existing session. Omit to start a new session.',
|
|
131
|
+
},
|
|
132
|
+
skipScoping: {
|
|
133
|
+
type: 'boolean',
|
|
134
|
+
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
required: ['input'],
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'RVRY_meta',
|
|
142
|
+
description: 'Sustained metacognitive observation. ' +
|
|
143
|
+
'Examines reasoning defaults, surfaces trained reflexes, and tracks what shifts under observation. ' +
|
|
144
|
+
'Runs 3 rounds: observe, deepen, synthesize. ' +
|
|
145
|
+
'Use when you want to examine how you\'re thinking, not just what you\'re thinking. ' +
|
|
146
|
+
'Max tier only. ' +
|
|
147
|
+
'Call with your topic to start, then send your reflection with the returned sessionId to continue.',
|
|
148
|
+
inputSchema: {
|
|
149
|
+
type: 'object',
|
|
150
|
+
properties: {
|
|
151
|
+
input: {
|
|
152
|
+
type: 'string',
|
|
153
|
+
description: 'The topic to reflect on (new session) or your reflection (continuation).',
|
|
154
|
+
},
|
|
155
|
+
sessionId: {
|
|
156
|
+
type: 'string',
|
|
157
|
+
description: 'Session ID for continuing an existing session. Omit to start a new session.',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
required: ['input'],
|
|
161
|
+
},
|
|
162
|
+
},
|
|
83
163
|
];
|
|
84
164
|
/** Strip response fields based on status for context-efficient MCP responses */
|
|
85
165
|
function stripResponse(result, question) {
|
|
@@ -201,6 +281,21 @@ async function main() {
|
|
|
201
281
|
description: 'Structured decision-making for problems with multiple options',
|
|
202
282
|
arguments: [{ name: 'problem', description: 'The problem or decision to analyze', required: true }],
|
|
203
283
|
},
|
|
284
|
+
{
|
|
285
|
+
name: 'RVRY_think',
|
|
286
|
+
description: 'Structured analysis for questions needing more depth',
|
|
287
|
+
arguments: [{ name: 'question', description: 'The question to analyze', required: true }],
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'RVRY_challenge',
|
|
291
|
+
description: 'Adversarial analysis that stress-tests a proposal',
|
|
292
|
+
arguments: [{ name: 'proposal', description: 'The proposal or idea to challenge', required: true }],
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'RVRY_meta',
|
|
296
|
+
description: 'Sustained metacognitive observation (Max tier only)',
|
|
297
|
+
arguments: [{ name: 'topic', description: 'The topic or context to reflect on', required: true }],
|
|
298
|
+
},
|
|
204
299
|
],
|
|
205
300
|
}));
|
|
206
301
|
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
@@ -208,6 +303,9 @@ async function main() {
|
|
|
208
303
|
const promptMap = {
|
|
209
304
|
RVRY_deepthink: `Use the RVRY_deepthink tool to analyze this question in depth: ${args?.question ?? ''}`,
|
|
210
305
|
RVRY_problem_solve: `Use the RVRY_problem_solve tool to work through this decision: ${args?.problem ?? ''}`,
|
|
306
|
+
RVRY_think: `Use the RVRY_think tool to analyze this question: ${args?.question ?? ''}`,
|
|
307
|
+
RVRY_challenge: `Use the RVRY_challenge tool to stress-test this proposal: ${args?.proposal ?? ''}`,
|
|
308
|
+
RVRY_meta: `Use the RVRY_meta tool to reflect on this topic: ${args?.topic ?? ''}`,
|
|
211
309
|
};
|
|
212
310
|
const text = promptMap[name] ?? `Unknown prompt: ${name}`;
|
|
213
311
|
return {
|
|
@@ -221,7 +319,7 @@ async function main() {
|
|
|
221
319
|
});
|
|
222
320
|
const transport = new StdioServerTransport();
|
|
223
321
|
await server.connect(transport);
|
|
224
|
-
console.error('[rvry-mcp] Connected via stdio. Tools: RVRY_deepthink, RVRY_problem_solve');
|
|
322
|
+
console.error('[rvry-mcp] Connected via stdio. Tools: RVRY_deepthink, RVRY_problem_solve, RVRY_think, RVRY_challenge, RVRY_meta');
|
|
225
323
|
}
|
|
226
324
|
// Export internals for testing
|
|
227
325
|
export { TOOL_MAP, TOOL_DEFS, stripResponse, questionCache };
|
package/dist/setup.js
CHANGED
|
@@ -456,26 +456,6 @@ const CLIENT_REGISTRY = [
|
|
|
456
456
|
configure: registerGeminiCLI,
|
|
457
457
|
notInstalledHint: 'Not installed (https://github.com/google-gemini/gemini-cli)',
|
|
458
458
|
},
|
|
459
|
-
{
|
|
460
|
-
name: 'Windsurf',
|
|
461
|
-
id: 'windsurf',
|
|
462
|
-
defaultSelected: false,
|
|
463
|
-
detect: () => {
|
|
464
|
-
if (platform() === 'darwin' && existsSync('/Applications/Windsurf.app'))
|
|
465
|
-
return true;
|
|
466
|
-
if (existsSync(join(homedir(), '.codeium', 'windsurf', 'mcp_config.json')))
|
|
467
|
-
return true;
|
|
468
|
-
try {
|
|
469
|
-
const cmd = platform() === 'win32' ? 'where windsurf' : 'which windsurf';
|
|
470
|
-
execSync(cmd, { stdio: 'pipe' });
|
|
471
|
-
return true;
|
|
472
|
-
}
|
|
473
|
-
catch { /* not on PATH */ }
|
|
474
|
-
return false;
|
|
475
|
-
},
|
|
476
|
-
configure: (token) => configureJsonMcp(join(homedir(), '.codeium', 'windsurf', 'mcp_config.json'), token),
|
|
477
|
-
notInstalledHint: 'Not installed (https://windsurf.com)',
|
|
478
|
-
},
|
|
479
459
|
{
|
|
480
460
|
name: 'Codex',
|
|
481
461
|
id: 'codex',
|