Skip to content
Conduit

mcp server

meow-tool

meow-tool is a self-hosted LLM gateway that unifies multi-vendor model configuration behind both OpenAI and Anthropic compatible APIs. Ships with a bundled Web UI for managing everything visually; an

NaClNeZn/meow-toolcommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • Node.js 20 or newer
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "meow-tool": {
      "command": "npx",
      "args": [
        "-y",
        "meow-tool"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 26, 2026

meow-tool

Multi-provider LLM router with OpenAI/Anthropic compatible API, smart mode routing, SSE streaming, session persistence, token analytics, and unified Agent/Skill/MCP orchestration.

meow-tool is a self-hosted LLM gateway that unifies multi-vendor model configuration behind both OpenAI and Anthropic compatible APIs. Ships with a bundled Web UI for managing everything visually; an optional terminal TUI (meow cli) is available for keyboard-driven workflows.

Features

  • Dual protocol -- OpenAI + Anthropic compatible APIs, any client works
  • Multi-vendor routing -- OpenAI / Anthropic / vLLM / any OpenAI-compatible upstream
  • Normal / Making modes -- smart routing: classifier evaluates query complexity, routes to the right model tier ( low / medium / high)
  • SSE streaming -- full streaming with reasoning chain pass-through
  • Sessions -- persistent chat history, resumable across CLI/Web invocations
  • Token analytics -- daily / monthly / yearly usage aggregation
  • Agent / Skill / MCP orchestration -- unified tool calling with persona prompts, skill injection, and MCP tool routing
  • System ops -- built-in file read/write + command execution (sandboxed)
  • SQLite storage -- zero-config, all data in ~/.meowtool/meow.db
  • OSS sync -- optional S3-compatible backup (startup pull + shutdown push)

Install

# global install (recommended)
npm install -g meow-tool

# or use directly without install
npx meow-tool start

The postinstall hook creates ~/.meowtool/ (the data home). Override with MEOW_HOME env var if you want a different location.

Quick Start

# 1. start backend API server on :4399 (Web UI is served from the same port)
meow start

# 2. open Web UI in browser
meow web

# 3. check status
meow status

# 4. stop background services
meow stop

For most users meow start + Web UI plus any OpenAI/Anthropic compatible client (Cherry Studio, Open WebUI, etc.) is enough. The terminal TUI (meow cli) is optional for those who prefer a keyboard-driven workflow.

CLI Commands

CommandDescription
meow startStart backend in background (detached, PID + log file)
meow stopStop background services (graceful shutdown with OSS upload)
meow webOpen browser to Web UI (http://localhost:4399)
meow statusCheck if backend is running
meow cli(optional) Start terminal TUI chat (new session each time)
meow versionPrint the current version (reads package.json)

meow version also accepts aliases: meow -v, meow -version, meow --version. Works in both dev (npm start) and packaged (npm i -g meow-tool) modes.

API Endpoints

Once running, point any OpenAI/Anthropic compatible client at:

  • OpenAI compatible: http://localhost:4399/v1/chat/completions
  • Anthropic compatible: http://localhost:4399/v1/messages
  • Models list: http://localhost:4399/v1/models

Chat Request (OpenAI compatible)

curl http://localhost:4399/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4",
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": true
  }'

Chat Request (Anthropic compatible)

curl http://localhost:4399/v1/messages \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "claude-3-opus",
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": true
  }'

Smart Routing

Use virtual model names to enable smart routing:

# Normal mode: always routes to the configured default model
{"model": "normal", "messages": [...]}

# Making mode: classifier evaluates complexity, routes to low/medium/high tier
{"model": "making", "messages": [...]}

# Auto mode: alias for making
{"model": "auto", "messages": [...]}

Orchestration

Add session_id, agent_id, or meow_tools to enable full orchestration (MCP tools, skill injection, agent persona):

# Use an agent with session history
{
  "model": "normal",
  "session_id": "your-session-uuid",
  "agent_id": "my-agent",
  "messages": [{"role": "user", "content": "Help me write code"}]
}

Without these fields, requests are pure-routed (no MCP/Skill injection).

REST API Overview

MethodPathDescription
GET/apiServer status + available endpoints
GET/v1/modelsList all models (real + virtual aliases)
POST/v1/chat/completionsOpenAI compatible chat
POST/v1/messagesAnthropic compatible chat
GET/PUT/v1/config/modelsRead/write model configurations
GET/PUT/v1/config/routerRead/write router configurations
GET/PUT/v1/config/mcpsRead/write MCP configurations
GET/v1/mcps/statusMCP connection status
GET/v1/mcps/toolsAggregated tool list
POST/v1/mcps/tools/:nameManually invoke a tool
GET/POST/PUT/DELETE/v1/config/skillsCRUD skills
GET/PUT/DELETE/v1/config/skills/:id/files/:filenameCRUD skill files
GET/POST/PUT/DELETE/v1/config/agentsCRUD agents
POST/GET/PATCH/DELETE/v1/sessionsSession management
GET/v1/analytics/tokensToken usage aggregation
GET/v1/analytics/modelsModels with usage records
GET/v1/analytics/recordsRecent raw usage records
GET/PUT/v1/oss/configRead/write OSS sync config
POST/v1/oss/pushManual upload to OSS
POST/v1/oss/pullManual pull from OSS

Configuration

All config lives in ~/.meowtool/meow.db (SQLite). Edit via REST API or Web UI.

Model Configuration

# read current models
curl http://localhost:4399/v1/config/models

# add a model (url can be a base URL — suffix is auto-appended based on `type`)
curl -X PUT http://localhost:4399/v1/config/models \
  -H 'Content-Type: application/json' \
  -d '{
    "gpt-4": {
      "type": "openai-chat",
      "url": "https://api.openai.com/v1",
      "upstreamModel": "gpt-4",
      "headers": { "Authorization": "Bearer sk-..." },
      "maxTokens": 8192
    }
  }'

