# OwnMetrics (pypi · ownmetrics-mcp)

Ask AI apps about your own Garmin data via Garmin's official Personal API. Unofficial.

- Trust score: 86/100 (high trust)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `ownmetrics-mcp`: 86/100 (this document), [markdown](https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp.md), [page](https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp)

## Channel facts

- Registry: `pypi`
- Package: `ownmetrics-mcp`
- Version: `0.3.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 33 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to badisbenhamida/ownmetrics-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 7 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1968 tokens (~140/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 33/100
  - Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the OwnMetrics MCP server?

OwnMetrics runs locally as a PyPI package, launched with uvx ownmetrics-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add badisbenhamida-ownmetrics-mcp -- uvx ownmetrics-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "badisbenhamida-ownmetrics-mcp": {
      "command": "uvx",
      "args": [
        "ownmetrics-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "badisbenhamida-ownmetrics-mcp": {
      "command": "uvx",
      "args": [
        "ownmetrics-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add badisbenhamida-ownmetrics-mcp -- uvx ownmetrics-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "badisbenhamida-ownmetrics-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "ownmetrics-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add badisbenhamida-ownmetrics-mcp --command uvx --arg ownmetrics-mcp
```

### Hermes

```yaml
mcp_servers:
  badisbenhamida-ownmetrics-mcp:
    command: "uvx"
    args: ["ownmetrics-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "badisbenhamida-ownmetrics-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "ownmetrics-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add badisbenhamida-ownmetrics-mcp -t stdio -c uvx -a ownmetrics-mcp
```

### Other

