Use hosted server

Bring your data. Explore machine learning with WEKA through MCP.

WEKA machine learning, connected to your AI assistant

Weka MCP helps your AI assistant inspect datasets, prepare data, compare established machine-learning methods and explain the results through a guided, inspectable workflow.

Built on WEKA · 46 structured tools · Open source · Run locally or use the hosted demo

A Claude session analysing a bank marketing CSV with WEKA: 45,211 instances, attribute importance by information gain, a 10-fold cross-validation comparison of Random forest, J48, logistic regression and naive Bayes, and confusion matrices.

The Architecture

Guided by AI. Powered by WEKA.

Weka MCP translates your requests into structured calls to WEKA. The MCP server handles the conversation, while WEKA performs the training, evaluation and prediction.

The experience feels conversational, but the machine learning remains fully WEKA.

From question to explained result

01

Describe the problem

Tell the assistant what the dataset represents and what you want to understand.

02

Inspect the data

Identify missing values, unsuitable attributes, imbalance and other data issues.

03

Choose an approach

Receive a small number of appropriate model recommendations with explanations.

04

Run and compare

Train models, establish a baseline and compare performance.

05

Understand the outcome

Translate metrics, errors and model behaviour into practical language.

06

Preserve the workflow

Retain the dataset assumptions, preprocessing, configuration and evaluation details.

How WEKA MCP makes this possible

MCP client Claude · ChatGPT · Code POST /mcp or stdio weka-mcp TypeScript · 46 tools REST :7070 weka-api Java 17 · Javalin WEKA 3.9.6 no ML logic — a typed forwarder the real ML · persists models + data

weka-mcp

The translator

A Node MCP server that turns each tool call into a weka-api REST call and nothing more. Speaks both transports: HTTP on POST /mcp for remote clients, and stdio for desktop ones. Finds the API through WEKA_API_URL.

Port
3000 in-container
Health
/healthz
State
none — stateless

weka-api

The workbench

Java 17 and Javalin wrapping WEKA 3.9.6. This is where training, evaluation, clustering, and diagnostics actually happen. Serialized models and uploaded datasets live on disk, so a model you train stays trainable against later.

Port
7070
Models
/app/models
Data
/app/data

In the cloud, only one of them is reachable. On Azure Container Apps, weka-api has internal-only ingress, so it has no public DNS entry. Only weka-mcp inside the environment can reach it. Both apps also scale to zero and are capped at one replica each, so an idle demo costs close to nothing and a busy one can't run up a bill.

How to install WEKA-MCP?

Two options to connect

Take the hosted server if you want to try it in the next minute. Run it locally if you want your data to stay yours.

Option A

Use the hosted server

It runs in open demo mode: no key, no header, no account. Point any MCP-over-HTTP client at this endpoint.

MCP endpoint https://weka-mcp.ademartutor.com/mcp

Choose your hosted server

Pick the client you use below. Each tab walks through pointing it at the hosted MCP endpoint.

Connect WEKA-MCP to claude.ai

Custom connectors are available on the Free, Pro, Max, Team, and Enterprise plans through the claude.ai web app. Free accounts can hold one custom connector at a time. On Team and Enterprise, an Owner has to add the connector for the organization first. See below.

  1. Open claude.ai in a desktop web browser and sign in.
  2. Go to Customize → Connectors.
  3. Select Add custom connector.
  4. Enter the following details:

    Remote MCP server URL
    MCP endpoint
    https://weka-mcp.ademartutor.com/mcp
    Advanced settings
    Leave OAuth Client ID and OAuth Client Secret empty. The hosted server runs in open demo mode and takes no credentials.
    Request headers
    Leave empty. If your build doesn't show this section, ignore it.

    If a Name field appears, enter WEKA-MCP. Otherwise Claude takes the name the server reports.

  5. Select Add. Claude connects to the server and lists the WEKA-MCP tools it discovers.
  6. Start a new conversation.
  7. Select the + button in the chat interface, then Connectors.
  8. Toggle WEKA-MCP on for that conversation.

You can now ask Claude to use WEKA-MCP tools for machine-learning tasks. Claude asks for your approval the first time it calls each tool.

On Team and Enterprise plans

