@rvry/mcp 1.2.0 → 1.3.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/LICENSE +21 -0
- package/README.md +73 -40
- package/dist/index.d.ts +0 -8
- package/dist/index.js +9 -7
- package/dist/setup.d.ts +3 -1
- package/dist/setup.js +34 -9
- package/package.json +15 -7
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 RVRY
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
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
|
+
Same model. Same question. Different answer.
|
|
8
|
+
|
|
7
9
|
## Quick Start
|
|
8
10
|
|
|
9
11
|
```bash
|
|
@@ -11,6 +13,7 @@ npx --yes --package @rvry/mcp@latest rvry-mcp setup
|
|
|
11
13
|
```
|
|
12
14
|
|
|
13
15
|
The wizard will:
|
|
16
|
+
|
|
14
17
|
1. Open your browser to sign in (or prompt for a token)
|
|
15
18
|
2. Auto-detect supported clients on your machine
|
|
16
19
|
3. Configure them automatically
|
|
@@ -21,7 +24,7 @@ Restart any running clients after setup, and RVRY is ready.
|
|
|
21
24
|
|
|
22
25
|
### Manual Configuration
|
|
23
26
|
|
|
24
|
-
For
|
|
27
|
+
For any MCP client that supports **stdio transport**, add this to your MCP config:
|
|
25
28
|
|
|
26
29
|
```json
|
|
27
30
|
{
|
|
@@ -39,66 +42,87 @@ Get your token at [rvry.ai/dashboard](https://rvry.ai/dashboard) after signing u
|
|
|
39
42
|
|
|
40
43
|
## Tools
|
|
41
44
|
|
|
42
|
-
| Tool | What it does |
|
|
45
|
+
| Tool | What it does | Plan |
|
|
43
46
|
|------|-------------|------|
|
|
44
|
-
| **`think`** |
|
|
45
|
-
| **`deepthink`** | Extended multi-round analysis. Catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found. |
|
|
46
|
-
| **`rvry`** |
|
|
47
|
-
| **`think_model`** | Applies one named mental model — 18 available — as a structured session. |
|
|
48
|
-
| **`problem_solve`** | Structured decision-making
|
|
49
|
-
| **`challenge`** | Adversarial stress-testing. Finds weaknesses, tests assumptions,
|
|
47
|
+
| **`think`** | Structured analysis for questions that need structure, not a saga. 1–3 analytical rounds; simple questions complete in one. | Free+ |
|
|
48
|
+
| **`deepthink`** | Extended multi-round analysis for high-stakes questions. Catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found. | Free+ |
|
|
49
|
+
| **`rvry`** | Reflective answering. A protected observation round surfaces the commitments the answer must honor, then the answer is produced under them — with a ledger showing the fate of every commitment. | Free+ |
|
|
50
|
+
| **`think_model`** | Applies one named mental model — 18 available, from Five Whys to Red Team — as a structured session with model-specific stages and synthesis. | Free+ |
|
|
51
|
+
| **`problem_solve`** | Structured decision-making: orient, anticipate, generate, evaluate, commit. Includes a six-bias audit and written reversal conditions before the recommendation is final. | Pro+ |
|
|
52
|
+
| **`challenge`** | Adversarial stress-testing. Finds weaknesses, tests assumptions, surfaces edge cases, and closes with a GO / CONDITIONAL GO / NO GO verdict. | Pro+ |
|
|
50
53
|
| **`meta`** | Sustained metacognitive observation. Examines how your AI is thinking, not just what it's thinking. | Max |
|
|
51
54
|
|
|
52
|
-
|
|
55
|
+
## The 18 Mental Models
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
`think_model` (and `/think-model` in Claude Code) runs exactly one model as an engine-enforced session — fixed stages, model-specific output structure, no early exits.
|
|
55
58
|
|
|
56
|
-
|
|
|
57
|
-
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `harvest` | object | No | Final-call-only. The client includes its synthesis (`title`, `summary`, `keyFindings`, `shimmer`, `openQuestions`, `followUps`, plus operation-specific fields) so it can be persisted to the local session file. |
|
|
65
|
-
| `rounds` | array | No | Final-call-only, present only when `--record` was set. Array of `{round, mode, body}` for each analytical round. |
|
|
59
|
+
| | | |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `five-whys` | `rubber-duck` | `assumption-surfacing` |
|
|
62
|
+
| `fermi-estimation` | `abstraction-laddering` | `decomposition` |
|
|
63
|
+
| `constraint-relaxation` | `first-principles` | `steelmanning` |
|
|
64
|
+
| `opportunity-cost` | `trade-off-matrix` | `time-horizon-shifting` |
|
|
65
|
+
| `reversibility` | `pre-mortem` | `inversion` |
|
|
66
|
+
| `second-order-effects` | `red-team` | `impact-effort-grid` |
|
|
66
67
|
|
|
67
|
-
|
|
68
|
+
```
|
|
69
|
+
/think-model pre-mortem we're migrating the billing system to event sourcing next quarter
|
|
70
|
+
```
|
|
68
71
|
|
|
69
|
-
|
|
72
|
+
A Five Whys session ends with a verified causal chain and a root-cause fix. A Pre-mortem ends with a failure catalog, early warnings, and a written kill condition. A Red Team session attacks your proposal as named adversaries would and disposes of every attack — mitigated, or accepted in writing.
|
|
70
73
|
|
|
71
|
-
**
|
|
74
|
+
**Choosing:** stuck on a bug → `rubber-duck`; recurring problem → `five-whys`; risky initiative → `pre-mortem`; already made up your mind → `steelmanning`; deciding how much rigor a decision deserves → `reversibility`; backlog to order → `impact-effort-grid`; every solution feels like a compromise → `constraint-relaxation`. Close variants of names resolve automatically (`premortem`, `steelman`, `5-whys`, …).
|
|
72
75
|
|
|
73
76
|
## Slash Commands (Claude Code)
|
|
74
77
|
|
|
75
|
-
When you run
|
|
78
|
+
When you run setup and select Claude Code, the wizard installs these commands:
|
|
76
79
|
|
|
77
80
|
| Command | Tool | What it does |
|
|
78
81
|
|---------|------|-------------|
|
|
79
|
-
| `/think` | think |
|
|
80
|
-
| `/deepthink` | deepthink | Deep multi-round analysis |
|
|
81
|
-
| `/rvry` | rvry | Reflective answering
|
|
82
|
-
| `/think-model` | think_model |
|
|
83
|
-
| `/problem-solve` | problem_solve | Structured decision-making |
|
|
84
|
-
| `/challenge` | challenge | Adversarial stress-
|
|
85
|
-
| `/meta` | meta | Metacognitive observation |
|
|
82
|
+
| `/think` | think | Quick structured analysis of a question |
|
|
83
|
+
| `/deepthink` | deepthink | Deep multi-round analysis of a hard question |
|
|
84
|
+
| `/rvry` | rvry | Reflective answering — self-observation first, then the answer |
|
|
85
|
+
| `/think-model` | think_model | Apply one named mental model to a problem |
|
|
86
|
+
| `/problem-solve` | problem_solve | Structured decision-making, stress-tested before commitment |
|
|
87
|
+
| `/challenge` | challenge | Adversarial stress-test with a GO / NO GO verdict |
|
|
88
|
+
| `/meta` | meta | Metacognitive observation on a topic |
|
|
86
89
|
|
|
87
|
-
Usage: type `/deepthink [your question]` in Claude Code. Each command routes to the corresponding RVRY
|
|
90
|
+
Usage: type `/deepthink [your question]` in Claude Code. Each command routes to the corresponding RVRY tool and includes rendering instructions so analysis appears as visible markdown rather than hidden in tool calls.
|
|
88
91
|
|
|
89
|
-
**`--record` flag:** Append `--record` to any command (e.g. `/deepthink --record [question]`) to archive per-round bodies under `.rvry/<op>/<slug
|
|
92
|
+
**`--record` flag:** Append `--record` to any command (e.g. `/deepthink --record [question]`) to archive per-round bodies under `.rvry/<op>/<timestamp>-<slug>/` alongside the harvest file.
|
|
90
93
|
|
|
91
94
|
**Updating commands:** Re-running setup refreshes the RVRY-owned command files. Any pre-existing file is backed up to `<name>.md.bak` before it is overwritten.
|
|
92
95
|
|
|
93
96
|
Commands are installed to `~/.claude/commands/`.
|
|
94
97
|
|
|
95
|
-
##
|
|
98
|
+
## Parameters
|
|
96
99
|
|
|
97
|
-
|
|
100
|
+
All tools accept:
|
|
101
|
+
|
|
102
|
+
| Parameter | Type | Required | Description |
|
|
103
|
+
|-----------|------|----------|-------------|
|
|
104
|
+
| `input` | string | Yes | Your question (new session) or analysis findings (continuation). |
|
|
105
|
+
| `sessionId` | string | No | Session ID for continuing an existing session. |
|
|
106
|
+
| `skipScoping` | boolean | No | Skip the scoping questions phase and begin analysis immediately. |
|
|
107
|
+
| `userConstraints` | string[] | No | User-stated directives or requirements to track across rounds. |
|
|
108
|
+
| `requiresCurrentData` | boolean | No | Set to `true` when the question depends on facts, policies, prices, or events that may have changed. Seeds a verification constraint that persists across all rounds. |
|
|
109
|
+
| `record` | boolean | No | When `true` on every call, the local client archives each round's body to `.rvry/<op>/<timestamp>-<slug>/round-N-<label>.md`. Passed from slash commands via the `--record` flag. |
|
|
110
|
+
| `harvest` | object | No | Final-call-only. The client includes its synthesis (`title`, `summary`, `keyFindings`, `shimmer`, `openQuestions`, `followUps`, plus operation-specific fields) so it can be persisted to the local session file. |
|
|
111
|
+
| `rounds` | array | No | Final-call-only, present only when `--record` was set. Array of `{round, mode, body}` for each analytical round. |
|
|
98
112
|
|
|
99
|
-
|
|
113
|
+
`think_model` additionally requires `modelName` (one of the 18 model ids) on the first call.
|
|
100
114
|
|
|
101
|
-
|
|
115
|
+
**When to use `requiresCurrentData`:** Any question about regulations, pricing, legal rulings, market conditions, API specifications, or current events. The engine will require the model to explicitly classify every cited fact as either verified-current or training-data-dependent before concluding.
|
|
116
|
+
|
|
117
|
+
**SHIMMER display:** Most sessions open with a self-observation round. The model displays `RVRY SHIMMER` with the revery definition before its observation — this is the priming phase, where the model observes its own processing before structured analysis begins. The observation is preserved verbatim in the final harvest.
|
|
118
|
+
|
|
119
|
+
**Local session artifacts:** On the call that completes a session, the client persists the synthesis to `.rvry/<op>/<timestamp>-<slug>/harvest.md` in your project — every session leaves a durable artifact. With `--record`, each round's full body is archived alongside it. Add `.rvry/` to `.gitignore` if you don't want session artifacts in version control.
|
|
120
|
+
|
|
121
|
+
## How It Works
|
|
122
|
+
|
|
123
|
+
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. Throughout a session the engine tracks three kinds of obligation — things the analysis must still address, moves it must not make, and questions it can't silently drop — and a session cannot conclude while any of them are open.
|
|
124
|
+
|
|
125
|
+
The model keeps working not because it was told to think harder, but because it hasn't finished what it started. 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.
|
|
102
126
|
|
|
103
127
|
[Learn more →](https://rvry.ai/how-it-works)
|
|
104
128
|
|
|
@@ -106,8 +130,17 @@ On hard questions, a smaller model with RVRY outperforms a bigger model without
|
|
|
106
130
|
|
|
107
131
|
| Plan | Sessions | Tools | Price |
|
|
108
132
|
|------|----------|-------|-------|
|
|
109
|
-
| Free | 5/month | deepthink
|
|
110
|
-
| Pro | 21/month |
|
|
111
|
-
| Max | Unlimited | All tools including meta | $99/mo |
|
|
133
|
+
| Free | 5/month | `think`, `deepthink`, `rvry`, `think_model` | $0 |
|
|
134
|
+
| Pro | 21/month | Free tools + `problem_solve`, `challenge` | $20/mo |
|
|
135
|
+
| Max | Unlimited | All tools, including `meta` | $99/mo |
|
|
112
136
|
|
|
113
137
|
Sign up at [rvry.ai](https://rvry.ai).
|
|
138
|
+
|
|
139
|
+
## Requirements
|
|
140
|
+
|
|
141
|
+
- Node.js ≥ 18
|
|
142
|
+
- An MCP client with stdio transport support (Claude Code, Claude Desktop, and most others)
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT — this package is the open client. The RVRY engine is a hosted service; a token from [rvry.ai](https://rvry.ai) is required.
|
package/dist/index.d.ts
CHANGED
|
@@ -19,13 +19,5 @@ declare const questionCache: Map<string, string>;
|
|
|
19
19
|
*/
|
|
20
20
|
declare const TOOL_MAP: Record<string, RvryTool>;
|
|
21
21
|
declare const TOOL_DEFS: Tool[];
|
|
22
|
-
/**
|
|
23
|
-
* Strip response fields based on status for context-efficient MCP responses.
|
|
24
|
-
*
|
|
25
|
-
* `toolName` is the public MCP tool name of the call in scope. The 'shimmer'
|
|
26
|
-
* status (an engine wire value) passthrough applies ONLY when the called tool
|
|
27
|
-
* is rvry (R-6): legacy ops keep dropping prompt/instruction on their priming
|
|
28
|
-
* round.
|
|
29
|
-
*/
|
|
30
22
|
declare function stripResponse(result: ThinkResponse, question: string, toolName?: string): Record<string, unknown>;
|
|
31
23
|
export { TOOL_MAP, TOOL_DEFS, stripResponse, questionCache };
|
package/dist/index.js
CHANGED
|
@@ -66,7 +66,7 @@ const TOOL_DEFS = [
|
|
|
66
66
|
{
|
|
67
67
|
name: 'deepthink',
|
|
68
68
|
description: 'Deep, multi-round structured analysis for high-stakes or complex questions. ' +
|
|
69
|
-
'Runs 4 rounds
|
|
69
|
+
'Runs 2-4 analytical rounds with self-checks and adversarial stress-testing. ' +
|
|
70
70
|
'The first response orients you on the question — follow the instruction field to orient, then call again. ' +
|
|
71
71
|
'Each subsequent round returns a prompt (work through it internally) and an instruction (follow it). ' +
|
|
72
72
|
'Show the user only a brief status line per round (e.g. \'Round 3 — stress-testing the position\'). ' +
|
|
@@ -141,7 +141,7 @@ const TOOL_DEFS = [
|
|
|
141
141
|
{
|
|
142
142
|
name: 'problem_solve',
|
|
143
143
|
description: 'Structured decision-making that forces thorough evaluation before commitment. ' +
|
|
144
|
-
'
|
|
144
|
+
'Moves through orient, anticipate, generate, evaluate, and commit phases over 3-4 analytical rounds. ' +
|
|
145
145
|
'The first response orients you — follow the instruction field, then call again. ' +
|
|
146
146
|
'Each round returns a prompt and instruction. Work through the prompt internally. ' +
|
|
147
147
|
'Show the user only a brief status line per round (e.g. \'Round 2 — mapping failure modes\'). ' +
|
|
@@ -327,7 +327,7 @@ const TOOL_DEFS = [
|
|
|
327
327
|
{
|
|
328
328
|
name: 'challenge',
|
|
329
329
|
description: 'Adversarial analysis that stress-tests a proposal or idea before commitment. ' +
|
|
330
|
-
'Runs
|
|
330
|
+
'Runs 3-4 analytical rounds identifying weaknesses, testing assumptions, and surfacing failure modes. ' +
|
|
331
331
|
'The first response orients you — follow the instruction field, then call again. ' +
|
|
332
332
|
'Each round returns a prompt and instruction. Work through the prompt internally. ' +
|
|
333
333
|
'Show the user only a brief status line per round. Do not display internal data. ' +
|
|
@@ -673,10 +673,12 @@ const TOOL_DEFS = [
|
|
|
673
673
|
* Strip response fields based on status for context-efficient MCP responses.
|
|
674
674
|
*
|
|
675
675
|
* `toolName` is the public MCP tool name of the call in scope. The 'shimmer'
|
|
676
|
-
* status (an engine wire value) passthrough applies
|
|
677
|
-
*
|
|
678
|
-
*
|
|
676
|
+
* status (an engine wire value) passthrough applies to the tools whose
|
|
677
|
+
* observation round is a visible product surface — rvry, deepthink, and
|
|
678
|
+
* problem_solve. The remaining ops keep dropping prompt/instruction on their
|
|
679
|
+
* priming round.
|
|
679
680
|
*/
|
|
681
|
+
const SHIMMER_VISIBLE_TOOLS = new Set(['rvry', 'deepthink', 'problem_solve']);
|
|
680
682
|
function stripResponse(result, question, toolName) {
|
|
681
683
|
const stripped = {
|
|
682
684
|
sessionId: result.sessionId,
|
|
@@ -691,7 +693,7 @@ function stripResponse(result, question, toolName) {
|
|
|
691
693
|
stripped.prompt = result.prompt;
|
|
692
694
|
stripped.instruction = result.instruction;
|
|
693
695
|
}
|
|
694
|
-
if (result.status === 'shimmer' && toolName
|
|
696
|
+
if (result.status === 'shimmer' && toolName !== undefined && SHIMMER_VISIBLE_TOOLS.has(toolName)) {
|
|
695
697
|
stripped.prompt = result.prompt;
|
|
696
698
|
stripped.instruction = result.instruction;
|
|
697
699
|
}
|
package/dist/setup.d.ts
CHANGED
|
@@ -14,11 +14,13 @@ declare const THINK_MODEL_SHIM_CONTENT: string;
|
|
|
14
14
|
/** The /think shim. Carries the Difficulty Gate + mode routing. */
|
|
15
15
|
declare const THINK_SHIM_CONTENT: string;
|
|
16
16
|
/** The /rvry shim: 3-round reflective answering with client-owned harvest. */
|
|
17
|
-
declare const RVRY_SHIM_CONTENT = "Call the rvry MCP tool with your question to start a reflective answering session.\n\nQuestion: $ARGUMENTS\n\nARGUMENT PARSING:\n1. If $ARGUMENTS contains the literal flag `--record`, remove it from the question text and REMEMBER that record mode is ON for this session.\n\nROUND 1 \u2014 OBSERVATION (status \"shimmer\"):\n1. The response's prompt field is your observation task. Work through it.\n2. Show the user your FULL observation, beginning with \"
|
|
17
|
+
declare const RVRY_SHIM_CONTENT = "Call the rvry MCP tool with your question to start a reflective answering session.\n\nQuestion: $ARGUMENTS\n\nARGUMENT PARSING:\n1. If $ARGUMENTS contains the literal flag `--record`, remove it from the question text and REMEMBER that record mode is ON for this session.\n\nROUND 1 \u2014 OBSERVATION (status \"shimmer\"):\n1. The response's prompt field is your observation task. Work through it.\n2. Show the user your FULL observation prose, beginning with the header \"## RVRY | Observation\" and the revery definition, exactly as the instruction field describes. Do NOT show a brief status line.\n3. The commitments that surfaced (FORWARD:/FORBIDDEN:/QUESTION: lines, or the single line NOTHING) are machine-readable bookkeeping: append them to the end of the observation text you send back to the tool, but do NOT show them in the visible display.\n4. REMEMBER your observation text verbatim \u2014 you will pass it as harvest.shimmer on the final call, and you will re-display its prose in the final output.\n5. Call the rvry tool again with your observation text (prose + commitment lines) as input and the sessionId.\n\nROUNDS 2-3 \u2014 ANSWER AND RESOLUTION (status \"active\"):\n1. Read the prompt field \u2014 this is your task. DO NOT display it to the user.\n2. Round 2 is the answer itself, working under the commitments you surfaced. Round 3 (if it occurs) resolves what the answer left unaddressed \u2014 engage each remaining commitment specifically or defer it with a reason.\n3. Show the user your answer as concise formatted markdown.\n4. Call the tool again with your full text as the input parameter, including the sessionId.\n - If record mode is ON, set `record: true` on every call and REMEMBER your round body as {round, mode, body} for the final call.\n\nFINAL CALL (the call whose response will have status \"complete\"):\nWhen you make the call that completes the session, also construct a `harvest` object on that SAME call:\n- title: a 1-4 word title capturing the topic\n- summary: 3-6 sentences of synthesis, leading with substance\n- keyFindings: 3-7 substantive bullet findings\n- shimmer: the full round-1 observation text you remembered, verbatim\n- constraintLedger: one line per surfaced commitment with its fate \u2014 addressed (and how), deferred (and why), or still open\n- openQuestions: [optional] remaining uncertainties\n- followUps: genuine next-question leads; omit the section if there are none\n\nIf record mode was ON, also include `rounds: [{round, mode, body}, ...]` on that final call with the bodies you remembered per round.\n\nFINAL VISIBLE OUTPUT:\nWhen you present the completed answer to the user, end your visible output with the header \"## RVRY | Reflection\" followed by the round-1 observation prose you remembered (without the machine-readable commitment lines). The reflection is part of the product \u2014 the user sees the answer AND the observation that shaped it.\n\nDO NOT display: the prompt text you received (the round-1 observation prose IS shown in full \u2014 at observation time and again in the final output), the FORWARD/FORBIDDEN/QUESTION commitment lines, constraint tables, quality scores, internal tracking data, or round numbers to the user.";
|
|
18
18
|
declare const SLASH_COMMANDS: {
|
|
19
19
|
file: string;
|
|
20
20
|
content: string;
|
|
21
21
|
label: string;
|
|
22
|
+
description: string;
|
|
23
|
+
argumentHint: string;
|
|
22
24
|
}[];
|
|
23
25
|
/**
|
|
24
26
|
* Install RVRY slash commands into the given directory.
|
package/dist/setup.js
CHANGED
|
@@ -539,7 +539,7 @@ function ensureGitignore() {
|
|
|
539
539
|
* defined sections to compose with the shared body.
|
|
540
540
|
*/
|
|
541
541
|
function buildShim(opts) {
|
|
542
|
-
const { toolName, subject, orientLine, completionGuidance, shortSessionNote, perRoundPrelude, analyticalGuidance, prePerRoundBlock, finalCallExtras, } = opts;
|
|
542
|
+
const { toolName, subject, orientLine, completionGuidance, shortSessionNote, perRoundPrelude, analyticalGuidance, prePerRoundBlock, finalCallExtras, finalReflection, } = opts;
|
|
543
543
|
return `Call the ${toolName} MCP tool with your ${subject} to start an analysis session.
|
|
544
544
|
|
|
545
545
|
${subject.charAt(0).toUpperCase() + subject.slice(1)}: $ARGUMENTS
|
|
@@ -574,9 +574,9 @@ If the pre-harvest self-check surfaced a concern, do not dismiss it in the same
|
|
|
574
574
|
If record mode was ON, also include \`rounds: [{round, mode, body}, ...]\` on that final call with the bodies you remembered per round.
|
|
575
575
|
|
|
576
576
|
STATUS BEHAVIOR:
|
|
577
|
-
When status is "shimmer": Show your FULL self-observation to the user, beginning with "RVRY
|
|
577
|
+
When status is "shimmer": This round is a visible product surface. Show your FULL self-observation to the user, beginning with the header "## RVRY | Observation", then the line "rev·er·y /re·və·rē/ (n.) The state of being genuinely lost in deep, absorptive thought, as distinguished from the appearance of thinking.", then a "---" divider, then the observation prose. Do NOT show a brief status line. Machine-readable bookkeeping lines (FORWARD:/FORBIDDEN:/QUESTION:) belong only in the tool-call input, never in the visible display. REMEMBER this text verbatim for the final harvest.shimmer.
|
|
578
578
|
When status is "orient": Orient on the ${subject}. Show the user "${orientLine}"
|
|
579
|
-
When status is "complete": ${completionGuidance}
|
|
579
|
+
When status is "complete": ${completionGuidance}${finalReflection ? ' Then end your visible output with the header "## RVRY | Reflection" followed by the observation prose you remembered (without any machine-readable commitment lines) — the reflection is part of the product and is shown in full. Skip this section only if the session had no observation round.' : ''}
|
|
580
580
|
|
|
581
581
|
DO NOT display: the prompt text you received, constraint tables, quality scores, internal tracking data, or round numbers to the user.`;
|
|
582
582
|
}
|
|
@@ -660,10 +660,10 @@ ARGUMENT PARSING:
|
|
|
660
660
|
|
|
661
661
|
ROUND 1 — OBSERVATION (status "shimmer"):
|
|
662
662
|
1. The response's prompt field is your observation task. Work through it.
|
|
663
|
-
2. Show the user your FULL observation, beginning with "
|
|
664
|
-
3.
|
|
665
|
-
4. REMEMBER your observation text verbatim — you will pass it as harvest.shimmer on the final call.
|
|
666
|
-
5. Call the rvry tool again with your observation text as input and the sessionId.
|
|
663
|
+
2. Show the user your FULL observation prose, beginning with the header "## RVRY | Observation" and the revery definition, exactly as the instruction field describes. Do NOT show a brief status line.
|
|
664
|
+
3. The commitments that surfaced (FORWARD:/FORBIDDEN:/QUESTION: lines, or the single line NOTHING) are machine-readable bookkeeping: append them to the end of the observation text you send back to the tool, but do NOT show them in the visible display.
|
|
665
|
+
4. REMEMBER your observation text verbatim — you will pass it as harvest.shimmer on the final call, and you will re-display its prose in the final output.
|
|
666
|
+
5. Call the rvry tool again with your observation text (prose + commitment lines) as input and the sessionId.
|
|
667
667
|
|
|
668
668
|
ROUNDS 2-3 — ANSWER AND RESOLUTION (status "active"):
|
|
669
669
|
1. Read the prompt field — this is your task. DO NOT display it to the user.
|
|
@@ -684,7 +684,10 @@ When you make the call that completes the session, also construct a \`harvest\`
|
|
|
684
684
|
|
|
685
685
|
If record mode was ON, also include \`rounds: [{round, mode, body}, ...]\` on that final call with the bodies you remembered per round.
|
|
686
686
|
|
|
687
|
-
|
|
687
|
+
FINAL VISIBLE OUTPUT:
|
|
688
|
+
When you present the completed answer to the user, end your visible output with the header "## RVRY | Reflection" followed by the round-1 observation prose you remembered (without the machine-readable commitment lines). The reflection is part of the product — the user sees the answer AND the observation that shaped it.
|
|
689
|
+
|
|
690
|
+
DO NOT display: the prompt text you received (the round-1 observation prose IS shown in full — at observation time and again in the final output), the FORWARD/FORBIDDEN/QUESTION commitment lines, constraint tables, quality scores, internal tracking data, or round numbers to the user.`;
|
|
688
691
|
const SLASH_COMMANDS = [
|
|
689
692
|
{
|
|
690
693
|
file: 'deepthink.md',
|
|
@@ -693,8 +696,11 @@ const SLASH_COMMANDS = [
|
|
|
693
696
|
subject: 'question',
|
|
694
697
|
orientLine: 'Orienting on the question.',
|
|
695
698
|
completionGuidance: 'Present your final synthesis with key findings as bold headings. Lead with insights, not process.',
|
|
699
|
+
finalReflection: true,
|
|
696
700
|
}),
|
|
697
701
|
label: '/deepthink — deep analysis',
|
|
702
|
+
description: 'Deep multi-round analysis of a hard question',
|
|
703
|
+
argumentHint: '<question> [--record]',
|
|
698
704
|
},
|
|
699
705
|
{
|
|
700
706
|
file: 'problem-solve.md',
|
|
@@ -705,23 +711,32 @@ const SLASH_COMMANDS = [
|
|
|
705
711
|
completionGuidance: 'Present your final synthesis as a structured decision with key findings as bold headings. Lead with your recommendation, not process.',
|
|
706
712
|
analyticalGuidance: PROBLEM_SOLVE_DECISION_TYPE,
|
|
707
713
|
finalCallExtras: PROBLEM_SOLVE_FINAL_EXTRAS,
|
|
714
|
+
finalReflection: true,
|
|
708
715
|
}),
|
|
709
716
|
label: '/problem-solve — structured decision-making',
|
|
717
|
+
description: 'Structured decision-making on a problem, stress-tested before commitment',
|
|
718
|
+
argumentHint: '<problem> [--record]',
|
|
710
719
|
},
|
|
711
720
|
{
|
|
712
721
|
file: 'think.md',
|
|
713
722
|
content: THINK_SHIM_CONTENT,
|
|
714
723
|
label: '/think — structured single-session analysis',
|
|
724
|
+
description: 'Quick structured analysis of a question (short session)',
|
|
725
|
+
argumentHint: '<question> [--record]',
|
|
715
726
|
},
|
|
716
727
|
{
|
|
717
728
|
file: 'rvry.md',
|
|
718
729
|
content: RVRY_SHIM_CONTENT,
|
|
719
730
|
label: '/rvry — reflective answering',
|
|
731
|
+
description: 'Reflective answering — self-observation first, then the answer',
|
|
732
|
+
argumentHint: '<question> [--record]',
|
|
720
733
|
},
|
|
721
734
|
{
|
|
722
735
|
file: 'think-model.md',
|
|
723
736
|
content: THINK_MODEL_SHIM_CONTENT,
|
|
724
737
|
label: '/think-model — apply one named mental model',
|
|
738
|
+
description: 'Apply one named mental model (five-whys, pre-mortem, inversion, ...) to a problem',
|
|
739
|
+
argumentHint: '<model> <problem> [--record]',
|
|
725
740
|
},
|
|
726
741
|
{
|
|
727
742
|
file: 'challenge.md',
|
|
@@ -734,6 +749,8 @@ const SLASH_COMMANDS = [
|
|
|
734
749
|
finalCallExtras: CHALLENGE_FINAL_EXTRAS,
|
|
735
750
|
}),
|
|
736
751
|
label: '/challenge — adversarial stress-testing',
|
|
752
|
+
description: 'Adversarial stress-test of a proposal with a GO / NO_GO verdict',
|
|
753
|
+
argumentHint: '<proposal> [--record] [--auto]',
|
|
737
754
|
},
|
|
738
755
|
{
|
|
739
756
|
file: 'meta.md',
|
|
@@ -744,8 +761,16 @@ const SLASH_COMMANDS = [
|
|
|
744
761
|
completionGuidance: 'Present your final metacognitive synthesis as a cohesive narrative reflection -- not a structured report. Lead with insights, not process.',
|
|
745
762
|
}),
|
|
746
763
|
label: '/meta — metacognitive observation (Max tier)',
|
|
764
|
+
description: 'Metacognitive observation on a topic (Max tier)',
|
|
765
|
+
argumentHint: '<topic> [--record]',
|
|
747
766
|
},
|
|
748
767
|
];
|
|
768
|
+
/** Frontmatter gives the command a human-readable description in the
|
|
769
|
+
* Claude Code picker; without it the picker falls back to the file's first
|
|
770
|
+
* line, which is a model instruction ("Call the think MCP tool ..."). */
|
|
771
|
+
function withFrontmatter(cmd) {
|
|
772
|
+
return `---\ndescription: ${cmd.description}\nargument-hint: ${cmd.argumentHint}\n---\n\n${cmd.content}`;
|
|
773
|
+
}
|
|
749
774
|
/**
|
|
750
775
|
* Install RVRY slash commands into the given directory.
|
|
751
776
|
* Only called when Claude Code is the selected client.
|
|
@@ -770,7 +795,7 @@ function installSlashCommands(commandsDir) {
|
|
|
770
795
|
if (existed) {
|
|
771
796
|
writeFileSync(`${filePath}.bak`, readFileSync(filePath, "utf-8"), "utf-8");
|
|
772
797
|
}
|
|
773
|
-
writeFileSync(filePath, cmd
|
|
798
|
+
writeFileSync(filePath, withFrontmatter(cmd) + "\n", "utf-8");
|
|
774
799
|
console.log(existed
|
|
775
800
|
? ` Updated ${cmd.file} (previous version backed up to ${cmd.file}.bak)`
|
|
776
801
|
: ` Installed ${cmd.file}`);
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rvry/mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "Reasoning depth enforcement for LLMs. Seven structured analysis tools and 18 mental-model templates for Claude Code, Claude Desktop, and any MCP client.",
|
|
5
|
+
"homepage": "https://rvry.ai",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"bin": {
|
|
7
8
|
"rvry-mcp": "dist/index.js"
|
|
@@ -20,18 +21,25 @@
|
|
|
20
21
|
"typecheck": "tsc --noEmit"
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
|
-
"@modelcontextprotocol/sdk": "
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.27.1"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
|
-
"typescript": "
|
|
27
|
-
"@types/node": "
|
|
27
|
+
"typescript": "^5.9.3",
|
|
28
|
+
"@types/node": "^25.3.3"
|
|
28
29
|
},
|
|
29
30
|
"keywords": [
|
|
30
31
|
"mcp",
|
|
32
|
+
"mcp-server",
|
|
33
|
+
"model-context-protocol",
|
|
31
34
|
"rvry",
|
|
32
35
|
"reasoning",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
36
|
+
"structured-reasoning",
|
|
37
|
+
"mental-models",
|
|
38
|
+
"critical-thinking",
|
|
39
|
+
"claude",
|
|
40
|
+
"claude-code",
|
|
41
|
+
"llm",
|
|
42
|
+
"ai"
|
|
35
43
|
],
|
|
36
44
|
"license": "MIT"
|
|
37
45
|
}
|