```json
{
  "mcpServers": {
    "badisbenhamida-ownmetrics-mcp": {
      "command": "uvx",
      "args": [
        "ownmetrics-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 86, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-11-03 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 68, −14)

- [security regression] Malware scan: pass → unverified

### 2026-10-29 (score 82, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-28 (score 67, −14)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 1771 → 1968
- [functional improvement] Stability: unverified → 0.07
- [functional] Package version: 0.2.1 → 0.3.1
- [functional] Package version: 0.2.1 → 0.3.0

### 2026-10-27 (score 81, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-26 (score 66)

First indexed and scored.

## MCP tools (14)

### `get_daily_overview` (~92 tokens)

T1. One day's overview: steps, distance, floors, resting/min/max heart rate, stress, Body Battery, calories, intensity minutes, sleep hours and sleep score. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `date` (string, required): Date as YYYY-MM-DD, e.g. 2026-10-25.

### `get_sleep` (~120 tokens)

T2. Sleep per night over a date range: hours, deep/light/REM/awake minutes, sleep score, Garmin's feedback, average heart rate, respiration and sleep stress. Each night is labelled woke_up_on, the morning it ended. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 90 days after start.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `get_hrv` (~121 tokens)

T3. Heart rate variability (HRV) per night over a date range: last-night average, weekly average, 5-minute high, status and personal baseline, in milliseconds. Each night is labelled woke_up_on, the morning it ended. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 90 days after start.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `get_stress_and_body_battery` (~109 tokens)

T4. Per day over a date range: average stress (0-100), minutes in each stress band, and Body Battery high, low, charged and drained. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 90 days after start.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `get_heart_rate` (~85 tokens)

T5. One day's heart rate (resting, min, max, 7-day resting average) and the user's heart rate zones. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `date` (string, required): Date as YYYY-MM-DD, e.g. 2026-10-25.

### `list_activities` (~148 tokens)

T6. List activities in a date range, newest first, optionally filtered by Garmin activity type key (e.g. running, cycling, indoor_cycling, lap_swimming, strength_training). Returns ids for get_activity. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `activity_type`: Optional Garmin activity type key, e.g. 'running'.
- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 90 days after start.
- `limit` (integer): Maximum activities, 1-100.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `get_activity` (~82 tokens)

T7. Details of one activity by id: duration, distance, pace, speed, heart rate, power, cadence, training effect and load, splits and structured workout steps. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `activity_id` (integer, required): Activity id from list_activities.

### `get_body_metrics` (~110 tokens)

T8. Body metrics over a date range: weigh-ins (kg), BMI, body fat, hydration; plus Pulse Ox (SpO2) and fitness age as of the end date. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 90 days after start.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `get_account_status` (~78 tokens)

T9. Check the Garmin connection: whether the key works, granted scopes, a warning if the key expires within a day, which data areas respond, and what Garmin does not provide. Use this first when something fails. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

### `training_summary` (~137 tokens)

I1. Training totals over up to 366 days, by week or month: sessions, hours, hours per week, evening sessions, average aerobic training effect, and a per-sport breakdown. Use for 'how much did I train' questions. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 366 days after start.
- `group_by` (string): Group by 'week' or 'month'.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `compare_periods` (~169 tokens)

I2. Compare two periods (each up to 366 days), e.g. this October vs last October: average sleep, HRV, resting heart rate, stress, Body Battery, steps and training per week, with change and % change and how many days of data each side has. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `a_end` (string, required): Period A last date, YYYY-MM-DD.
- `a_start` (string, required): Period A first date, YYYY-MM-DD.
- `b_end` (string, required): Period B last date, YYYY-MM-DD.
- `b_start` (string, required): Period B first date, YYYY-MM-DD.
- `metrics`: Metrics to compare; leave empty for all.

### `recovery_correlations` (~180 tokens)

I3. Does training go with better or worse sleep and HRV? Over up to 366 days, pairs each day's training with the night after it: correlations with sample size and strength, plus averages for training vs rest days and evening vs earlier sessions. Can focus on one sport. Correlation is not cause; say so when answering. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `activity_type`: Optional sport to look at on its own, matched by name (e.g. 'tennis', 'running', 'cycling'). Days with only other sports are left out.
- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 366 days after start.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `trend` (~145 tokens)

I4. Trend of one metric over up to 366 days, by day, week or month: the series, change per 30 days and whether it is going up, down or flat. Daily grouping adds a 7-day rolling average. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `end` (string, required): Last date, YYYY-MM-DD (inclusive); at most 366 days after start.
- `group_by` (string): Group by day, week or month.
- `metric` (string, required): The metric to follow.
- `start` (string, required): First date, YYYY-MM-DD (inclusive).

### `weekly_review` (~184 tokens)

I5. Weekly review, the same every time: training, sleep, HRV, resting heart rate, stress and Body Battery for the Monday-to-Sunday week containing week_of (default: this week so far), against the same days last week and the previous 28 days; best and worst nights; and highlights from fixed rules. Use for 'weekly review' or 'how was my week' questions. For a general weekly review, call it once with no week_of; pass week_of only when the user names a week (e.g. 'last week'). Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.

Input parameters:

- `week_of`: Any date in the week to review, YYYY-MM-DD. Leave empty for this week so far; use a date from last week for the last full week.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp#diagnostics

## Score history

- 2026-11-05: 86
- 2026-11-04: 70
- 2026-11-03: 70
- 2026-11-02: 69
- 2026-11-01: 69
- 2026-10-31: 68
- 2026-10-30: 68
- 2026-10-29: 82
- 2026-10-28: 67
- 2026-10-27: 81
- 2026-10-26: 66

## Common questions

### What is the OwnMetrics MCP server?

OwnMetrics is an MCP server listed in the public MCP registry as io.github.badisbenhamida/ownmetrics-mcp. Ask AI apps about your own Garmin data via Garmin's official Personal API. Unofficial. This page covers its PyPI package (ownmetrics-mcp).

### Is the OwnMetrics MCP server safe to use?

OwnMetrics scores 86 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the OwnMetrics MCP server expose?

OwnMetrics exposes 14 tools: get_daily_overview, get_sleep, get_hrv, get_stress_and_body_battery, get_heart_rate, and 9 more. Their descriptions and schemas cost roughly 1,760 tokens of context every time the server is loaded.

### Is the OwnMetrics MCP server still maintained?

OwnMetrics is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the OwnMetrics MCP server under?

OwnMetrics declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the OwnMetrics MCP server?

VerifyMCP ran 16 checks on OwnMetrics, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- PyPI project: https://pypi.org/project/ownmetrics-mcp/
- Socket report: https://socket.dev/pypi/package/ownmetrics-mcp
- Repository: https://github.com/badisbenhamida/ownmetrics-mcp
- Changelog RSS feed: https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp.json
- HTML version of this page: https://verifymcp.io/servers/badisbenhamida-ownmetrics-mcp/ownmetrics-mcp
