@gopersonal/advisor 1.0.0 → 1.0.2
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 +76 -9
- package/build/index.js +76 -36
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -9,37 +9,62 @@ An MCP server that gives AI agents access to a separate AI advisor via [OpenCode
|
|
|
9
9
|
|
|
10
10
|
## Add to Claude Code
|
|
11
11
|
|
|
12
|
+
### Option A: OpenAI endpoint
|
|
13
|
+
|
|
12
14
|
```bash
|
|
13
|
-
claude mcp add advisor
|
|
15
|
+
claude mcp add advisor \
|
|
16
|
+
-e ADVISOR_PROVIDER=openai \
|
|
17
|
+
-e ADVISOR_MODEL=gpt-4o \
|
|
18
|
+
-e ADVISOR_API_KEY=sk-your-key \
|
|
19
|
+
-- npx -y @gopersonal/advisor
|
|
14
20
|
```
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
With a custom OpenAI-compatible endpoint:
|
|
17
23
|
|
|
18
24
|
```bash
|
|
19
25
|
claude mcp add advisor \
|
|
20
|
-
-e
|
|
26
|
+
-e ADVISOR_PROVIDER=openai \
|
|
27
|
+
-e ADVISOR_MODEL=gpt-4o \
|
|
21
28
|
-e ADVISOR_API_KEY=sk-your-key \
|
|
29
|
+
-e ADVISOR_BASE_URL=https://your-openai-proxy.example.com/v1 \
|
|
30
|
+
-- npx -y @gopersonal/advisor
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Option B: Anthropic endpoint
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
claude mcp add advisor \
|
|
37
|
+
-e ADVISOR_PROVIDER=anthropic \
|
|
38
|
+
-e ADVISOR_MODEL=claude-sonnet-4-5 \
|
|
39
|
+
-e ADVISOR_API_KEY=sk-ant-your-key \
|
|
22
40
|
-- npx -y @gopersonal/advisor
|
|
23
41
|
```
|
|
24
42
|
|
|
25
|
-
|
|
43
|
+
With a custom Anthropic-compatible endpoint:
|
|
26
44
|
|
|
27
45
|
```bash
|
|
28
46
|
claude mcp add advisor \
|
|
29
|
-
-e
|
|
47
|
+
-e ADVISOR_PROVIDER=anthropic \
|
|
48
|
+
-e ADVISOR_MODEL=claude-sonnet-4-5 \
|
|
30
49
|
-e ADVISOR_API_KEY=none \
|
|
31
|
-
-e ADVISOR_BASE_URL=https://your-proxy.example.com \
|
|
50
|
+
-e ADVISOR_BASE_URL=https://your-anthropic-proxy.example.com \
|
|
32
51
|
-- npx -y @gopersonal/advisor
|
|
33
52
|
```
|
|
34
53
|
|
|
54
|
+
### No config (uses your local opencode setup)
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
claude mcp add advisor -- npx -y @gopersonal/advisor
|
|
58
|
+
```
|
|
59
|
+
|
|
35
60
|
## Environment Variables
|
|
36
61
|
|
|
37
62
|
| Variable | Description | Example |
|
|
38
63
|
|---|---|---|
|
|
39
|
-
| `
|
|
64
|
+
| `ADVISOR_PROVIDER` | `openai` or `anthropic` | `openai` |
|
|
65
|
+
| `ADVISOR_MODEL` | Model name | `gpt-4o`, `claude-sonnet-4-5` |
|
|
40
66
|
| `ADVISOR_API_KEY` | API key for the provider | `sk-...` |
|
|
41
|
-
| `ADVISOR_BASE_URL` | Custom base URL (
|
|
42
|
-
| `ADVISOR_NPM` | AI SDK npm package (rare, for non-native providers) | `@ai-sdk/openai-compatible` |
|
|
67
|
+
| `ADVISOR_BASE_URL` | Custom base URL (optional) | `https://proxy.example.com` |
|
|
43
68
|
|
|
44
69
|
If no env vars are set, the advisor connects to a running opencode instance or starts one using your default opencode config.
|
|
45
70
|
|
|
@@ -55,3 +80,45 @@ If no env vars are set, the advisor connects to a running opencode instance or s
|
|
|
55
80
|
|
|
56
81
|
- [OpenCode](https://opencode.ai) installed (`brew install sst/tap/opencode` or `npm i -g opencode`)
|
|
57
82
|
- A configured AI provider (Anthropic, OpenAI, MiniMax, or any of 75+ supported providers)
|
|
83
|
+
|
|
84
|
+
## Development
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cd advisor
|
|
88
|
+
npm install
|
|
89
|
+
npm run build
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Test locally with Claude Code:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
claude mcp add advisor -- node /path/to/advisor/build/index.js
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Publishing to npm
|
|
99
|
+
|
|
100
|
+
1. Login to npm (one-time):
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm login
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
2. Update the version in `package.json`:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm version patch # 1.0.0 -> 1.0.1 (bug fixes)
|
|
110
|
+
npm version minor # 1.0.0 -> 1.1.0 (new features)
|
|
111
|
+
npm version major # 1.0.0 -> 2.0.0 (breaking changes)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
3. Publish:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm publish --access public
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
4. Verify:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npm view @gopersonal/advisor
|
|
124
|
+
```
|
package/build/index.js
CHANGED
|
@@ -7,32 +7,75 @@ import { createOpencode, createOpencodeClient } from "@opencode-ai/sdk/v2";
|
|
|
7
7
|
//
|
|
8
8
|
// Pass these via the "env" field in the MCP config JSON.
|
|
9
9
|
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
10
|
+
// Option A: OpenAI-compatible endpoint (most providers, proxies, etc.)
|
|
11
|
+
// ADVISOR_PROVIDER = "openai"
|
|
12
|
+
// ADVISOR_MODEL = "gpt-4o"
|
|
13
|
+
// ADVISOR_API_KEY = "sk-..."
|
|
14
|
+
// ADVISOR_BASE_URL = "https://api.openai.com/v1"
|
|
12
15
|
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
16
|
+
// Option B: Anthropic-compatible endpoint
|
|
17
|
+
// ADVISOR_PROVIDER = "anthropic"
|
|
18
|
+
// ADVISOR_MODEL = "claude-sonnet-4-5"
|
|
19
|
+
// ADVISOR_API_KEY = "sk-ant-..."
|
|
20
|
+
// ADVISOR_BASE_URL = "https://api.anthropic.com"
|
|
18
21
|
//
|
|
22
|
+
// ADVISOR_BASE_URL is required when using a custom/proxy endpoint.
|
|
23
|
+
// If omitted, the default API URL for the provider is used.
|
|
24
|
+
//
|
|
25
|
+
function resolveProviderAndModel() {
|
|
26
|
+
const explicitProvider = process.env.ADVISOR_PROVIDER?.toLowerCase();
|
|
27
|
+
const rawModel = process.env.ADVISOR_MODEL;
|
|
28
|
+
if (!rawModel)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (explicitProvider) {
|
|
31
|
+
// "openai" provider in opencode uses OpenAI's Responses API which most
|
|
32
|
+
// compatible endpoints don't support. Use @ai-sdk/openai-compatible instead,
|
|
33
|
+
// which calls the standard /v1/chat/completions endpoint.
|
|
34
|
+
if (explicitProvider === "openai") {
|
|
35
|
+
return {
|
|
36
|
+
provider: "openai-compat",
|
|
37
|
+
model: rawModel,
|
|
38
|
+
fullModel: `openai-compat/${rawModel}`,
|
|
39
|
+
npm: "@ai-sdk/openai-compatible",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
provider: explicitProvider,
|
|
44
|
+
model: rawModel,
|
|
45
|
+
fullModel: `${explicitProvider}/${rawModel}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Legacy "provider/model" format in ADVISOR_MODEL
|
|
49
|
+
if (rawModel.includes("/")) {
|
|
50
|
+
const [provider, ...rest] = rawModel.split("/");
|
|
51
|
+
return {
|
|
52
|
+
provider,
|
|
53
|
+
model: rest.join("/"),
|
|
54
|
+
fullModel: rawModel,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Just a model name with no provider — use openai-compatible
|
|
58
|
+
return {
|
|
59
|
+
provider: "openai-compat",
|
|
60
|
+
model: rawModel,
|
|
61
|
+
fullModel: `openai-compat/${rawModel}`,
|
|
62
|
+
npm: "@ai-sdk/openai-compatible",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
19
65
|
function buildOpencodeConfig() {
|
|
20
|
-
const
|
|
66
|
+
const resolved = resolveProviderAndModel();
|
|
21
67
|
const apiKey = process.env.ADVISOR_API_KEY;
|
|
22
68
|
const baseURL = process.env.ADVISOR_BASE_URL;
|
|
23
|
-
const npm = process.env.ADVISOR_NPM;
|
|
69
|
+
const npm = process.env.ADVISOR_NPM || resolved?.npm;
|
|
24
70
|
const config = {
|
|
25
71
|
// Disable title generation (it uses small_model which may not work with custom providers)
|
|
26
|
-
small_model:
|
|
72
|
+
small_model: resolved?.fullModel || undefined,
|
|
27
73
|
};
|
|
28
|
-
if (
|
|
29
|
-
config.model =
|
|
30
|
-
console.error(`[advisor] Model: ${model}`);
|
|
74
|
+
if (resolved) {
|
|
75
|
+
config.model = resolved.fullModel;
|
|
76
|
+
console.error(`[advisor] Provider: ${resolved.provider}, Model: ${resolved.model}`);
|
|
31
77
|
}
|
|
32
|
-
|
|
33
|
-
const providerId = model?.split("/")[0];
|
|
34
|
-
const modelId = model?.split("/").slice(1).join("/");
|
|
35
|
-
if (providerId && (apiKey || baseURL || npm)) {
|
|
78
|
+
if (resolved && (apiKey || baseURL || npm)) {
|
|
36
79
|
const options = {};
|
|
37
80
|
if (apiKey)
|
|
38
81
|
options.apiKey = apiKey;
|
|
@@ -42,21 +85,19 @@ function buildOpencodeConfig() {
|
|
|
42
85
|
if (npm)
|
|
43
86
|
providerConfig.npm = npm;
|
|
44
87
|
// Register the model so opencode knows its capabilities
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
config.provider = { [providerId]: providerConfig };
|
|
88
|
+
providerConfig.models = {
|
|
89
|
+
[resolved.model]: {
|
|
90
|
+
name: resolved.model,
|
|
91
|
+
tool_call: true,
|
|
92
|
+
attachment: false,
|
|
93
|
+
reasoning: false,
|
|
94
|
+
temperature: false, // many proxies don't support temperature
|
|
95
|
+
limit: { context: 200000, output: 16384 },
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
config.provider = { [resolved.provider]: providerConfig };
|
|
58
99
|
if (baseURL)
|
|
59
|
-
console.error(`[advisor]
|
|
100
|
+
console.error(`[advisor] Base URL: ${baseURL}`);
|
|
60
101
|
}
|
|
61
102
|
return config;
|
|
62
103
|
}
|
|
@@ -109,13 +150,12 @@ async function getOpencodeClient() {
|
|
|
109
150
|
`Make sure opencode is installed (https://opencode.ai) and configured with a provider.`);
|
|
110
151
|
}
|
|
111
152
|
}
|
|
112
|
-
// Model override for session prompts
|
|
153
|
+
// Model override for session prompts
|
|
113
154
|
function getModelOverride() {
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
155
|
+
const resolved = resolveProviderAndModel();
|
|
156
|
+
if (!resolved)
|
|
116
157
|
return undefined;
|
|
117
|
-
|
|
118
|
-
return { providerID, modelID: rest.join("/") };
|
|
158
|
+
return { providerID: resolved.provider, modelID: resolved.model };
|
|
119
159
|
}
|
|
120
160
|
function sleep(ms) {
|
|
121
161
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gopersonal/advisor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
"prepublishOnly": "npm run build",
|
|
16
16
|
"start": "node build/index.js"
|
|
17
17
|
},
|
|
18
|
-
"keywords": [
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"advisor",
|
|
21
|
+
"opencode",
|
|
22
|
+
"ai",
|
|
23
|
+
"model-context-protocol"
|
|
24
|
+
],
|
|
19
25
|
"author": "gopersonal",
|
|
20
26
|
"license": "ISC",
|
|
21
27
|
"description": "MCP server that gives AI agents a second opinion via OpenCode SDK",
|