Ajouter l'outil de chat Atomic
/SKILLAjoutez le serveur Atomic Chat MCP afin que le conteneur agent puisse appeler les modèles locaux mis à disposition par l'application de bureau Atomic Chat via son API compatible avec OpenAI.
name: add-atomic-chat-tool
description: Add Atomic Chat MCP server so the container agent can call local models served by the Atomic Chat desktop app via its OpenAI-compatible API.
Add Atomic Chat Integration
This skill adds a stdio-based MCP server that exposes models running in the local [Atomic Chat](https://github.com/AtomicBot-ai/Atomic-Chat) desktop app as tools for the container agent. Claude remains the orchestrator but can offload work to local models served by Atomic Chat on http://127.0.0.1:1337/v1 (OpenAI-compatible).
Tools exposed:
atomic_chat_list_models— list models currently available in Atomic Chat (GET /v1/models)atomic_chat_generate— send a prompt to a specified model and return the response (POST /v1/chat/completions)
Model management (download, delete) is done through the Atomic Chat desktop UI — the app is a fork of Jan and manages its own model library.
The skill ships the MCP server source (and its test) in this folder and copies them into the agent-runner tree at install time, then registers the server in index.ts and forwards host env vars in container-runner.ts. Registering the server is enough to expose its tools — the agent's allow-pattern (mcp__atomic_chat__*) is derived from the registered server name.
Phase 1: Pre-flight
Check if already applied
Check if container/agent-runner/src/atomic-chat-mcp-stdio.ts exists. If it does, skip to Phase 3 (Configure).
Check prerequisites
Verify Atomic Chat is installed and its local API server is running. On the host:
curl -s http://127.0.0.1:1337/v1/models | headIf the request fails:
- Install Atomic Chat from the [latest release](https://github.com/AtomicBot-ai/Atomic-Chat/releases) (macOS only for now —
atomic-chat.dmg). - Open the app.
- Open Settings → Local API Server and make sure it's enabled on port
1337. - Go to the Hub (or Models) tab and download at least one model (e.g. Llama 3.2 3B, Qwen 2.5 Coder 7B).
- Load the model once by sending any message in Atomic Chat's UI to warm it up.
Phase 2: Apply Code Changes
Copy the skill's source and tests into both trees
This skill reaches into both the container (Bun) tree and the host (Node) tree, so its
files go into both, alongside the integration points they cover.
S=.claude/skills/add-atomic-chat-tool
# Container (Bun) tree — the MCP server and the registration wiring test
cp $S/atomic-chat-mcp-stdio.ts container/agent-runner/src/atomic-chat-mcp-stdio.ts
cp $S/atomic-chat-registration.test.ts container/agent-runner/src/atomic-chat-registration.test.ts
# Host (Node) tree — the env-forwarding helper and the wiring test
cp $S/atomic-chat-env.ts src/atomic-chat-env.ts
cp $S/atomic-chat-wiring.test.ts src/atomic-chat-wiring.test.tsRegister the MCP server in the agent-runner
Edit container/agent-runner/src/index.ts. Find the mcpServers object that currently looks like this:
const mcpServers: Record<string, { command: string; args: string[]; env: Record<string, string> }> = {
nanoclaw: {
command: 'bun',
args: ['run', mcpServerPath],
env: {},
},
};Add an atomic_chat entry alongside nanoclaw:
const mcpServers: Record<string, { command: string; args: string[]; env: Record<string, string> }> = {
nanoclaw: {
command: 'bun',
args: ['run', mcpServerPath],
env: {},
},
atomic_chat: {
command: 'bun',
args: ['run', path.join(__dirname, 'atomic-chat-mcp-stdio.ts')],
env: {
...(process.env.ATOMIC_CHAT_HOST ? { ATOMIC_CHAT_HOST: process.env.ATOMIC_CHAT_HOST } : {}),
...(process.env.ATOMIC_CHAT_API_KEY ? { ATOMIC_CHAT_API_KEY: process.env.ATOMIC_CHAT_API_KEY } : {}),
},
},
};atomic-chat-registration.test.ts asserts this entry is present and points at the server module — the tool only appears to the agent if it is registered here.
Forward host env vars into the container
The env-forwarding logic lives in the copied src/atomic-chat-env.ts (atomicChatEnvArgs()), so the reach-in into buildContainerArgs is a single call.
Import it in src/container-runner.ts (alongside the other local imports):
import { atomicChatEnvArgs } from './atomic-chat-env.js';Then, in buildContainerArgs, find the TZ env line and add the call right after it:
args.push('-e', `TZ=${TIMEZONE}`);
args.push(...atomicChatEnvArgs());atomic-chat-wiring.test.ts asserts this args.push(...atomicChatEnvArgs()) call exists inside buildContainerArgs.
Surface [ATOMIC] log lines at info level
Shared block. This rewrites thecontainer.stderrlogger, which other local-model tools (e.g.add-ollama-toolfor[OLLAMA]) also edit to surface their own prefix. Touch only the[ATOMIC]branch and leave the rest of the block intact, so the edits coexist and removal restores it cleanly.
In the same f