Members can't add a custom connector until an Owner has registered it for the organization.

  1. An Owner or Primary Owner goes to Organization settings → Connectors.
  2. Select Add, then Custom. If Claude asks for a connector type, choose Web.
  3. Enter the same MCP endpoint above, leave the OAuth fields empty, and select Add.
  4. Each member then opens Customize → Connectors, finds WEKA-MCP under the Custom label, and selects Connect.

If the connector won't attach

  • No Add custom connector option. You're on Team or Enterprise, where an Owner has to add it at the organization level first.
  • Free plan already has a connector. Free accounts hold one custom connector at a time, so remove the existing one first.
  • The connector times out on first add. The server scales from zero. Wait 30 seconds and try again.
  • Tools don't appear in chat. Connectors are enabled per conversation. Re-open + → Connectors in the chat you're actually using.
  • To turn off individual tools, go to Customize → Connectors, select WEKA-MCP, and set a tool's permission to Blocked.

Read this before you upload anything

  • It is a public sandbox. The dataset and model volume is shared and open. Anyone can list, download, or delete what you put there. ⚠️ Don't upload anything private.
  • Uploads are capped at 20 MB.
  • If the server's been idle, the first call can take 10–30 seconds while it scales back up from zero. That delay is expected, not a failure.
  • Training that runs past ~240 seconds can't finish over the ingress timeout. Big jobs belong on a local install.

Option B

Run it locally with Docker

One command builds both services, picks free ports, and waits until the server reports healthy. You need Docker with Compose v2, and Node 20 or newer only if you want stdio.

git clone https://github.com/iamademar/weka-mcp.git
cd weka-mcp
bin/setup

bin/setup probes for free host ports — starting at 3001 for weka-mcp and 7070 for weka-api — writes them to a generated .env, builds, and waits for health. It prints the ports it chose. Internally the two services always talk over weka-api:7070, which mirrors the cloud shape.

Check that it came up

curl -s localhost:3001/healthz
{"ok":true,"wekaApiUrl":"http://weka-api:7070"}

Connect Claude Code

cd weka-mcp && npm ci && npm run build

claude mcp add weka \
  --env WEKA_API_URL=http://localhost:7070 \
  -- node "/ABSOLUTE/PATH/TO/weka-mcp/weka-mcp/dist/index.js"

Connect Claude Desktop

{
  "mcpServers": {
    "weka": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/TO/weka-mcp/weka-mcp/dist/index.js"],
      "env": { "WEKA_API_URL": "http://localhost:7070" }
    }
  }
}

stdio needs weka-api on the host

The compose stack deliberately doesn't publish weka-api to your host, so localhost:7070 won't answer out of the box. Either run weka-api directly (cd weka-api && mvn -q package -DskipTests && PORT=7070 java -jar target/weka-api-*-shaded.jar) or add ports: ["7070:7070"] to the weka-api service in compose.yaml.

Tear it down

bin/remove            # down -v, removes images, frees the ports
docker compose down   # stop containers, keep the volumes

Tools

Every tool is weka_-prefixed and typed. They're grouped the way you'd actually work through a problem: inspect the data, transform it, train a model, then diagnose where it fails.

Environment variables

weka-mcp

VariableDefaultPurpose
WEKA_API_URLhttp://localhost:7070Base URL of weka-api. Compose uses http://weka-api:7070.
MCP_HTTP_PORT3000Port the HTTP transport listens on.
WEKA_API_TIMEOUT_MS210000Per-request timeout, kept under the ~240s ingress ceiling.
INTERNAL_AUTH_SHARED_SECRETunsetWhen set, POST /mcp requires X-Internal-Auth. Unset means the check is skipped.

weka-api

VariableDefaultPurpose
PORT7070Port Javalin binds.
MODELS_DIR/app/modelsSerialized .model files.
DATA_DIR/app/dataUploaded ARFF and CSV datasets.
MAX_UPLOAD_MB100Upload size cap. The hosted demo sets this to 20.
LOG_LEVELINFOLogback root level.
JAVA_TOOL_OPTIONSunsetJVM flags. Compose sets -XX:MaxRAMPercentage=75.0.

Read this before you set WEKA_API_URL

Locally, WEKA_API_URL carries a port: http://weka-api:7070. In the cloud it must not. Internal ingress terminates TLS on 443 and maps to the container's port itself, so the value is https://<api-internal-fqdn> with no port at all.