converse-mcp-server 4.4.0 → 4.5.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/.env.example CHANGED
@@ -47,6 +47,9 @@ DEEPSEEK_API_KEY=your_deepseek_api_key_here
47
47
  # append :online to a slug to opt into web search (adds a real per-request cost).
48
48
  OPENROUTER_API_KEY=your_openrouter_api_key_here
49
49
 
50
+ # Get your abliteration.ai API key (ak_...) from: https://abliteration.ai/console/api-keys
51
+ ABLITERATION_API_KEY=your_abliteration_api_key_here
52
+
50
53
  # Optional: referer and title for OpenRouter ranking credit (both optional; omitting is valid)
51
54
  # OPENROUTER_REFERER=https://github.com/FallDownTheSystem/converse
52
55
  # OPENROUTER_TITLE=Converse
@@ -102,6 +105,7 @@ TYPESAFE_API_KEY=your_typesafe_api_key_here
102
105
  # MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
103
106
  # DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
104
107
  # OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug
108
+ # ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
105
109
 
106
110
  # ============================================
107
111
  # Server Configuration
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/converse-mcp-server.svg)](https://www.npmjs.com/package/converse-mcp-server)
4
4
 
5
- An MCP (Model Context Protocol) server that lets Claude talk to other AI models. Use it to chat with models from OpenAI, Google, Anthropic, X.AI, Mistral, DeepSeek, or OpenRouter. You can either talk to one model at a time or get multiple models to weigh in on complex decisions.
5
+ An MCP (Model Context Protocol) server that lets Claude talk to other AI models. Use it to chat with models from OpenAI, Google, Anthropic, X.AI, Mistral, DeepSeek, OpenRouter, or Abliteration. You can either talk to one model at a time or get multiple models to weigh in on complex decisions.
6
6
 
7
7
  ## 📋 Requirements
8
8
 
@@ -25,6 +25,7 @@ You need at least one API key from these providers:
25
25
  | **Mistral** | [console.mistral.ai](https://console.mistral.ai/) | `wfBMkWL0...` |
26
26
  | **DeepSeek** | [platform.deepseek.com](https://platform.deepseek.com/) | `sk-...` |
27
27
  | **OpenRouter** | [openrouter.ai/keys](https://openrouter.ai/keys) | `sk-or-...` |
28
+ | **Abliteration** | [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys) | `ak_...` |
28
29
  | **Codex** | ChatGPT login (system-wide) | Local agentic assistant |
29
30
 
30
31
  **Note:** Codex uses your ChatGPT login (not an API key). If you have an active ChatGPT session, Codex will work automatically. For headless/server deployments, set `CODEX_API_KEY` in your environment.
@@ -43,6 +44,7 @@ claude mcp add converse \
43
44
  -e MISTRAL_API_KEY=your_key_here \
44
45
  -e DEEPSEEK_API_KEY=your_key_here \
45
46
  -e OPENROUTER_API_KEY=your_key_here \
47
+ -e ABLITERATION_API_KEY=ak_your_key_here \
46
48
  -e ENABLE_RESPONSE_SUMMARIZATION=true \
47
49
  -e SUMMARIZATION_MODEL=gpt-5-nano \
48
50
  -s user \
@@ -67,6 +69,7 @@ Add this configuration to your Claude Desktop settings:
67
69
  "MISTRAL_API_KEY": "your_key_here",
68
70
  "DEEPSEEK_API_KEY": "your_key_here",
69
71
  "OPENROUTER_API_KEY": "your_key_here",
72
+ "ABLITERATION_API_KEY": "ak_your_key_here",
70
73
  "ENABLE_RESPONSE_SUMMARIZATION": "true",
71
74
  "SUMMARIZATION_MODEL": "gpt-5-nano"
72
75
  }
@@ -304,6 +307,16 @@ Thinking mode maps `reasoning_effort` to `none` (off), `high` (enabled levels up
304
307
 
305
308
  Any other model works via its full `provider/model` slug or the `openrouter:` namespace — no extra configuration. Append `:online` to a slug to opt into web search (adds a real per-request cost).
306
309
 
310
+ ### Abliteration Models
311
+
312
+ Abliteration provides uncensored ("abliterated") reasoning models through its OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`; see [its documentation](https://docs.abliteration.ai). Use the `abliteration` or `ablit` namespace; set `ABLITERATION_DEFAULT_MODEL` to override the default. Web search is not supported.
313
+
314
+ - **abliterated-model-large-v2** (default; aliases: `abliterated-large`, `abliterated-large-v2`): GLM-5.3-derived, text-only (1M context, 999,990 max output)
315
+ - **abliterated-model-large** (alias: `abliterated-large-v1`): Previous large model, GLM-5.2-derived, text-only (1M context, 999,990 max output)
316
+ - **abliterated-model** (aliases: `abliterated`, `abliterated-base`): Multimodal with image input (256K context, 262,134 max output)
317
+
318
+ All models reason by default and return reasoning traces (`reasoning_content`), streamed as thinking. `reasoning_effort` is clamped to each model's supported levels: large-v2 runs `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`); large runs `high`/`max` and can disable (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`); base accepts every level, with `none` disabling reasoning. Only `abliterated-model` accepts images; image requests to the text-only large models are rejected before sending.
319
+
307
320
  ### Codex Models
308
321
 
309
322
  OpenAI Codex agentic coding assistant. `codex` uses its default model (GPT-6 Astra, or `CODEX_DEFAULT_MODEL`); `codex:<model>` picks one (e.g. `codex:luna`, `codex:astra`, `codex:gpt-5.6-terra`):
@@ -369,6 +382,7 @@ ANTHROPIC_API_KEY=sk-ant-your_anthropic_key_here
369
382
  MISTRAL_API_KEY=your_mistral_key_here
370
383
  DEEPSEEK_API_KEY=your_deepseek_key_here
371
384
  OPENROUTER_API_KEY=sk-or-your_openrouter_key_here
385
+ ABLITERATION_API_KEY=ak_your_key_here
372
386
 
373
387
  # Optional: Server configuration
374
388
  PORT=3157
@@ -402,6 +416,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
402
416
  MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
403
417
  DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
404
418
  OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
419
+ ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
405
420
  ```
406
421
 
407
422
  ### Configuration Options
@@ -506,6 +521,7 @@ Provider priority order (subscription-based local providers first, then API-key
506
521
  9. Mistral (`mistral` → Mistral Medium 3.5)
507
522
  10. DeepSeek (`deepseek` → DeepSeek V4 Pro)
508
523
  11. OpenRouter (`openrouter` → GLM 5.2)
524
+ 12. Abliteration (`abliteration` / `ablit` → `abliterated-model-large-v2`)
509
525
 
510
526
  **Local agent permissions:** Bare model names and `auto` reach the local agent providers whenever they are set up, not only when named explicitly. The Antigravity CLI runs `agy` with `--dangerously-skip-permissions` because headless calls cannot prompt for tool approval — every tool request is auto-approved, including shell commands and file writes. The Claude Agent SDK runs with `bypassPermissions`. Codex uses `CODEX_SANDBOX_MODE` (read-only by default). A read-only prompt is not an enforced security boundary for these providers, so use them only with trusted prompts and context. To keep a request on a plain API, name the provider: `google:pro`, `anthropic:opus`, `openai:gpt-6-astra`.
511
527
 
@@ -532,7 +548,8 @@ If you've cloned the repository locally:
532
548
  "ANTHROPIC_API_KEY": "your_key_here",
533
549
  "MISTRAL_API_KEY": "your_key_here",
534
550
  "DEEPSEEK_API_KEY": "your_key_here",
535
- "OPENROUTER_API_KEY": "your_key_here"
551
+ "OPENROUTER_API_KEY": "your_key_here",
552
+ "ABLITERATION_API_KEY": "ak_your_key_here"
536
553
  }
537
554
  }
538
555
  }
@@ -747,6 +764,7 @@ converse/
747
764
  │ │ ├── mistral.js # Mistral AI provider
748
765
  │ │ ├── deepseek.js # DeepSeek provider
749
766
  │ │ ├── openrouter.js # OpenRouter provider
767
+ │ │ ├── abliteration.js # Abliteration provider
750
768
  │ │ ├── openrouter-discovery.js # Request-local OpenRouter slug discovery
751
769
  │ │ ├── openai-compatible.js # Base for OpenAI-compatible APIs
752
770
  │ │ ├── codex.js # Codex agentic SDK provider
package/docs/API.md CHANGED
@@ -564,6 +564,16 @@ Models with adaptive thinking control depth via `reasoning_effort`, which is pas
564
564
 
565
565
  Any other model works via its full `provider/model` slug (e.g. `anthropic/claude-sonnet-5`) or the `openrouter:` namespace. Append `:online` to a slug (e.g. `z-ai/glm-5.2:online`) to opt into web search, which adds a real per-request cost.
566
566
 
567
+ ### Abliteration Models
568
+
569
+ | Model | Aliases | Context | Output | Notes |
570
+ |-------|---------|---------|--------|-------|
571
+ | `abliterated-model-large-v2` | `abliterated-large`, `abliterated-large-v2` | 1M | 999,990 | Default; GLM-5.3-derived, text-only |
572
+ | `abliterated-model-large` | `abliterated-large-v1` | 1M | 999,990 | Previous large model, GLM-5.2-derived, text-only |
573
+ | `abliterated-model` | `abliterated`, `abliterated-base` | 256K | 262,134 | Multimodal, image input |
574
+
575
+ All three are uncensored ("abliterated") reasoning models using Abliteration's OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`. Get an API key at [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys); docs: [docs.abliteration.ai](https://docs.abliteration.ai). Route with the `abliteration:` namespace (canonical) or `ablit:`. All reason by default and return `reasoning_content`, streamed as thinking. `reasoning_effort` is clamped to each model's supported levels: large-v2 runs `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`); large runs `high`/`max` and can disable (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`); base accepts every level, with `none` disabling reasoning. Only `abliterated-model` accepts images; image requests to the text-only large models are rejected before sending. Web search is not supported.
576
+
567
577
  ### Codex (agentic, local)
568
578
 
569
579
  **Codex** is an agentic coding assistant with direct filesystem access:
@@ -632,9 +642,9 @@ Reach these only with the `copilot:` namespace (also `github-copilot:`, `copilot
632
642
  Every entry in `models` takes one of four forms:
633
643
 
634
644
  - **`auto`** — the first available provider's default model.
635
- - **`provider`** — that provider's default model (hardcoded, or `<PROVIDER>_DEFAULT_MODEL`). Namespaces: `codex`; `gemini`/`agy`/`antigravity`/`gemini-cli` (Antigravity CLI); `claude`/`claude-code`/`claude-sdk` (Claude Agent SDK); `copilot`/`github-copilot`/`copilot-sdk`; `openai`; `google`; `xai`; `anthropic`; `mistral`; `deepseek`; `openrouter`.
645
+ - **`provider`** — that provider's default model (hardcoded, or `<PROVIDER>_DEFAULT_MODEL`). Namespaces: `codex`; `gemini`/`agy`/`antigravity`/`gemini-cli` (Antigravity CLI); `claude`/`claude-code`/`claude-sdk` (Claude Agent SDK); `copilot`/`github-copilot`/`copilot-sdk`; `openai`; `google`; `xai`; `anthropic`; `mistral`; `deepseek`; `openrouter`; `abliteration`; `ablit`.
636
646
  - **`provider:model`** — that model on that provider only; the model must be in that provider's list.
637
- - **Bare `model`** — the first provider, in the order `codex`, `gemini-cli`, `claude`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, whose list contains the ID or alias and that is set up (API key for API providers; SDK plus login for Codex and the Claude Agent SDK; the `agy` binary for Antigravity). On an authentication or availability error, the next set-up provider serving **the same model** takes over; a provider whose alias points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API). Copilot never serves bare names.
647
+ - **Bare `model`** — the first provider, in the order `codex`, `gemini-cli`, `claude`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`, whose list contains the ID or alias and that is set up (API key for API providers; SDK plus login for Codex and the Claude Agent SDK; the `agy` binary for Antigravity). On an authentication or availability error, the next set-up provider serving **the same model** takes over; a provider whose alias points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API). Copilot never serves bare names.
638
648
 
639
649
  **Unknown names are rejected**, never forwarded: the error lists up to three close matches, e.g. `Unknown model "gtp-6-astra". Did you mean: gpt-6-astra?` or `Unknown openai model "spark" in "openai:spark". Did you mean: codex:spark?`. The exception is OpenRouter: a full `vendor/model` slug (bare or `openrouter:`) is validated against OpenRouter's live catalog.
640
650
 
@@ -650,6 +660,7 @@ Every entry in `models` takes one of four forms:
650
660
  "mistral" // Mistral (-> mistral-medium-3-5)
651
661
  "z-ai/glm-5.2" // OpenRouter (full slug)
652
662
  "z-ai/glm-5.2:online" // OpenRouter with web search opt-in
663
+ "ablit" // Abliteration (-> abliterated-model-large-v2)
653
664
  "fable" // Claude Agent SDK (-> claude-fable-5-1) when set up, otherwise Anthropic API (-> claude-fable-5)
654
665
  "opus" // Claude Agent SDK (-> claude-opus-5-5), else Anthropic API
655
666
  "anthropic:opus" // Anthropic API only
@@ -666,7 +677,7 @@ Every entry in `models` takes one of four forms:
666
677
  - **chat mode**: `["auto"]` selects the first available provider and uses its default model, with failover to the next provider on error.
667
678
  - **consensus mode**: `["auto"]` expands to the first 3 available providers.
668
679
 
669
- Provider auto-selection priority (subscription-based CLI/SDK providers first, then API-key providers): `codex`, `gemini-cli`, `claude`, `copilot`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`.
680
+ Provider auto-selection priority (subscription-based CLI/SDK providers first, then API-key providers): `codex`, `gemini-cli`, `claude`, `copilot`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`.
670
681
 
671
682
  ## Configuration
672
683
 
@@ -714,6 +725,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
714
725
  MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
715
726
  DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
716
727
  OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
728
+ ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
717
729
  ```
718
730
 
719
731
  ## Context Processing
@@ -822,6 +834,7 @@ ANTHROPIC_API_KEY=sk-ant-...
822
834
  MISTRAL_API_KEY=...
823
835
  DEEPSEEK_API_KEY=...
824
836
  OPENROUTER_API_KEY=sk-or-...
837
+ ABLITERATION_API_KEY=ak_...
825
838
  TYPESAFE_API_KEY=... # decide tool only
826
839
  ```
827
840
 
package/docs/PROVIDERS.md CHANGED
@@ -99,6 +99,17 @@ This guide documents all supported AI providers in the Converse MCP Server and t
99
99
  - **Reasoning**: Per-model. `z-ai/glm-5.2` and the `deepseek/deepseek-v4-*` slugs are effort-tiered (`max` → `xhigh`, other enabled levels → `high`, `none` disables); `qwen/qwen3.7-*` and `moonshotai/kimi-k2.6` are enable/disable only (`none` disables, any other level enables); `moonshotai/kimi-k2.7-code` always reasons and cannot be disabled; `openrouter/auto` lets the router choose.
100
100
  - **Web search (opt-in, adds cost)**: OpenRouter web search is off by default because it incurs a real per-request charge. Enable it explicitly by appending `:online` to a slug (e.g. `z-ai/glm-5.2:online` or `openrouter:qwen/qwen3.7-max:online`). When enabled, `annotations[].url_citation` citations are captured into metadata. Ordinary requests never attach a web-search plugin.
101
101
 
102
+ ### Abliteration
103
+ - **API Key Format**: `ak_...`
104
+ - **Get Key**: [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys) ([documentation](https://docs.abliteration.ai))
105
+ - **Environment Variable**: `ABLITERATION_API_KEY`
106
+ - **API**: OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`
107
+ - **Supported Models**:
108
+ - `abliterated-model-large-v2` (default; aliases: `abliterated-large`, `abliterated-large-v2`) - Uncensored, GLM-5.3-derived reasoning model, text-only (1M context, 999,990 max output)
109
+ - `abliterated-model-large` (alias: `abliterated-large-v1`) - Previous large model, GLM-5.2-derived, text-only (1M context, 999,990 max output)
110
+ - `abliterated-model` (aliases: `abliterated`, `abliterated-base`) - Multimodal with image input (256K context, 262,134 max output)
111
+ - **Reasoning**: All models reason by default and return `reasoning_content`, streamed as thinking. The large-v2 model supports `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`). The large model supports `high`/`max` and can disable reasoning (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`). The base model accepts every level, with `none` disabling reasoning.
112
+
102
113
  ### Codex
103
114
  - **API Key Format**: Optional (uses ChatGPT login by default)
104
115
  - **Authentication**: ChatGPT login (system-wide) OR `CODEX_API_KEY`
@@ -265,6 +276,7 @@ DEEPSEEK_API_KEY=your_deepseek_key_here
265
276
 
266
277
  # OpenRouter needs only an API key; any provider/model slug works directly
267
278
  OPENROUTER_API_KEY=sk-or-your_key_here
279
+ ABLITERATION_API_KEY=ak_your_key_here
268
280
  # Optional: referer and title for OpenRouter ranking credit
269
281
  OPENROUTER_REFERER=https://github.com/YourUsername/YourApp
270
282
  OPENROUTER_TITLE=Converse
@@ -292,6 +304,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
292
304
  MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
293
305
  DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
294
306
  OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
307
+ ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
295
308
  ```
296
309
 
297
310
  ### Claude Configuration (claude_desktop_config.json)
@@ -307,6 +320,7 @@ OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
307
320
  "MISTRAL_API_KEY": "your_key_here",
308
321
  "DEEPSEEK_API_KEY": "your_key_here",
309
322
  "OPENROUTER_API_KEY": "your_key_here",
323
+ "ABLITERATION_API_KEY": "ak_your_key_here",
310
324
  "OPENROUTER_REFERER": "https://github.com/YourUsername/YourApp",
311
325
  "OPENROUTER_TITLE": "Converse"
312
326
  }
@@ -324,12 +338,13 @@ All providers support streaming responses for real-time output.
324
338
  - **Full Support**: OpenAI, Google, X.AI (Grok 4.5), Anthropic (Claude-4 series, Claude-3-Opus)
325
339
  - **Mistral**: `mistral-medium-3-5` and `mistral-small-2603` accept images; `mistral-large-2512` is text-only
326
340
  - **Via OpenRouter**: Depends on the model — `qwen/qwen3.7-plus`, `moonshotai/kimi-k2.7-code`, and `moonshotai/kimi-k2.6` accept images; `z-ai/glm-5.2` and the `deepseek/deepseek-v4-*` slugs are text-only
341
+ - **Abliteration**: Only `abliterated-model` accepts images; both large models are text-only, and image requests to them are rejected before sending
327
342
  - **No Support**: DeepSeek (native), Codex
328
343
 
329
344
  ### Web Search
330
345
  - **Automatic where supported**: OpenAI, Google, and X.AI (Grok 4.5, via Agent Tools) attach web search on every request for capable models; the model decides whether to use it
331
346
  - **OpenRouter (opt-in, adds cost)**: Off by default; append `:online` to a slug to enable it per request (real per-request charge), with citations captured into metadata
332
- - **No Support**: Anthropic, Mistral, DeepSeek, Codex
347
+ - **No Support**: Anthropic, Mistral, DeepSeek, Codex, Abliteration
333
348
 
334
349
  ### Thinking/Reasoning Modes
335
350
  - **OpenAI**: GPT-5 family and O3 series models support the `reasoning_effort` parameter (GPT-5.6 accepts `none` through `max`, mapping `minimal` to `low`; GPT-5 Pro is fixed at `high`)
@@ -341,6 +356,7 @@ All providers support streaming responses for real-time output.
341
356
  - **Mistral**: `mistral-medium-3-5` and `mistral-small-2603` map `reasoning_effort` to `high` (enabled) or `none` (disabled); `mistral-large-2512` has no adjustable reasoning
342
357
  - **DeepSeek**: V4 models use thinking mode via `reasoning_effort` (`none` disables; enabled levels use `high`, `max` uses `max`)
343
358
  - **OpenRouter**: Reasoning is per-model (effort-tiered, enable/disable-only, mandatory, or router-chosen — see the OpenRouter section)
359
+ - **Abliteration**: All models reason by default and return reasoning traces (`reasoning_content`), streamed as thinking; see the Abliteration section for `reasoning_effort` clamping
344
360
  - **Codex**: Thread-based agentic reasoning with persistent context
345
361
  - **Others**: Standard inference only
346
362
 
@@ -362,11 +378,11 @@ Routing is derived entirely from each provider's model list (canonical IDs plus
362
378
  - `gemini`, `agy`, `antigravity`, `gemini-cli` → Gemini via Antigravity CLI
363
379
  - `claude`, `claude-code`, `claude-sdk` → Claude Agent SDK
364
380
  - `copilot`, `github-copilot`, `copilot-sdk` → Copilot SDK
365
- - `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter` → the matching API provider
381
+ - `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`, `ablit` → the matching API provider
366
382
 
367
383
  2. **`provider:model`** — that model on that provider only (e.g. `codex:astra`, `gemini:pro`, `google:pro`, `anthropic:opus`, `copilot:sonnet`). The model must be in that provider's list; there is no failover to another provider.
368
384
 
369
- 3. **Bare `model`** — an ID or alias without a namespace goes to the first provider, in this order, whose list contains the name and that is set up: Codex, Antigravity CLI, Claude Agent SDK, OpenAI, Google, X.AI, Anthropic, Mistral, DeepSeek, OpenRouter.
385
+ 3. **Bare `model`** — an ID or alias without a namespace goes to the first provider, in this order, whose list contains the name and that is set up: Codex, Antigravity CLI, Claude Agent SDK, OpenAI, Google, X.AI, Anthropic, Mistral, DeepSeek, OpenRouter, Abliteration.
370
386
  - "Set up" means an API key for API providers; for Codex, the SDK plus a login file or `CODEX_API_KEY`; for the Claude Agent SDK, the SDK plus a login file, a macOS login, or `CLAUDE_CODE_OAUTH_TOKEN`/`ANTHROPIC_API_KEY`; for Antigravity, the `agy` binary.
371
387
  - If that provider fails with an authentication or availability error (including an expired login, which is only detected at call time), the next set-up provider that serves **the same model** takes over. A provider whose alias of that name points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API; bare `flash` is Gemini 3.8 Flash on Antigravity and Gemini 2.5 Flash on the Google API).
372
388
  - Copilot never serves bare names; use `copilot:<model>`.
@@ -400,6 +416,7 @@ Examples:
400
416
  "z-ai/glm-5.2:online" // OpenRouter with web search opt-in
401
417
  "anthropic/claude-sonnet-5" // OpenRouter (any full slug routes as-is)
402
418
  "openrouter/auto" // OpenRouter auto-selection
419
+ "ablit" // Abliteration default model (abliterated-model-large-v2)
403
420
  ```
404
421
 
405
422
  ```json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "converse-mcp-server",
3
- "version": "4.4.0",
3
+ "version": "4.5.0",
4
4
  "description": "Converse MCP Server - Converse with other LLMs with chat and consensus tools",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -93,20 +93,20 @@
93
93
  ".env.example"
94
94
  ],
95
95
  "dependencies": {
96
- "@anthropic-ai/claude-agent-sdk": "^0.3.284",
96
+ "@anthropic-ai/claude-agent-sdk": "^0.3.285",
97
97
  "@anthropic-ai/sdk": "^0.129.0",
98
98
  "@github/copilot-sdk": "^1.0.15",
99
99
  "@google/genai": "^2.24.0",
100
100
  "@lydell/node-pty": "1.2.0-beta.15",
101
101
  "@mistralai/mistralai": "^2.7.0",
102
102
  "@modelcontextprotocol/sdk": "^1.31.0",
103
- "@openai/codex-sdk": "^0.159.0",
103
+ "@openai/codex-sdk": "^0.159.2",
104
104
  "cors": "^2.8.6",
105
105
  "dotenv": "^18.0.4",
106
106
  "express": "^5.2.1",
107
107
  "lru-cache": "^11.5.3",
108
108
  "nanoid": "^6.0.1",
109
- "openai": "^7.23.0",
109
+ "openai": "^7.25.0",
110
110
  "p-limit": "^7.3.3",
111
111
  "vite": "^8.3.1"
112
112
  },
@@ -9,7 +9,7 @@
9
9
  * - error: Error event with recovery information
10
10
  *
11
11
  * This normalizer enables seamless provider switching and uniform async processing
12
- * across all supported LLM providers (OpenAI, Google, XAI, Anthropic, Mistral, DeepSeek, OpenRouter).
12
+ * across all supported LLM providers (OpenAI, Google, XAI, Anthropic, Mistral, DeepSeek, OpenRouter, Abliteration).
13
13
  */
14
14
 
15
15
  import { debugLog, debugError } from '../utils/console.js';
@@ -40,8 +40,11 @@ class ProviderStreamNormalizer {
40
40
  google: this.normalizeGoogleStream.bind(this),
41
41
  anthropic: this.normalizeAnthropicStream.bind(this),
42
42
  mistral: this.normalizeMistralStream.bind(this),
43
- deepseek: this.normalizeDeepSeekStream.bind(this),
43
+ deepseek: (stream, context) =>
44
+ this.normalizeChatCompletionsStream(stream, context, 'deepseek'),
44
45
  openrouter: this.normalizeOpenRouterStream.bind(this),
46
+ abliteration: (stream, context) =>
47
+ this.normalizeChatCompletionsStream(stream, context, 'abliteration'),
45
48
  codex: this.normalizeCodexStream.bind(this),
46
49
  copilot: this.normalizePassthroughStream.bind(this),
47
50
  claude: this.normalizePassthroughStream.bind(this),
@@ -507,10 +510,11 @@ class ProviderStreamNormalizer {
507
510
  }
508
511
 
509
512
  /**
510
- * Normalize DeepSeek streaming format
513
+ * Normalize the event stream of a provider built on the shared
514
+ * OpenAI-compatible Chat Completions base (DeepSeek, Abliteration), where
515
+ * streamed `reasoning_content` arrives as separate thinking events.
511
516
  */
512
- async *normalizeDeepSeekStream(stream, context) {
513
- const provider = 'deepseek';
517
+ async *normalizeChatCompletionsStream(stream, context, provider) {
514
518
  const model = context.model || 'unknown';
515
519
  const startTime = Date.now();
516
520
 
@@ -530,7 +534,7 @@ class ProviderStreamNormalizer {
530
534
  continue;
531
535
  }
532
536
 
533
- // Handle delta events (including reasoning tokens for DeepSeek-R1)
537
+ // Handle delta events
534
538
  if (event.type === 'delta') {
535
539
  accumulatedContent += event.content || '';
536
540
  yield this.createDeltaEvent(event.content || '', provider, model, {
@@ -546,7 +550,7 @@ class ProviderStreamNormalizer {
546
550
  continue;
547
551
  }
548
552
 
549
- // Handle usage events (with DeepSeek-specific reasoning tokens)
553
+ // Handle usage events (with reasoning token counts when reported)
550
554
  if (event.type === 'usage') {
551
555
  accumulatedUsage = event.usage;
552
556
  if (event.usage.reasoning_tokens) {
@@ -590,7 +594,7 @@ class ProviderStreamNormalizer {
590
594
  }
591
595
  }
592
596
  } catch (error) {
593
- debugError('[StreamNormalizer] DeepSeek stream error:', error);
597
+ debugError(`[StreamNormalizer] ${provider} stream error:`, error);
594
598
  yield this.createErrorEvent(error, provider);
595
599
  throw error;
596
600
  }
package/src/config.js CHANGED
@@ -214,6 +214,12 @@ const CONFIG_SCHEMA = {
214
214
  secret: true,
215
215
  description: 'OpenRouter API key',
216
216
  },
217
+ ABLITERATION_API_KEY: {
218
+ type: 'string',
219
+ required: false,
220
+ secret: true,
221
+ description: 'abliteration.ai API key',
222
+ },
217
223
  TYPESAFE_API_KEY: {
218
224
  type: 'string',
219
225
  required: false,
@@ -438,6 +444,8 @@ function validateApiKeyFormat(provider, apiKey) {
438
444
  return apiKey.length >= 32; // DeepSeek keys are typically 32+ chars
439
445
  case 'openrouter':
440
446
  return apiKey.startsWith('sk-or-') && apiKey.length >= 40;
447
+ case 'abliteration':
448
+ return apiKey.startsWith('ak_') && apiKey.length > 10;
441
449
  default:
442
450
  return apiKey.length >= 10; // Basic minimum length check
443
451
  }
@@ -713,7 +721,7 @@ export async function loadConfig() {
713
721
 
714
722
  if (availableKeys.length === 0 && !hasVertexAI && !hasSdkProvider) {
715
723
  errors.push(
716
- 'At least one API key must be configured: OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY, or TYPESAFE_API_KEY. Alternatively, configure Google Vertex AI or use an SDK-based provider (codex, claude, copilot) or the Antigravity CLI (gemini-cli).',
724
+ 'At least one API key must be configured: OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY, ABLITERATION_API_KEY, or TYPESAFE_API_KEY. Alternatively, configure Google Vertex AI or use an SDK-based provider (codex, claude, copilot) or the Antigravity CLI (gemini-cli).',
717
725
  );
718
726
  }
719
727
 
@@ -374,6 +374,7 @@ export function generateHelpContent(config = null) {
374
374
  mistral: providers.mistral?.getSupportedModels() || {},
375
375
  deepseek: providers.deepseek?.getSupportedModels() || {},
376
376
  openrouter: providers.openrouter?.getSupportedModels() || {},
377
+ abliteration: providers.abliteration?.getSupportedModels() || {},
377
378
  // CLI providers - use safeGetModels (may throw if CLI not installed)
378
379
  codex: safeGetModels(providers.codex, 'codex'),
379
380
  claude: safeGetModels(providers.claude, 'claude'),
@@ -487,6 +488,7 @@ ${formatProviderModels('Anthropic', allModels.anthropic)}
487
488
  ${formatProviderModels('Mistral', allModels.mistral)}
488
489
  ${formatProviderModels('DeepSeek', allModels.deepseek)}
489
490
  ${formatProviderModels('OpenRouter', allModels.openrouter)}
491
+ ${formatProviderModels('Abliteration', allModels.abliteration)}
490
492
  ${formatProviderModels('Codex', allModels.codex)}
491
493
  ${formatProviderModels('Claude CLI', allModels.claude)}
492
494
  ${formatProviderModels('Gemini (Antigravity CLI)', allModels['gemini-cli'])}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Abliteration Provider
3
+ *
4
+ * Provider implementation for abliteration.ai models using its OpenAI-compatible
5
+ * Chat Completions API.
6
+ * Implements the unified interface: async invoke(messages, options) => { content, stop_reason, rawResponse }
7
+ *
8
+ * Chat Completions is used rather than the Responses surface: abliteration.ai's
9
+ * /v1/responses is stateless (no previous_response_id to gain from), rejects
10
+ * `max` effort on the base model, while Chat Completions accepts every effort
11
+ * tier on all models and returns the trace as `reasoning_content`, which the
12
+ * shared OpenAI-compatible base already surfaces.
13
+ */
14
+
15
+ import { createOpenAICompatibleProvider } from './openai-compatible.js';
16
+ import { debugLog } from '../utils/console.js';
17
+ import {
18
+ clampReasoningEffort,
19
+ EFFORT_LADDER,
20
+ } from '../utils/reasoningEffort.js';
21
+
22
+ // All three models always reason by default. `reasoningTiers` lists the
23
+ // distinct depths each model actually runs; the API accepts the whole ladder
24
+ // but silently collapses it onto these, so clamping here keeps the requested
25
+ // tier and the tier that runs in agreement.
26
+ const SUPPORTED_MODELS = {
27
+ 'abliterated-model-large-v2': {
28
+ modelName: 'abliterated-model-large-v2',
29
+ friendlyName: 'Abliterated Large V2',
30
+ contextWindow: 1000000,
31
+ maxOutputTokens: 999990,
32
+ supportsStreaming: true,
33
+ supportsImages: false, // Text-only; image content is rejected with a 400
34
+ supportsWebSearch: false,
35
+ supportsReasoning: true,
36
+ // Cannot disable reasoning: `none` would run at low with the trace hidden,
37
+ // so it clamps up to an explicit `low` that keeps the trace visible.
38
+ reasoningTiers: ['low', 'high', 'max'],
39
+ supportsJsonOutput: true,
40
+ supportsFunctionCalling: true,
41
+ timeout: 1800000,
42
+ description:
43
+ 'Abliterated Large V2 - uncensored GLM-5.3 derived reasoning model with 1M context',
44
+ aliases: ['abliterated-large', 'abliterated-large-v2'],
45
+ },
46
+ 'abliterated-model-large': {
47
+ modelName: 'abliterated-model-large',
48
+ friendlyName: 'Abliterated Large',
49
+ contextWindow: 1000000,
50
+ maxOutputTokens: 999990,
51
+ supportsStreaming: true,
52
+ supportsImages: false, // Text-only; image content is rejected with a 400
53
+ supportsWebSearch: false,
54
+ supportsReasoning: true,
55
+ reasoningTiers: ['none', 'high', 'max'],
56
+ supportsJsonOutput: true,
57
+ supportsFunctionCalling: true,
58
+ timeout: 1800000,
59
+ description:
60
+ 'Abliterated Large - previous uncensored GLM-5.2 derived reasoning model with 1M context',
61
+ aliases: ['abliterated-large-v1'],
62
+ },
63
+ 'abliterated-model': {
64
+ modelName: 'abliterated-model',
65
+ friendlyName: 'Abliterated Model',
66
+ contextWindow: 262144,
67
+ maxOutputTokens: 262134,
68
+ supportsStreaming: true,
69
+ supportsImages: true,
70
+ supportsWebSearch: false,
71
+ supportsReasoning: true,
72
+ reasoningTiers: EFFORT_LADDER,
73
+ supportsJsonOutput: true,
74
+ supportsFunctionCalling: true,
75
+ timeout: 900000,
76
+ description:
77
+ 'Abliterated Model - uncensored multimodal reasoning model with 256K context',
78
+ aliases: ['abliterated', 'abliterated-base'],
79
+ },
80
+ };
81
+
82
+ /**
83
+ * abliteration.ai API keys are issued as `ak_...` tokens.
84
+ */
85
+ function validateApiKey(apiKey) {
86
+ if (!apiKey || typeof apiKey !== 'string') {
87
+ return false;
88
+ }
89
+
90
+ return apiKey.startsWith('ak_') && apiKey.length > 10;
91
+ }
92
+
93
+ /**
94
+ * Attach `reasoning_effort` clamped onto the tiers the resolved model runs.
95
+ * Capability-gated: an unknown pass-through ID never receives the field and
96
+ * runs at the server's default depth.
97
+ */
98
+ async function transformRequest(requestPayload, context = {}) {
99
+ const { modelConfig, reasoningEffort } = context;
100
+
101
+ if (modelConfig?.supportsReasoning && reasoningEffort) {
102
+ requestPayload.reasoning_effort = clampReasoningEffort(
103
+ reasoningEffort,
104
+ modelConfig.reasoningTiers,
105
+ );
106
+ }
107
+
108
+ debugLog('[Abliteration] Request payload prepared');
109
+ return requestPayload;
110
+ }
111
+
112
+ export const abliterationProvider = createOpenAICompatibleProvider({
113
+ baseURL: 'https://api.abliteration.ai/v1',
114
+ providerName: 'Abliteration',
115
+ supportedModels: SUPPORTED_MODELS,
116
+ defaultModel: 'abliterated-model-large-v2',
117
+ validateApiKey,
118
+ transformRequest,
119
+ });
@@ -17,6 +17,7 @@ import { codexProvider } from './codex.js';
17
17
  import { geminiCliProvider } from './gemini-cli.js';
18
18
  import { claudeProvider } from './claude.js';
19
19
  import { copilotProvider } from './copilot.js';
20
+ import { abliterationProvider } from './abliteration.js';
20
21
 
21
22
  /**
22
23
  * Provider registry map
@@ -34,6 +35,7 @@ const providers = {
34
35
  mistral: mistralProvider,
35
36
  deepseek: deepseekProvider,
36
37
  openrouter: openrouterProvider,
38
+ abliteration: abliterationProvider,
37
39
  codex: codexProvider,
38
40
  claude: claudeProvider,
39
41
  copilot: copilotProvider,
package/src/tools/chat.js CHANGED
@@ -1165,7 +1165,7 @@ chatTool.inputSchema = {
1165
1165
  items: { type: 'string' },
1166
1166
  minItems: 1,
1167
1167
  description:
1168
- 'Models to use. Examples: ["auto"] (recommended), ["codex"], ["codex", "gemini", "claude"], ["codex:astra"], ["gpt-6-astra"]. Forms: "provider" (its default model), "provider:model" (that provider only), or a bare "model" (served by the first configured provider that offers it, local CLI providers first, failing over to the next). Providers: codex, gemini (agy), claude, copilot, openai, google, xai, anthropic, mistral, deepseek, openrouter. Unknown names are rejected with suggestions. In mode "chat" each model answers independently; in "consensus" they refine after seeing each other; in "roundtable" they speak in the given ORDER, each seeing the transcript. Default: ["auto"].',
1168
+ 'Models to use. Examples: ["auto"] (recommended), ["codex"], ["codex", "gemini", "claude"], ["codex:astra"], ["gpt-6-astra"]. Forms: "provider" (its default model), "provider:model" (that provider only), or a bare "model" (served by the first configured provider that offers it, local CLI providers first, failing over to the next). Providers: codex, gemini (agy), claude, copilot, openai, google, xai, anthropic, mistral, deepseek, openrouter, abliteration. Unknown names are rejected with suggestions. In mode "chat" each model answers independently; in "consensus" they refine after seeing each other; in "roundtable" they speak in the given ORDER, each seeing the transcript. Default: ["auto"].',
1169
1169
  },
1170
1170
  mode: {
1171
1171
  type: 'string',
@@ -40,6 +40,7 @@ export const PROVIDER_PRIORITY = [
40
40
  'mistral',
41
41
  'deepseek',
42
42
  'openrouter',
43
+ 'abliteration',
43
44
  ];
44
45
 
45
46
  /**
@@ -70,6 +71,7 @@ export const PROVIDER_NAMESPACES = {
70
71
  mistral: ['mistral'],
71
72
  deepseek: ['deepseek'],
72
73
  openrouter: ['openrouter'],
74
+ abliteration: ['abliteration', 'ablit'],
73
75
  };
74
76
 
75
77
  /**
@@ -89,6 +91,7 @@ export const DEFAULT_MODEL_ENV_VARS = {
89
91
  mistral: 'MISTRAL_DEFAULT_MODEL',
90
92
  deepseek: 'DEEPSEEK_DEFAULT_MODEL',
91
93
  openrouter: 'OPENROUTER_DEFAULT_MODEL',
94
+ abliteration: 'ABLITERATION_DEFAULT_MODEL',
92
95
  };
93
96
 
94
97
  /**
@@ -583,6 +586,7 @@ const API_KEY_ENV_VARS = {
583
586
  mistral: 'MISTRAL_API_KEY',
584
587
  deepseek: 'DEEPSEEK_API_KEY',
585
588
  openrouter: 'OPENROUTER_API_KEY',
589
+ abliteration: 'ABLITERATION_API_KEY',
586
590
  };
587
591
 
588
592
  const LOCAL_PROVIDER_SETUP_HINTS = {