@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.
Files changed (3) hide show
  1. package/README.md +76 -9
  2. package/build/index.js +76 -36
  3. 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 -- npx -y @gopersonal/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
- ### With a custom provider
22
+ With a custom OpenAI-compatible endpoint:
17
23
 
18
24
  ```bash
19
25
  claude mcp add advisor \
20
- -e ADVISOR_MODEL=anthropic/claude-sonnet-4-5 \
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
- ### With a proxy endpoint
43
+ With a custom Anthropic-compatible endpoint:
26
44
 
27
45
  ```bash
28
46
  claude mcp add advisor \
29
- -e ADVISOR_MODEL=anthropic/gpt-5.2-codex \
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
- | `ADVISOR_MODEL` | Model in `provider/model` format | `anthropic/claude-sonnet-4-5` |
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 (proxies, etc.) | `https://proxy.example.com` |
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
- // OpenCode natively supports 75+ providers (Anthropic, OpenAI, MiniMax, etc.)
11
- // so most of the time you just need ADVISOR_MODEL and ADVISOR_API_KEY.
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
- // ADVISOR_MODEL - model in "provider/model" format, e.g. "anthropic/claude-sonnet-4-5"
14
- // or "openai/gpt-5.2-codex" or "minimax/minimax-m2.5"
15
- // ADVISOR_API_KEY - API key for the provider (optional if already set in opencode)
16
- // ADVISOR_BASE_URL - custom base URL override (optional, for proxies or custom endpoints)
17
- // ADVISOR_NPM - AI SDK npm package (optional, only for non-native providers)
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 model = process.env.ADVISOR_MODEL;
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: model || undefined,
72
+ small_model: resolved?.fullModel || undefined,
27
73
  };
28
- if (model) {
29
- config.model = 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
- // Extract provider id and model name (e.g. "anthropic" + "gpt-5.2-codex")
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
- if (modelId) {
46
- providerConfig.models = {
47
- [modelId]: {
48
- name: modelId,
49
- tool_call: true,
50
- attachment: false,
51
- reasoning: false,
52
- temperature: false, // many proxies don't support temperature
53
- limit: { context: 200000, output: 16384 },
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] Custom base URL: ${baseURL}`);
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 (from ADVISOR_MODEL env var)
153
+ // Model override for session prompts
113
154
  function getModelOverride() {
114
- const model = process.env.ADVISOR_MODEL;
115
- if (!model || !model.includes("/"))
155
+ const resolved = resolveProviderAndModel();
156
+ if (!resolved)
116
157
  return undefined;
117
- const [providerID, ...rest] = model.split("/");
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.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": ["mcp", "advisor", "opencode", "ai", "model-context-protocol"],
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",