URL auto-suffix: When fullUrl is false (default for new models), the suffix is auto-appended based on type:

  • openai-chat → /chat/completions (e.g. https://api.openai.com/v1 → .../v1/chat/completions)
  • anthropic-chat → /v1/messages (e.g. https://api.anthropic.com → .../v1/messages, or https://api.deepseek.com/anthropic → .../anthropic/v1/messages)

If the URL already ends with the suffix (ignoring query/hash), it is not appended again. Set fullUrl: true to use the URL as-is (for Azure OpenAI or custom reverse proxies with non-standard paths).

Model fields:

FieldTypeDefaultDescription
type"openai-chat" | "anthropic-chat"requiredUpstream protocol
urlstringrequiredUpstream API endpoint (base URL if fullUrl=false)
upstreamModelstringrequiredReal model name sent to upstream
headersobject{}Custom request headers (auth, etc.)
bodyobject{}Fields merged into request body
maxTokensnumber4096Max output tokens
includeReasoningbooleanfalsePass through reasoning/thinking chain
upstreamStreambooleantrueForce streaming to upstream
timeoutMsnumber600000Upstream request timeout (ms)
anthropicVersionstring2023-06-01Anthropic API version header (anthropic-chat only)
fullUrlbooleanfalseIf true, use url as-is (no auto-suffix). Default true for existing models migrated from v1 schema (backward compatible)

Router Configuration

# read router config
curl http://localhost:4399/v1/config/router

# configure smart routing
curl -X PUT http://localhost:4399/v1/config/router \
  -H 'Content-Type: application/json' \
  -d '{
    "defaultModel": "gpt-4",
    "making": {
      "classifierModel": "gpt-3.5-turbo",
      "intensity": {
        "low": "gpt-3.5-turbo",
        "medium": "gpt-4",
        "high": "gpt-4-turbo"
      }
    }
  }'
  • Normal mode (model: "normal"): always routes to defaultModel
  • Making mode (model: "making" or "auto"): classifier evaluates query complexity, routes to the corresponding tier

MCP Configuration

MCP (Model Context Protocol) tools are external sub-processes or remote HTTP services. Configure via API or Web UI:

curl -X PUT http://localhost:4399/v1/config/mcps \
  -H 'Content-Type: application/json' \
  -d '[{
    "id": "my-mcp",
    "name": "My MCP Server",
    "enabled": true,
    "transport": "stdio",
    "command": "npx",
    "args": ["-y", "my-mcp-server"],
    "timeoutMs": 60000
  }]'

