@contextstream/mcp-server 0.3.41 → 0.3.42
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 +80 -7
- package/dist/index.js +288 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -91,6 +91,8 @@ These clients use the `mcpServers` JSON schema:
|
|
|
91
91
|
|
|
92
92
|
Many other MCP JSON clients also use this same `mcpServers` shape (including Claude Code project scope via `.mcp.json`).
|
|
93
93
|
|
|
94
|
+
**Core toolset (default, ~17 tools):**
|
|
95
|
+
|
|
94
96
|
```json
|
|
95
97
|
{
|
|
96
98
|
"mcpServers": {
|
|
@@ -106,10 +108,30 @@ Many other MCP JSON clients also use this same `mcpServers` shape (including Cla
|
|
|
106
108
|
}
|
|
107
109
|
```
|
|
108
110
|
|
|
111
|
+
**Full toolset (~86 tools):**
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"mcpServers": {
|
|
116
|
+
"contextstream": {
|
|
117
|
+
"command": "npx",
|
|
118
|
+
"args": ["-y", "@contextstream/mcp-server"],
|
|
119
|
+
"env": {
|
|
120
|
+
"CONTEXTSTREAM_API_URL": "https://api.contextstream.io",
|
|
121
|
+
"CONTEXTSTREAM_API_KEY": "your_api_key",
|
|
122
|
+
"CONTEXTSTREAM_TOOLSET": "full"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
109
129
|
### VS Code (`.vscode/mcp.json`)
|
|
110
130
|
|
|
111
131
|
VS Code uses a different schema with a top-level `servers` map:
|
|
112
132
|
|
|
133
|
+
**Core toolset (default):**
|
|
134
|
+
|
|
113
135
|
```json
|
|
114
136
|
{
|
|
115
137
|
"servers": {
|
|
@@ -126,6 +148,25 @@ VS Code uses a different schema with a top-level `servers` map:
|
|
|
126
148
|
}
|
|
127
149
|
```
|
|
128
150
|
|
|
151
|
+
**Full toolset (~86 tools):**
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"servers": {
|
|
156
|
+
"contextstream": {
|
|
157
|
+
"type": "stdio",
|
|
158
|
+
"command": "npx",
|
|
159
|
+
"args": ["-y", "@contextstream/mcp-server"],
|
|
160
|
+
"env": {
|
|
161
|
+
"CONTEXTSTREAM_API_URL": "https://api.contextstream.io",
|
|
162
|
+
"CONTEXTSTREAM_API_KEY": "your_api_key",
|
|
163
|
+
"CONTEXTSTREAM_TOOLSET": "full"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
129
170
|
Strong recommendation: VS Code supports `inputs` so you don’t have to hardcode secrets in a committed file:
|
|
130
171
|
|
|
131
172
|
```json
|
|
@@ -156,28 +197,59 @@ Strong recommendation: VS Code supports `inputs` so you don’t have to hardcode
|
|
|
156
197
|
|
|
157
198
|
User scope (all projects):
|
|
158
199
|
|
|
200
|
+
**Core toolset (recommended for Claude Code):**
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
claude mcp add --transport stdio contextstream --scope user \
|
|
204
|
+
--env CONTEXTSTREAM_API_URL=https://api.contextstream.io \
|
|
205
|
+
--env CONTEXTSTREAM_API_KEY=YOUR_KEY \
|
|
206
|
+
-- npx -y @contextstream/mcp-server
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Full toolset (~86 tools):**
|
|
210
|
+
|
|
159
211
|
```bash
|
|
160
212
|
claude mcp add --transport stdio contextstream --scope user \
|
|
161
213
|
--env CONTEXTSTREAM_API_URL=https://api.contextstream.io \
|
|
162
214
|
--env CONTEXTSTREAM_API_KEY=YOUR_KEY \
|
|
163
|
-
--env CONTEXTSTREAM_TOOLSET=
|
|
164
|
-
npx -y @contextstream/mcp-server
|
|
215
|
+
--env CONTEXTSTREAM_TOOLSET=full \
|
|
216
|
+
-- npx -y @contextstream/mcp-server
|
|
165
217
|
```
|
|
166
218
|
|
|
167
|
-
|
|
168
|
-
|
|
219
|
+
Note: Claude Code may warn about large tool contexts when using `full`. The default is `core` (~17 tools).
|
|
220
|
+
|
|
221
|
+
Windows caveat (native Windows, not WSL): if `npx` isn't found, use `cmd /c npx -y @contextstream/mcp-server` after `--`.
|
|
169
222
|
|
|
170
|
-
|
|
223
|
+
**Alternative (JSON form):**
|
|
171
224
|
|
|
172
|
-
|
|
225
|
+
Core:
|
|
226
|
+
```bash
|
|
227
|
+
claude mcp add-json contextstream \
|
|
228
|
+
'{"type":"stdio","command":"npx","args":["-y","@contextstream/mcp-server"],"env":{"CONTEXTSTREAM_API_URL":"https://api.contextstream.io","CONTEXTSTREAM_API_KEY":"your_api_key"}}'
|
|
229
|
+
```
|
|
173
230
|
|
|
231
|
+
Full:
|
|
174
232
|
```bash
|
|
175
233
|
claude mcp add-json contextstream \
|
|
176
|
-
'{"type":"stdio","command":"npx","args":["-y","@contextstream/mcp-server"],"env":{"CONTEXTSTREAM_API_URL":"https://api.contextstream.io","CONTEXTSTREAM_API_KEY":"your_api_key","CONTEXTSTREAM_TOOLSET":"
|
|
234
|
+
'{"type":"stdio","command":"npx","args":["-y","@contextstream/mcp-server"],"env":{"CONTEXTSTREAM_API_URL":"https://api.contextstream.io","CONTEXTSTREAM_API_KEY":"your_api_key","CONTEXTSTREAM_TOOLSET":"full"}}'
|
|
177
235
|
```
|
|
178
236
|
|
|
179
237
|
### Codex CLI (`~/.codex/config.toml`)
|
|
180
238
|
|
|
239
|
+
**Core toolset (default):**
|
|
240
|
+
|
|
241
|
+
```toml
|
|
242
|
+
[mcp_servers.contextstream]
|
|
243
|
+
command = "npx"
|
|
244
|
+
args = ["-y", "@contextstream/mcp-server"]
|
|
245
|
+
|
|
246
|
+
[mcp_servers.contextstream.env]
|
|
247
|
+
CONTEXTSTREAM_API_URL = "https://api.contextstream.io"
|
|
248
|
+
CONTEXTSTREAM_API_KEY = "your_api_key"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Full toolset (~86 tools):**
|
|
252
|
+
|
|
181
253
|
```toml
|
|
182
254
|
[mcp_servers.contextstream]
|
|
183
255
|
command = "npx"
|
|
@@ -186,6 +258,7 @@ args = ["-y", "@contextstream/mcp-server"]
|
|
|
186
258
|
[mcp_servers.contextstream.env]
|
|
187
259
|
CONTEXTSTREAM_API_URL = "https://api.contextstream.io"
|
|
188
260
|
CONTEXTSTREAM_API_KEY = "your_api_key"
|
|
261
|
+
CONTEXTSTREAM_TOOLSET = "full"
|
|
189
262
|
```
|
|
190
263
|
|
|
191
264
|
After editing, restart your MCP client so it reloads the server configuration.
|
package/dist/index.js
CHANGED
|
@@ -6923,6 +6923,80 @@ W:${wsHint}
|
|
|
6923
6923
|
}
|
|
6924
6924
|
return request(this.config, `/workspaces/${withDefaults.workspace_id}/integrations/status`, { method: "GET" });
|
|
6925
6925
|
}
|
|
6926
|
+
/**
|
|
6927
|
+
* Get GitHub summary for a workspace
|
|
6928
|
+
*/
|
|
6929
|
+
async githubSummary(params) {
|
|
6930
|
+
const withDefaults = this.withDefaults(params || {});
|
|
6931
|
+
if (!withDefaults.workspace_id) {
|
|
6932
|
+
throw new Error("workspace_id is required for GitHub summary");
|
|
6933
|
+
}
|
|
6934
|
+
const query = new URLSearchParams();
|
|
6935
|
+
if (params?.days) query.set("days", String(params.days));
|
|
6936
|
+
if (params?.repo) query.set("repo", params.repo);
|
|
6937
|
+
const suffix = query.toString() ? `?${query.toString()}` : "";
|
|
6938
|
+
return request(this.config, `/github/summary${suffix}`, { method: "GET" });
|
|
6939
|
+
}
|
|
6940
|
+
/**
|
|
6941
|
+
* Get Slack summary for a workspace
|
|
6942
|
+
*/
|
|
6943
|
+
async slackSummary(params) {
|
|
6944
|
+
const withDefaults = this.withDefaults(params || {});
|
|
6945
|
+
if (!withDefaults.workspace_id) {
|
|
6946
|
+
throw new Error("workspace_id is required for Slack summary");
|
|
6947
|
+
}
|
|
6948
|
+
const query = new URLSearchParams();
|
|
6949
|
+
if (params?.days) query.set("days", String(params.days));
|
|
6950
|
+
if (params?.channel) query.set("channel", params.channel);
|
|
6951
|
+
const suffix = query.toString() ? `?${query.toString()}` : "";
|
|
6952
|
+
return request(this.config, `/slack/summary${suffix}`, { method: "GET" });
|
|
6953
|
+
}
|
|
6954
|
+
/**
|
|
6955
|
+
* Cross-source search across all integrations
|
|
6956
|
+
*/
|
|
6957
|
+
async integrationsSearch(params) {
|
|
6958
|
+
const withDefaults = this.withDefaults(params || {});
|
|
6959
|
+
if (!withDefaults.workspace_id) {
|
|
6960
|
+
throw new Error("workspace_id is required for integrations search");
|
|
6961
|
+
}
|
|
6962
|
+
const urlParams = new URLSearchParams();
|
|
6963
|
+
urlParams.set("q", params.query);
|
|
6964
|
+
urlParams.set("workspace_id", withDefaults.workspace_id);
|
|
6965
|
+
if (params?.limit) urlParams.set("limit", String(params.limit));
|
|
6966
|
+
if (params?.sources) urlParams.set("sources", params.sources.join(","));
|
|
6967
|
+
if (params?.days) urlParams.set("days", String(params.days));
|
|
6968
|
+
if (params?.sort_by) urlParams.set("sort_by", params.sort_by);
|
|
6969
|
+
return request(this.config, `/integrations/search?${urlParams.toString()}`, { method: "GET" });
|
|
6970
|
+
}
|
|
6971
|
+
/**
|
|
6972
|
+
* Cross-source summary across all integrations
|
|
6973
|
+
*/
|
|
6974
|
+
async integrationsSummary(params) {
|
|
6975
|
+
const withDefaults = this.withDefaults(params || {});
|
|
6976
|
+
if (!withDefaults.workspace_id) {
|
|
6977
|
+
throw new Error("workspace_id is required for integrations summary");
|
|
6978
|
+
}
|
|
6979
|
+
const query = new URLSearchParams();
|
|
6980
|
+
query.set("workspace_id", withDefaults.workspace_id);
|
|
6981
|
+
if (params?.days) query.set("days", String(params.days));
|
|
6982
|
+
return request(this.config, `/integrations/summary?${query.toString()}`, { method: "GET" });
|
|
6983
|
+
}
|
|
6984
|
+
/**
|
|
6985
|
+
* Cross-source knowledge from all integrations
|
|
6986
|
+
*/
|
|
6987
|
+
async integrationsKnowledge(params) {
|
|
6988
|
+
const withDefaults = this.withDefaults(params || {});
|
|
6989
|
+
if (!withDefaults.workspace_id) {
|
|
6990
|
+
throw new Error("workspace_id is required for integrations knowledge");
|
|
6991
|
+
}
|
|
6992
|
+
const urlParams = new URLSearchParams();
|
|
6993
|
+
urlParams.set("workspace_id", withDefaults.workspace_id);
|
|
6994
|
+
if (params?.knowledge_type) urlParams.set("knowledge_type", params.knowledge_type);
|
|
6995
|
+
if (params?.query) urlParams.set("query", params.query);
|
|
6996
|
+
if (params?.sources) urlParams.set("sources", params.sources.join(","));
|
|
6997
|
+
if (params?.limit) urlParams.set("limit", String(params.limit));
|
|
6998
|
+
return request(this.config, `/integrations/knowledge?${urlParams.toString()}`, { method: "GET" });
|
|
6999
|
+
}
|
|
6926
7000
|
};
|
|
6927
7001
|
|
|
6928
7002
|
// src/tools.ts
|
|
@@ -7026,6 +7100,16 @@ var CONTEXTSTREAM_TOOL_NAMES = [
|
|
|
7026
7100
|
"slack_discussions",
|
|
7027
7101
|
"slack_search",
|
|
7028
7102
|
"slack_sync_users",
|
|
7103
|
+
"slack_knowledge",
|
|
7104
|
+
"slack_summary",
|
|
7105
|
+
// GitHub additional
|
|
7106
|
+
"github_knowledge",
|
|
7107
|
+
"github_summary",
|
|
7108
|
+
// Cross-source integrations
|
|
7109
|
+
"integrations_status",
|
|
7110
|
+
"integrations_search",
|
|
7111
|
+
"integrations_summary",
|
|
7112
|
+
"integrations_knowledge",
|
|
7029
7113
|
// Auth/Meta
|
|
7030
7114
|
"auth_me",
|
|
7031
7115
|
"mcp_server_version"
|
|
@@ -7194,7 +7278,18 @@ session_recall(query="what did we decide about caching?")
|
|
|
7194
7278
|
|
|
7195
7279
|
### Full Tool Catalog
|
|
7196
7280
|
|
|
7197
|
-
|
|
7281
|
+
To expose all tools below, set \`CONTEXTSTREAM_TOOLSET=full\` in your MCP config. The default (\`core\`) includes only the essential session/context tools above.
|
|
7282
|
+
|
|
7283
|
+
**To enable full toolset in your MCP config:**
|
|
7284
|
+
\`\`\`json
|
|
7285
|
+
{
|
|
7286
|
+
"env": {
|
|
7287
|
+
"CONTEXTSTREAM_TOOLSET": "full"
|
|
7288
|
+
}
|
|
7289
|
+
}
|
|
7290
|
+
\`\`\`
|
|
7291
|
+
|
|
7292
|
+
**Available tool categories (when \`CONTEXTSTREAM_TOOLSET=full\`):**
|
|
7198
7293
|
|
|
7199
7294
|
**Session/Context** (included in core):
|
|
7200
7295
|
\`session_init\`, \`context_smart\`, \`session_summary\`, \`session_capture\`, \`session_capture_lesson\`, \`session_get_lessons\`, \`session_recall\`, \`session_remember\`, \`session_get_user_context\`, \`session_smart_search\`, \`session_compress\`, \`session_delta\`, \`generate_editor_rules\`, \`workspace_associate\`, \`workspace_bootstrap\`
|
|
@@ -7218,10 +7313,13 @@ The following tools are available when \`CONTEXTSTREAM_TOOLSET=full\` (default i
|
|
|
7218
7313
|
\`ai_context\`, \`ai_enhanced_context\`, \`ai_context_budget\`, \`ai_embeddings\`, \`ai_plan\`, \`ai_tasks\`
|
|
7219
7314
|
|
|
7220
7315
|
**GitHub Integration** (PRO):
|
|
7221
|
-
\`github_stats\`, \`github_repos\`, \`github_contributors\`, \`github_activity\`, \`github_issues\`, \`github_search\`
|
|
7316
|
+
\`github_stats\`, \`github_repos\`, \`github_contributors\`, \`github_activity\`, \`github_issues\`, \`github_search\`, \`github_knowledge\`, \`github_summary\`
|
|
7222
7317
|
|
|
7223
7318
|
**Slack Integration** (PRO):
|
|
7224
|
-
\`slack_stats\`, \`slack_channels\`, \`slack_contributors\`, \`slack_activity\`, \`slack_discussions\`, \`slack_search\`, \`slack_sync_users\`
|
|
7319
|
+
\`slack_stats\`, \`slack_channels\`, \`slack_contributors\`, \`slack_activity\`, \`slack_discussions\`, \`slack_search\`, \`slack_sync_users\`, \`slack_knowledge\`, \`slack_summary\`
|
|
7320
|
+
|
|
7321
|
+
**Cross-Source Integrations** (PRO):
|
|
7322
|
+
\`integrations_status\`, \`integrations_search\`, \`integrations_summary\`, \`integrations_knowledge\`
|
|
7225
7323
|
|
|
7226
7324
|
See full documentation: https://contextstream.io/docs/mcp/tools
|
|
7227
7325
|
`.trim();
|
|
@@ -7235,7 +7333,20 @@ var CONTEXTSTREAM_RULES_MINIMAL = `
|
|
|
7235
7333
|
- For code/file discovery, use \`session_smart_search\` before raw repo scans (\`rg\`, \`ls\`, \`find\`); fall back only if needed.
|
|
7236
7334
|
- After meaningful work/decisions/preferences: \`session_capture(event_type=decision|preference|task|insight, title="\u2026", content="\u2026")\`.
|
|
7237
7335
|
- On frustration/corrections/tool mistakes: \`session_capture_lesson(...)\`.
|
|
7238
|
-
|
|
7336
|
+
|
|
7337
|
+
### Tool Catalog
|
|
7338
|
+
|
|
7339
|
+
By default, the MCP server exposes **core** tools (~17 essential session/context tools). To expose the **full** catalog (~86 tools including workspaces, projects, search, memory, graph, AI, and integrations), set \`CONTEXTSTREAM_TOOLSET=full\` in your MCP config:
|
|
7340
|
+
|
|
7341
|
+
\`\`\`json
|
|
7342
|
+
{
|
|
7343
|
+
"env": {
|
|
7344
|
+
"CONTEXTSTREAM_TOOLSET": "full"
|
|
7345
|
+
}
|
|
7346
|
+
}
|
|
7347
|
+
\`\`\`
|
|
7348
|
+
|
|
7349
|
+
Full tool reference: https://contextstream.io/docs/mcp/tools
|
|
7239
7350
|
`.trim();
|
|
7240
7351
|
var TEMPLATES = {
|
|
7241
7352
|
codex: {
|
|
@@ -9884,6 +9995,169 @@ Example queries:
|
|
|
9884
9995
|
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
9885
9996
|
}
|
|
9886
9997
|
);
|
|
9998
|
+
registerTool(
|
|
9999
|
+
"github_summary",
|
|
10000
|
+
{
|
|
10001
|
+
title: "GitHub activity summary",
|
|
10002
|
+
description: `Get a high-level summary of GitHub activity for a workspace.
|
|
10003
|
+
Returns: overview of issues, PRs, commits, releases, and highlights for the specified period.
|
|
10004
|
+
Use this for weekly/monthly reports or to get a quick overview of repository activity.
|
|
10005
|
+
|
|
10006
|
+
Example prompts:
|
|
10007
|
+
- "Give me a weekly GitHub summary"
|
|
10008
|
+
- "What happened in GitHub last month?"
|
|
10009
|
+
- "Show me the GitHub summary for repo X"`,
|
|
10010
|
+
inputSchema: external_exports.object({
|
|
10011
|
+
workspace_id: external_exports.string().uuid().optional(),
|
|
10012
|
+
days: external_exports.number().optional().describe("Number of days to summarize (default: 7)"),
|
|
10013
|
+
repo: external_exports.string().optional().describe("Filter by repository name")
|
|
10014
|
+
})
|
|
10015
|
+
},
|
|
10016
|
+
async (input) => {
|
|
10017
|
+
const workspaceId = resolveWorkspaceId(input.workspace_id);
|
|
10018
|
+
if (!workspaceId) {
|
|
10019
|
+
return errorResult("Error: workspace_id is required. Please call session_init first or provide workspace_id explicitly.");
|
|
10020
|
+
}
|
|
10021
|
+
const result = await client.githubSummary({
|
|
10022
|
+
workspace_id: workspaceId,
|
|
10023
|
+
days: input.days,
|
|
10024
|
+
repo: input.repo
|
|
10025
|
+
});
|
|
10026
|
+
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
10027
|
+
}
|
|
10028
|
+
);
|
|
10029
|
+
registerTool(
|
|
10030
|
+
"slack_summary",
|
|
10031
|
+
{
|
|
10032
|
+
title: "Slack activity summary",
|
|
10033
|
+
description: `Get a high-level summary of Slack activity for a workspace.
|
|
10034
|
+
Returns: overview of messages, threads, top channels, and highlights for the specified period.
|
|
10035
|
+
Use this for weekly/monthly reports or to get a quick overview of team discussions.
|
|
10036
|
+
|
|
10037
|
+
Example prompts:
|
|
10038
|
+
- "Give me a weekly Slack summary"
|
|
10039
|
+
- "What was discussed in Slack last month?"
|
|
10040
|
+
- "Show me the Slack summary for #engineering"`,
|
|
10041
|
+
inputSchema: external_exports.object({
|
|
10042
|
+
workspace_id: external_exports.string().uuid().optional(),
|
|
10043
|
+
days: external_exports.number().optional().describe("Number of days to summarize (default: 7)"),
|
|
10044
|
+
channel: external_exports.string().optional().describe("Filter by channel name")
|
|
10045
|
+
})
|
|
10046
|
+
},
|
|
10047
|
+
async (input) => {
|
|
10048
|
+
const workspaceId = resolveWorkspaceId(input.workspace_id);
|
|
10049
|
+
if (!workspaceId) {
|
|
10050
|
+
return errorResult("Error: workspace_id is required. Please call session_init first or provide workspace_id explicitly.");
|
|
10051
|
+
}
|
|
10052
|
+
const result = await client.slackSummary({
|
|
10053
|
+
workspace_id: workspaceId,
|
|
10054
|
+
days: input.days,
|
|
10055
|
+
channel: input.channel
|
|
10056
|
+
});
|
|
10057
|
+
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
10058
|
+
}
|
|
10059
|
+
);
|
|
10060
|
+
registerTool(
|
|
10061
|
+
"integrations_search",
|
|
10062
|
+
{
|
|
10063
|
+
title: "Cross-source search",
|
|
10064
|
+
description: `Search across all connected integrations (GitHub, Slack, etc.) with a single query.
|
|
10065
|
+
Returns: unified results from all sources, ranked by relevance or recency.
|
|
10066
|
+
Use this to find related discussions, issues, and content across all your tools.
|
|
10067
|
+
|
|
10068
|
+
Example prompts:
|
|
10069
|
+
- "Search all integrations for database migration discussions"
|
|
10070
|
+
- "Find mentions of authentication across GitHub and Slack"
|
|
10071
|
+
- "Search for API changes in the last 30 days"`,
|
|
10072
|
+
inputSchema: external_exports.object({
|
|
10073
|
+
workspace_id: external_exports.string().uuid().optional(),
|
|
10074
|
+
query: external_exports.string().describe("Search query"),
|
|
10075
|
+
limit: external_exports.number().optional().describe("Maximum results (default: 20)"),
|
|
10076
|
+
sources: external_exports.array(external_exports.string()).optional().describe("Filter by source: github, slack"),
|
|
10077
|
+
days: external_exports.number().optional().describe("Filter to results within N days"),
|
|
10078
|
+
sort_by: external_exports.enum(["relevance", "recent", "engagement"]).optional().describe("Sort by: relevance, recent, or engagement")
|
|
10079
|
+
})
|
|
10080
|
+
},
|
|
10081
|
+
async (input) => {
|
|
10082
|
+
const workspaceId = resolveWorkspaceId(input.workspace_id);
|
|
10083
|
+
if (!workspaceId) {
|
|
10084
|
+
return errorResult("Error: workspace_id is required. Please call session_init first or provide workspace_id explicitly.");
|
|
10085
|
+
}
|
|
10086
|
+
const result = await client.integrationsSearch({
|
|
10087
|
+
workspace_id: workspaceId,
|
|
10088
|
+
query: input.query,
|
|
10089
|
+
limit: input.limit,
|
|
10090
|
+
sources: input.sources,
|
|
10091
|
+
days: input.days,
|
|
10092
|
+
sort_by: input.sort_by
|
|
10093
|
+
});
|
|
10094
|
+
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
10095
|
+
}
|
|
10096
|
+
);
|
|
10097
|
+
registerTool(
|
|
10098
|
+
"integrations_summary",
|
|
10099
|
+
{
|
|
10100
|
+
title: "Cross-source activity summary",
|
|
10101
|
+
description: `Get a unified summary of activity across all connected integrations.
|
|
10102
|
+
Returns: combined overview of GitHub and Slack activity, key highlights, and trends.
|
|
10103
|
+
Use this for weekly team summaries or to understand overall activity across all tools.
|
|
10104
|
+
|
|
10105
|
+
Example prompts:
|
|
10106
|
+
- "Give me a weekly team summary across all sources"
|
|
10107
|
+
- "What happened across GitHub and Slack last week?"
|
|
10108
|
+
- "Show me a unified activity overview"`,
|
|
10109
|
+
inputSchema: external_exports.object({
|
|
10110
|
+
workspace_id: external_exports.string().uuid().optional(),
|
|
10111
|
+
days: external_exports.number().optional().describe("Number of days to summarize (default: 7)")
|
|
10112
|
+
})
|
|
10113
|
+
},
|
|
10114
|
+
async (input) => {
|
|
10115
|
+
const workspaceId = resolveWorkspaceId(input.workspace_id);
|
|
10116
|
+
if (!workspaceId) {
|
|
10117
|
+
return errorResult("Error: workspace_id is required. Please call session_init first or provide workspace_id explicitly.");
|
|
10118
|
+
}
|
|
10119
|
+
const result = await client.integrationsSummary({
|
|
10120
|
+
workspace_id: workspaceId,
|
|
10121
|
+
days: input.days
|
|
10122
|
+
});
|
|
10123
|
+
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
10124
|
+
}
|
|
10125
|
+
);
|
|
10126
|
+
registerTool(
|
|
10127
|
+
"integrations_knowledge",
|
|
10128
|
+
{
|
|
10129
|
+
title: "Cross-source knowledge",
|
|
10130
|
+
description: `Get knowledge extracted from all connected integrations (GitHub, Slack, etc.).
|
|
10131
|
+
Returns: decisions, lessons, and insights distilled from all sources.
|
|
10132
|
+
Use this to find key decisions and learnings from across your team's conversations.
|
|
10133
|
+
|
|
10134
|
+
Example prompts:
|
|
10135
|
+
- "What decisions were made across all sources about authentication?"
|
|
10136
|
+
- "Show me lessons learned from all integrations"
|
|
10137
|
+
- "What insights have we gathered from GitHub and Slack?"`,
|
|
10138
|
+
inputSchema: external_exports.object({
|
|
10139
|
+
workspace_id: external_exports.string().uuid().optional(),
|
|
10140
|
+
knowledge_type: external_exports.enum(["decision", "lesson", "fact", "insight"]).optional().describe("Filter by knowledge type"),
|
|
10141
|
+
query: external_exports.string().optional().describe("Optional search query to filter knowledge"),
|
|
10142
|
+
sources: external_exports.array(external_exports.string()).optional().describe("Filter by source: github, slack"),
|
|
10143
|
+
limit: external_exports.number().optional().describe("Maximum items to return (default: 20)")
|
|
10144
|
+
})
|
|
10145
|
+
},
|
|
10146
|
+
async (input) => {
|
|
10147
|
+
const workspaceId = resolveWorkspaceId(input.workspace_id);
|
|
10148
|
+
if (!workspaceId) {
|
|
10149
|
+
return errorResult("Error: workspace_id is required. Please call session_init first or provide workspace_id explicitly.");
|
|
10150
|
+
}
|
|
10151
|
+
const result = await client.integrationsKnowledge({
|
|
10152
|
+
workspace_id: workspaceId,
|
|
10153
|
+
knowledge_type: input.knowledge_type,
|
|
10154
|
+
query: input.query,
|
|
10155
|
+
sources: input.sources,
|
|
10156
|
+
limit: input.limit
|
|
10157
|
+
});
|
|
10158
|
+
return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
|
|
10159
|
+
}
|
|
10160
|
+
);
|
|
9887
10161
|
registerTool(
|
|
9888
10162
|
"integrations_status",
|
|
9889
10163
|
{
|
|
@@ -10501,6 +10775,8 @@ async function upsertCodexTomlConfig(filePath, params) {
|
|
|
10501
10775
|
const existing = exists ? await fs5.readFile(filePath, "utf8").catch(() => "") : "";
|
|
10502
10776
|
const marker = "[mcp_servers.contextstream]";
|
|
10503
10777
|
const envMarker = "[mcp_servers.contextstream.env]";
|
|
10778
|
+
const toolsetLine = params.toolset ? `CONTEXTSTREAM_TOOLSET = "${params.toolset}"
|
|
10779
|
+
` : "";
|
|
10504
10780
|
const block = `
|
|
10505
10781
|
|
|
10506
10782
|
# ContextStream MCP server
|
|
@@ -10511,7 +10787,7 @@ args = ["-y", "@contextstream/mcp-server"]
|
|
|
10511
10787
|
[mcp_servers.contextstream.env]
|
|
10512
10788
|
CONTEXTSTREAM_API_URL = "${params.apiUrl}"
|
|
10513
10789
|
CONTEXTSTREAM_API_KEY = "${params.apiKey}"
|
|
10514
|
-
|
|
10790
|
+
` + toolsetLine;
|
|
10515
10791
|
if (!exists) {
|
|
10516
10792
|
await fs5.writeFile(filePath, block.trimStart(), "utf8");
|
|
10517
10793
|
return "created";
|
|
@@ -10782,8 +11058,13 @@ Created API key: ${maskApiKey(apiKey)}
|
|
|
10782
11058
|
const mode = modeChoice === "2" ? "full" : "minimal";
|
|
10783
11059
|
console.log("\nMCP toolset (which tools to expose to the AI):");
|
|
10784
11060
|
console.log(" 1) Core (recommended) \u2014 essential session/context tools (~17 tools, lower token overhead)");
|
|
11061
|
+
console.log(" Best for: most users, Claude Code, Claude Desktop (avoids large-context warnings)");
|
|
10785
11062
|
console.log(" 2) Full \u2014 all tools including workspaces, projects, search, memory, graph, AI, integrations (~86 tools)");
|
|
11063
|
+
console.log(" Best for: power users needing direct access to all workspace/project/graph/AI tools");
|
|
10786
11064
|
console.log(" Note: Claude Code/Desktop may warn about large tool lists when using full toolset.");
|
|
11065
|
+
console.log("");
|
|
11066
|
+
console.log(" Tip: You can switch toolsets later by editing the MCP config and setting CONTEXTSTREAM_TOOLSET=full");
|
|
11067
|
+
console.log(" See https://contextstream.io/docs/mcp/tools for the full tool catalog.");
|
|
10787
11068
|
const toolsetChoice = normalizeInput(await rl.question("Choose [1/2] (default 1): ")) || "1";
|
|
10788
11069
|
const toolset = toolsetChoice === "2" ? "full" : "core";
|
|
10789
11070
|
const editors = ["codex", "claude", "cursor", "windsurf", "cline", "kilo", "roo", "aider"];
|
|
@@ -10832,7 +11113,8 @@ Created API key: ${maskApiKey(apiKey)}
|
|
|
10832
11113
|
console.log(`- ${EDITOR_LABELS[editor]}: would update ${filePath}`);
|
|
10833
11114
|
continue;
|
|
10834
11115
|
}
|
|
10835
|
-
const
|
|
11116
|
+
const codexParams = toolset === "full" ? { apiUrl, apiKey, toolset: "full" } : { apiUrl, apiKey };
|
|
11117
|
+
const status = await upsertCodexTomlConfig(filePath, codexParams);
|
|
10836
11118
|
writeActions.push({ kind: "mcp-config", target: filePath, status });
|
|
10837
11119
|
console.log(`- ${EDITOR_LABELS[editor]}: ${status} ${filePath}`);
|
|
10838
11120
|
continue;
|
package/package.json
CHANGED