@contextstream/mcp-server 0.4.64 → 0.4.65

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
@@ -84,7 +84,7 @@ npx @contextstream/mcp-server@latest setup
84
84
 
85
85
  The wizard handles everything: authentication, configuration, editor integration, and optional hooks that supercharge your workflow.
86
86
 
87
- **Works with:** Claude Code • Cursor • VS Code • Claude Desktop • Codex CLI • Antigravity
87
+ **Works with:** Claude Code • Cursor • VS Code • Claude Desktop • Codex CLI • OpenCode • Antigravity
88
88
 
89
89
  ---
90
90
 
@@ -139,6 +139,48 @@ claude mcp update contextstream -e CONTEXTSTREAM_API_KEY=your_key
139
139
 
140
140
  </details>
141
141
 
142
+ <details>
143
+ <summary><b>OpenCode</b></summary>
144
+
145
+ Local server:
146
+
147
+ ```json
148
+ {
149
+ "$schema": "https://opencode.ai/config.json",
150
+ "mcp": {
151
+ "contextstream": {
152
+ "type": "local",
153
+ "command": ["npx", "-y", "contextstream-mcp"],
154
+ "environment": {
155
+ "CONTEXTSTREAM_API_KEY": "{env:CONTEXTSTREAM_API_KEY}"
156
+ },
157
+ "enabled": true
158
+ }
159
+ }
160
+ }
161
+ ```
162
+
163
+ Remote server:
164
+
165
+ ```json
166
+ {
167
+ "$schema": "https://opencode.ai/config.json",
168
+ "mcp": {
169
+ "contextstream": {
170
+ "type": "remote",
171
+ "url": "https://mcp.contextstream.com",
172
+ "enabled": true
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ For the local variant, export `CONTEXTSTREAM_API_KEY` before launching OpenCode.
179
+
180
+ **Locations:** `./opencode.json` • `~/.config/opencode/opencode.json`
181
+
182
+ </details>
183
+
142
184
  <details>
143
185
  <summary><b>VS Code</b></summary>
144
186
 
@@ -1316,7 +1316,7 @@ function buildHooksConfig(options) {
1316
1316
  {
1317
1317
  type: "command",
1318
1318
  command: getHookCommand("session-start"),
1319
- timeout: 10
1319
+ timeout: 15
1320
1320
  }
1321
1321
  ]
1322
1322
  }
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,
@@ -10,6 +10,7 @@ import * as fs from "node:fs";
10
10
  import * as path from "node:path";
11
11
  import { homedir } from "node:os";
12
12
  var DEFAULT_API_URL = "https://api.contextstream.io";
13
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
13
14
  function readHookInput() {
14
15
  try {
15
16
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -18,9 +19,11 @@ function readHookInput() {
18
19
  }
19
20
  }
20
21
  function writeHookOutput(output) {
22
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
23
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
21
24
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
22
- hookSpecificOutput: output.additionalContext ? {
23
- hookEventName: output.hookEventName,
25
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
26
+ hookEventName: eventName,
24
27
  additionalContext: output.additionalContext
25
28
  } : void 0,
26
29
  additionalContext: output.additionalContext,
@@ -303,10 +303,7 @@ After compaction, call session_init(is_post_compact=true) to restore context.${c
303
303
  User instructions: ${customInstructions}` : ""}`;
304
304
  console.log(
305
305
  JSON.stringify({
306
- hookSpecificOutput: {
307
- hookEventName: "PreCompact",
308
- additionalContext: context
309
- }
306
+ additionalContext: context
310
307
  })
311
308
  );
312
309
  process.exit(0);
@@ -2181,10 +2181,7 @@ After compaction, call session_init(is_post_compact=true) to restore context.${c
2181
2181
  User instructions: ${customInstructions}` : ""}`;
2182
2182
  console.log(
2183
2183
  JSON.stringify({
2184
- hookSpecificOutput: {
2185
- hookEventName: "PreCompact",
2186
- additionalContext: context
2187
- }
2184
+ additionalContext: context
2188
2185
  })
2189
2186
  );
2190
2187
  process.exit(0);
@@ -3673,10 +3670,7 @@ async function runSessionInitHook() {
3673
3670
  });
3674
3671
  console.log(
3675
3672
  JSON.stringify({
3676
- hookSpecificOutput: {
3677
- hookEventName: "SessionStart",
3678
- additionalContext: formattedContext
3679
- }
3673
+ additionalContext: formattedContext
3680
3674
  })
3681
3675
  );
3682
3676
  process.exit(0);
@@ -3714,9 +3708,11 @@ function readHookInput() {
3714
3708
  }
3715
3709
  }
3716
3710
  function writeHookOutput(output) {
3711
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
3712
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
3717
3713
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
3718
- hookSpecificOutput: output.additionalContext ? {
3719
- hookEventName: output.hookEventName,
3714
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
3715
+ hookEventName: eventName,
3720
3716
  additionalContext: output.additionalContext
3721
3717
  } : void 0,
3722
3718
  additionalContext: output.additionalContext,
@@ -3917,11 +3913,12 @@ async function fetchFastContext(config, body) {
3917
3913
  return null;
3918
3914
  }
3919
3915
  }
3920
- var DEFAULT_API_URL;
3916
+ var DEFAULT_API_URL, HOOK_SPECIFIC_OUTPUT_EVENTS;
3921
3917
  var init_common = __esm({
3922
3918
  "src/hooks/common.ts"() {
3923
3919
  "use strict";
3924
3920
  DEFAULT_API_URL = "https://api.contextstream.io";
3921
+ HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
3925
3922
  }
3926
3923
  });
3927
3924
 
@@ -1708,10 +1708,7 @@ async function runSessionInitHook() {
1708
1708
  });
1709
1709
  console.log(
1710
1710
  JSON.stringify({
1711
- hookSpecificOutput: {
1712
- hookEventName: "SessionStart",
1713
- additionalContext: formattedContext
1714
- }
1711
+ additionalContext: formattedContext
1715
1712
  })
1716
1713
  );
1717
1714
  process.exit(0);
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,
@@ -8,6 +8,7 @@ import * as fs from "node:fs";
8
8
  import * as path from "node:path";
9
9
  import { homedir } from "node:os";
10
10
  var DEFAULT_API_URL = "https://api.contextstream.io";
11
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
11
12
  function readHookInput() {
12
13
  try {
13
14
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -16,9 +17,11 @@ function readHookInput() {
16
17
  }
17
18
  }
18
19
  function writeHookOutput(output) {
20
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
21
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
19
22
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
20
- hookSpecificOutput: output.additionalContext ? {
21
- hookEventName: output.hookEventName,
23
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
24
+ hookEventName: eventName,
22
25
  additionalContext: output.additionalContext
23
26
  } : void 0,
24
27
  additionalContext: output.additionalContext,
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,
@@ -5,6 +5,7 @@ import * as fs from "node:fs";
5
5
  import * as path from "node:path";
6
6
  import { homedir } from "node:os";
7
7
  var DEFAULT_API_URL = "https://api.contextstream.io";
8
+ var HOOK_SPECIFIC_OUTPUT_EVENTS = /* @__PURE__ */ new Set(["PreToolUse", "UserPromptSubmit", "PostToolUse"]);
8
9
  function readHookInput() {
9
10
  try {
10
11
  return JSON.parse(fs.readFileSync(0, "utf8"));
@@ -13,9 +14,11 @@ function readHookInput() {
13
14
  }
14
15
  }
15
16
  function writeHookOutput(output) {
17
+ const eventName = output?.hookEventName || (typeof process.env.HOOK_EVENT_NAME === "string" ? process.env.HOOK_EVENT_NAME.trim() : "");
18
+ const canUseHookSpecificOutput = HOOK_SPECIFIC_OUTPUT_EVENTS.has(eventName);
16
19
  const payload = output && (output.additionalContext || output.blocked || output.reason) ? {
17
- hookSpecificOutput: output.additionalContext ? {
18
- hookEventName: output.hookEventName,
20
+ hookSpecificOutput: output.additionalContext && canUseHookSpecificOutput ? {
21
+ hookEventName: eventName,
19
22
  additionalContext: output.additionalContext
20
23
  } : void 0,
21
24
  additionalContext: output.additionalContext,