Skills

Skills are pure markdown files injected into the system prompt. Create via API or Web UI, then edit the .md files:

# create a skill
curl -X POST http://localhost:4399/v1/config/skills \
  -H 'Content-Type: application/json' \
  -d '{"id": "coding", "name": "Coding Assistant", "enabled": true}'

# edit skill content
curl -X PUT http://localhost:4399/v1/config/skills/coding/files/SKILL.md \
  -H 'Content-Type: application/json' \
  -d '{"content": "You are an expert programmer..."}'

Agents

Agents are structured presets that override model, tools, and system prompt:

curl -X POST http://localhost:4399/v1/config/agents \
  -H 'Content-Type: application/json' \
  -d '{
    "id": "coder",
    "name": "Code Agent",
    "enabled": true,
    "model": "gpt-4",
    "systemPrompt": "You are a senior developer...",
    "tools": ["system__read_file", "system__write_file"]
  }'

Activate an agent by adding "agent_id": "coder" to your chat request body.

OSS Sync (optional)

Sync meow.db + skills/ to any S3-compatible service (Aliyun / MinIO / Cloudflare R2 / AWS S3). On startup the data is pulled from OSS (overriding local); on shutdown the local data is pushed back.

Create ~/.meowtool/oss.json:

{
  "enabled": true,
  "endpoint": "https://oss-cn-hangzhou.aliyuncs.com",
  "region": "oss-cn-hangzhou",
  "accessKeyId": "your-key-id",
  "accessKeySecret": "your-secret",
  "bucket": "meow-backup",
  "prefix": "meow/",
  "forcePathStyle": false
}
FieldDescription
endpointS3-compatible endpoint (Aliyun / MinIO required; AWS S3 leave empty)
forcePathStyletrue for MinIO self-hosted; false for Aliyun / AWS
prefixObject key prefix for multi-instance isolation on the same bucket

The oss.json file itself is not synced (keys stay local only). When enabled is false or the file is missing, sync is silently skipped.

Manual sync via API:

# upload local data to OSS
curl -X POST http://localhost:4399/v1/oss/push

# pull skills from OSS (DB pulled on startup only)
curl -X POST http://localhost:4399/v1/oss/pull

Web UI

The Web UI is bundled with the npm package and served from the same backend port (http://localhost:4399). It provides a graphical interface for managing models, router, MCPs, skills, agents, sessions, token analytics, and OSS sync.

meow start && meow web

No extra install step needed -- meow start serves both the API and the Web UI.

Terminal TUI (optional)

The terminal TUI (meow cli) is an optional keyboard-driven chat client that connects to the same backend over HTTP. It is bundled in the same meow binary -- no extra install or project clone needed. It supports multi-line editing with Emacs keybindings, history navigation, and paced streaming output. Useful when you prefer the terminal or want a lightweight chat without a browser.

meow start   # ensure backend is running
meow cli     # start a new TUI chat session (bundled, same binary)

Environment Variables

VariableDefaultDescription
MEOW_HOME~/.meowtoolData directory (DB, skills, logs, PID file)
PORT4399Backend server port

Data Directory

All runtime data lives in ~/.meowtool/:

~/.meowtool/
  meow.db            # SQLite main database
  skills/            # Skill markdown files
  logs/              # Backend logs (when running in background)
  oss.json           # OSS sync configuration (optional)
  .meow-pids.json    # Background process PID file

Requirements

  • Node.js >= 20
  • Windows / macOS / Linux

License

MIT (c) naclnezn

↑↓ navigate openesc close