Skip to main content
Glama
dinamexoft

mcp-javamelody

by dinamexoft
README.md
# mcp-javamelody

An MCP (Model Context Protocol) server that gives **read-only** access to [JavaMelody](https://github.com/javamelody/javamelody)
monitoring data for one or more Java web applications — HTTP/SQL/Spring counters, JVM info, thread dumps, database
reports — straight from the agent, no manual dashboard digging. Only `format=json` GET requests against JavaMelody's
own `monitoring` endpoint are made; nothing is ever written back to the monitored app.

## How it works

- `server.js` — the MCP server. Reads a TOML config file listing your microservices (name, URL, optional basic-auth
  credentials), then exposes tools that call each one's JavaMelody `?format=json` endpoint over plain HTTP(S).
- One server process covers **all** microservices in your config — pass a `server` argument to pick which one a tool
  call targets. Call `list_servers` first to see the valid names.

This tool is installed once and configured **per project** (one config file + one agent config entry per project,
or one per environment if you want them separate). See [Running multiple projects in parallel](#running-multiple-projects-in-parallel)
at the end.

## 1. Prerequisite: JavaMelody must be enabled on the app, with JSON export

The target application needs the JavaMelody monitoring servlet/filter already installed and reachable, e.g.
`http://your-host:8080/your-app/monitoring`. If it's protected with basic auth (recommended), have the
username/password handy — see JavaMelody's own docs for enabling it and securing the endpoint.

JavaMelody's `?format=json` export (used by every tool in this server) requires [XStream](https://x-stream.github.io/)
on the monitored app's classpath — it's an optional dependency JavaMelody doesn't bundle by default. Add it to the
app's own `pom.xml`:

```xml
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.21</version>
</dependency>
```

Without it, `?format=json` requests fail even though the regular HTML monitoring page works fine.

## 2. Client install

Requires Node.js 20+.

**Windows / Linux / macOS — same steps:**

Installs the `mcp-javamelody` command globally

```bash
npm install -g mcp-javamelody
```

Copy [`config.example.toml`](config.example.toml) to a config file for the project, e.g. `config.myproject.toml`:

```toml
[[servers]]
name = "microservice1"
url = "http://localhost:8080/microservice1/monitoring"
user = "monitor"
password = "change-me"

[[servers]]
name = "microservice2"
url = "http://localhost:8080/microservice2/monitoring"
user = "monitor"
password = "change-me"

# Optional, top-level defaults applied to every server unless overridden per-server below.
# insecure = true       # accept self-signed https certificates
# timeout_ms = 30000    # request timeout (ms), default 30000
```

Each `[[servers]]` entry is one JavaMelody-monitored microservice, selected by `name` when calling a tool. `user`/
`password` are optional (omit for an unprotected endpoint). Keep this file out of any git repo if it holds real
credentials — `.gitignore` already excludes `config*.toml` other than the example.

Sanity-check it works before wiring it with the agent:

```bash
mcp-javamelody --config-file /path/to/config.myproject.toml
```

It should print `[Ready] JavaMelody MCP server ready — servers: ...` to stderr and then sit waiting for input —
`Ctrl+C` to stop.

## 3. Add it to Claude

Edit your Claude Desktop / Claude Code MCP config (create the file if it doesn't exist):

- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Linux: `~/.config/Claude/claude_desktop_config.json`

The same block on every OS — only the `--config-file` path syntax differs:

**Windows:**

```json
{
  "mcpServers": {
    "myproject-javamelody": {
      "command": "mcp-javamelody",
      "args": [
        "--config-file",
        "C:\\Users\\you\\config.myproject.toml"
      ]
    }
  }
}
```

**Linux / macOS:**

```json
{
  "mcpServers": {
    "myproject-javamelody": {
      "command": "mcp-javamelody",
      "args": [
        "--config-file",
        "/home/you/config.myproject.toml"
      ]
    }
  }
}
```

Restart Claude. You should see tools like `list_servers`, `get_counter_stats`, `get_statistics`, `get_part`,
`list_database_requests` and `get_database_stats` available under `myproject-javamelody`.

<sub>Prefer running from a local checkout instead of a global installation? `git clone` the repo, `npm install`, then
use `"command": "node"` with `"args": ["/path/to/server.js", "--config-file", "/path/to/config.toml"]` — both
invocation styles read the same config file.</sub>

## Available tools

- `list_servers` — list the configured microservices. Call first to get valid `server` values.
- `get_counter_stats` — per-request aggregates for a date range: hits, mean/max/total duration, errors, one row per
  URL / SQL statement / Spring method / error / log message. The most granular way to find what's slow or failing.
- `get_statistics` — full overview for a date range: all counters plus JVM info in one response.
- `get_part` — live snapshot right now, no date range: JVM/host info, open JDBC connections, current requests, all
  threads, JMX MBeans, OS processes, JNDI tree.
- `list_database_requests` — list the database report names/indexes available (depends on the JDBC driver), call
  before `get_database_stats`.
- `get_database_stats` — a database report for a date range, e.g. `pg_stat_activity`, `pg_locks`,
  `pg_stat_user_tables`, `pg_settings`.

## Running multiple projects in parallel

The whole setup above is designed to be repeated per project or environment, side by side, without collisions:

- **Config files**: `config.<project>.toml` or `config.<project>-<environment>.toml`, one per agent config entry
  (remember to gitignore it if it holds real credentials).
- **Claude config**: one `mcpServers` entry per project/environment (`myproject-javamelody`, `myproject-uat-javamelody`,
  ...), each pointing at its own `--config-file`.
- A single config file can also list multiple microservices under one entry (see `[[servers]]` above) if they belong
  to the same project and should share one agent config entry — pick between them with the `server` tool argument.

## Security notes

- Only `GET ?format=json` requests are made against JavaMelody's own monitoring endpoint — no write capability exists
  in this server.
- Never commit config files containing real basic-auth credentials.
- Use `insecure = true` only for self-signed certificates you trust (e.g. internal networks) — it disables TLS
  certificate verification for the whole process.