Quantified Self MCP Server
Quantified Self MCP Server
Локальный сервер Model Context Protocol (MCP), который позволяет LLM — например, Claude Desktop — запрашивать ваши личные данные о здоровье и финансах. Все хранится в двух локальных SQLite-файлах и читается напрямую с диска Python-процессом, которым вы управляете. Никакого облачного хранилища, никакой панели управления, никакого стороннего сервиса.
Что входит
quantified-self-mcp/
├── server.py # the MCP server (FastMCP) — 2 tools
├── init_db.py # loads a CSV file into the local SQLite database
├── requirements.txt
├── .gitignore # keeps data/ and .db files out of version control
└── sample_data/
├── health_sample.csv # 30 days of sample data, so you can try it immediately
└── finance_sample.csv # ~2 months of sample expensesЗапуск init_db.py создает папку data/ рядом с server.py, содержащую health.db и finance.db — эта папка не включена в репозиторий, поскольку генерируется на вашей машине из ваших собственных данных.
Related MCP server: apple-health-mcp
Доступные инструменты
Инструмент | Возвращает | Параметры (все необязательные) |
| Ежедневные шаги, часы сна, пульс в покое |
|
| Категоризированный реестр расходов с итогами |
|
Оба инструмента возвращают соответствующие строки плюс вычисленные сводки (средние/мин/макс для здоровья, итоги по категориям для финансов), чтобы модели не приходилось самостоятельно агрегировать данные по множеству строк.
1. Настройка окружения
Требуется Python 3.10+.
cd quantified-self-mcp
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt2. Загрузка данных
Попробуйте сразу на встроенных примерах:
python init_db.py health sample_data/health_sample.csv
python init_db.py finance sample_data/finance_sample.csvЧтобы использовать собственные данные, экспортируйте их в CSV со следующими колонками, затем выполните те же команды для своих файлов:
health CSV:
date, steps, sleep_hours, resting_heart_ratefinance CSV:
date, category, amount, description(descriptionнеобязателен)
Даты должны быть в формате ISO (2026-08-23); также принимается и конвертируется MM/DD/YYYY. Суммы/числа могут содержать $ и , (например, $1,234.56) — они удаляются автоматически. Строка с проблемой (неверная дата, нечисловая сумма, отсутствующая категория и т.д.) пропускается с предупреждением, а не прерывает весь импорт; последняя выведенная строка всегда сообщает, сколько строк загружено, а сколько пропущено.
Повторный запуск init_db.py health выполняет апсерт по дате (безопасно перезапускать по мере добавления дней); init_db.py finance каждый раз добавляет новые строки, поскольку у реестра нет естественного уникального ключа. Добавьте --replace к любой из команд, чтобы вместо этого сначала очистить таблицу.
3. (Необязательно) Проверка в изоляции
Прежде чем подключать сервер к какому-либо клиенту, вы можете открыть MCP Inspector и вызвать инструменты напрямую в браузере:
fastmcp dev inspector server.py4. Подключение к Claude Desktop
Claude Desktop запускает локальные MCP-серверы как подпроцессы и общается с ними через stdio на основе JSON-файла конфигурации:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Можно перейти к нему прямо из приложения: Настройки → Разработчик → Изменить конфигурацию.
Добавьте запись в mcpServers, используя абсолютные пути — важно указать command на интерпретатор Python внутри только что созданного виртуального окружения, а не голый python. Claude Desktop запускает серверы в минимальном окружении, которое не гарантированно наследует PATH вашей оболочки или активированный venv, поэтому голый "python" часто разрешается в неправильный интерпретатор (или вообще ни в какой), и сервер молча не запускается.
{
"mcpServers": {
"quantified-self": {
"command": "/absolute/path/to/quantified-self-mcp/.venv/bin/python3",
"args": ["/absolute/path/to/quantified-self-mcp/server.py"]
}
}
}В Windows это обычно:
{
"mcpServers": {
"quantified-self": {
"command": "C:\\absolute\\path\\to\\quantified-self-mcp\\.venv\\Scripts\\python.exe",
"args": ["C:\\absolute\\path\\to\\quantified-self-mcp\\server.py"]
}
}
}Сохраните файл, затем полностью завершите и снова откройте Claude Desktop (не просто закройте окно — для загрузки изменений конфигурации требуется перезапуск). Найдите значок молотка/инструментов в поле чата, чтобы убедиться, что quantified-self подключен.
FastMCP также включает CLI-ярлык, который редактирует этот файл за вас — fastmcp install claude-desktop server.py --name "Quantified Self" — стоит попробовать (выполните fastmcp install claude-desktop --help для актуальных флагов), но ручной JSON выше всегда будет работать и его проще отлаживать, если что-то не так. У Anthropic также есть более новый формат упаковки "Desktop Extension" в один клик для локальных MCP-серверов; для личного использования вроде этого он не обязателен, но о нем полезно знать, если вы захотите поделиться этим сервером с кем-то, кому неудобно редактировать JSON.
5. (Необязательно) Запуск в Docker / размещение на Glama
#5-optional-run-it-in-docker--host-it-on-glama
Включен Dockerfile для тех, кто хочет запускать это в контейнере вместо локального venv — включая размещение на Glama, который собирает проект напрямую из Dockerfile репозитория, когда он присутствует.
docker build -t quantified-self-mcp .
docker run -i --rm -v "$PWD/data:/app/data" quantified-self-mcpОбраз — только Python (python:3.12-slim + pip install -r requirements.txt); в этом проекте нет Node.js. HEALTH_DB_PATH и FINANCE_DB_PATH по умолчанию указывают на /data/health.db и /data/finance.db внутри контейнера, чтобы смонтированный том (например, монтирование /data на Glama) сохранял ваши базы данных между передеплоями — см. раздел Configuration в начале server.py, чтобы переопределить их.
glama.json намеренно минимален — он просто указывает Glama на этот репозиторий; Dockerfile является фактическим источником истины для того, как образ собирается и запускается (python server.py, через stdio). Более ранняя версия glama.json пыталась вручную настроить универсальный buildpack (голый базовый образ debian:trixie-slim плюс ручные шаги сборки pip install и cmdArguments) вместо использования Dockerfile — в том образе не был надежно обеспечен интерпретатор Python, и платформа откатывалась к попытке запустить несуществующую в этом репозитории Node.js-точку входа (Cannot find module '/app/server.js'). Наличие Dockerfile устраняет эту неоднозначность.
Модель конфиденциальности — что на самом деле означает "локально"
Здесь стоит быть точным, поскольку это весь смысл проекта:
Обе SQLite-базы данных находятся только на вашем диске, в папке
data/этого проекта. Сервер не совершает сетевых вызовов, не имеет телеметрии и ничего никуда не синхронизирует.server.pyоткрывает обе базы данных в режиме только для чтения SQLite (не просто "не выполняет запись" — соединение физически не может этого сделать). Даже ошибочный или вредоносный промпт не может заставить ни один из инструментов изменить ваши данные; толькоinit_db.py, запускаемый вами из терминала, когда-либо записывает в них.Когда MCP-клиент вызывает один из этих инструментов, конкретные строки, возвращенные для этого запроса, становятся частью разговора, отправляемого модели, которая отвечает — это механизм, с помощью которого MCP предоставляет модели информацию. Если вы используете Claude Desktop с размещенной моделью, это означает, что любой фрагмент данных, о котором вы спрашиваете, отправляется в Anthropic для этого хода, как и все остальное, что вы вводите в чат.
Таким образом, "локально" здесь означает: ваш полный набор данных никогда не хранится и не синхронизируется ни с какой сторонней базой данных, и ничего не передается, пока инструмент фактически не вызван — и даже тогда передаются только строки, возвращаемые этим конкретным вызовом, а не вся база данных. Это не означает полностью офлайн-режим от начала до конца. Для этого вам понадобится полностью локальная среда выполнения модели (например, Ollama) в паре с MCP-совместимым клиентом.
Устранение неполадок
Сервер не появляется в Claude Desktop: проверьте, что
commandиargsиспользуют абсолютные пути, убедитесь, что путь к Python в venv действительно существует, и что вы полностью завершили и снова открыли приложение. Журналы находятся в~/Library/Logs/Claude(macOS) или%APPDATA%\Claude\logs(Windows) —mcp-server-quantified-self.logпокажет stderr именно этого сервера.Инструмент сообщает "No health/finance database found": сначала запустите
init_db.pyдля этого набора данных — инструменты намеренно не создают пустые базы данных автоматически, чтобы вы не получали молча пустые ответы.Изменения в
server.pyне вступают в силу: перезапустите Claude Desktop; он запускает процесс сервера один раз за сеанс приложения, а не за сообщение.Размещение на Glama завершается ошибкой
Cannot find module '/app/server.js': это означает, что развертывание откатилось к среде выполнения Node.js вместо Python — в этом репозитории нетserver.js. Собирайте из включенногоDockerfile(см. "Запуск в Docker / размещение на Glama" выше), а не из универсальной конфигурации buildpack, чтобы платформа надежно выполнялаpython server.py.
Расширение
Несколько естественных следующих шагов, если хотите — ничего из этого не реализовано, просто направление, в которое ведет паттерн:
Написать инструменты записи (
log_expense,log_daily_metric), чтобы записи можно было добавлять через LLM, а не напрямую через CSV/SQL.Больше метрик — вес, тренировки, настроение, потребление воды — каждая это просто еще одна таблица и еще один инструмент чтения.
Инструмент "бюджет против факта", сравнивающий итоги
read_finance_dataс заданными вами целями.
Available Tools
3 toolsclear_metricA
Blank out (set to null) a single metric for a single day, without touching that day's other metrics. The counterpart to log_daily_metric for undoing a bad value — e.g. a mood logged for the wrong day, or a weight entered with the wrong units.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day to clear a field for, formatted YYYY-MM-DD. | |
| field | Yes | Which metric to blank out. One of: steps, sleep_hours, resting_heart_rate, weight_kg, workout_minutes, mood, water_ml. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It clearly communicates the mutation ('blank out'), the exact scope (one metric, one day), and the guarantee that other metrics are untouched. It could add permanence or no-op behavior details, but the core destructive semantics are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the action and scope. The examples are meaningful and help clarify intent without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and an output schema, the description covers the operation's purpose, scope, and usage context. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents date formatting and the allowed field values. The description adds contextual examples but no new parameter-level semantic detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Blank out (set to null)') and names the exact resource: a single metric for a single day. It also explicitly distinguishes itself from log_daily_metric, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames this tool as the counterpart to log_daily_metric for undoing bad values, with concrete examples. This gives clear when-to-use guidance and implies the alternative for normal metric logging.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_daily_metricA
Record one or more health metrics for a single day, creating that day's row if it doesn't already have one.
Only the metrics you pass are written — anything left as null is not touched, so logging just today's mood doesn't erase today's steps if they were set earlier. To undo a value logged by mistake, use clear_metric rather than trying to overwrite it with a placeholder.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The day to log, formatted YYYY-MM-DD. | |
| mood | No | Mood rating on a 1-10 scale. | |
| steps | No | Step count for the day. 0-200,000. | |
| water_ml | No | Water intake in millilitres. 0-10,000. | |
| weight_kg | No | Body weight in kilograms. 1-500. | |
| sleep_hours | No | Hours of sleep. 0-24. | |
| workout_minutes | No | Minutes of exercise. 0-1,440. | |
| resting_heart_rate | No | Resting heart rate in bpm. 20-250. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and succeeds: it discloses row creation, partial-write semantics, and the fact that nulls are untouched. This is exactly the kind of behavioral context an agent needs before calling a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core purpose is front-loaded, and every sentence contributes either behavioral semantics or usage guidance. The description is compact yet rich.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (per context), so return-value prose is unnecessary. The description covers creation, partial updates, null behavior, and the correct sibling for undo. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving the baseline 3, but the description adds meaningful parameter behavior beyond the schema: only passed metrics are written, nulls are not touched, and at least one metric is implied. This improves the agent's understanding of how the nullable parameters actually behave.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Record one or more health metrics for a single day.' It also distinguishes itself from siblings by explicitly naming clear_metric for undo operations, so an agent can tell logging from reading or clearing without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool (logging metrics for a day) and when not to ('To undo a value logged by mistake, use clear_metric'). It also explains the partial-update behavior, which prevents agents from thinking they must re-send all values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_health_dataA
Read daily health metrics from the local database: steps, sleep hours, resting heart rate, weight (kg), workout minutes, mood, and water intake (ml).
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | Last day to include, formatted YYYY-MM-DD. Defaults to today. | |
| start_date | No | First day to include, formatted YYYY-MM-DD. Defaults to 30 days before end_date. Ranges over ~10 years are rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden. It clearly indicates the operation is a read from a local database, implying no mutation, and enumerates the data domains. It does not disclose potential behaviors like pagination, empty-result handling, or timezone assumptions, but output schema plus 'read' cover the essential safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states the operation, source, and the complete list of metrics with units. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no required parameters, a rich input schema, and an output schema, the description is nearly complete: it identifies the source and the returned metric categories. The main missing piece is explicit routing guidance versus siblings, which was already penalized under usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the start_date/end_date parameters have detailed descriptions including format, defaults, and the ~10-year restriction. The tool description itself adds no parameter-level information, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Read' with a clear resource, 'daily health metrics from the local database', and lists the exact metrics included. This differentiates it from the write/delete siblings log_daily_metric and clear_metric.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to choose this tool over its siblings, such as 'use for retrieving metrics as opposed to logging or clearing them.' Although the name implies a read operation, no when-to-use or exclusion criteria are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
2 tool updates
v1.0.4- Added
clear_metric - Added
log_daily_metric
2 tool updates
v1.0.3- Removed
read_finance_data - Changed
read_health_data1 field changed- changed
Input schema / properties / start_date / descriptionPrevious value: -"First day to include, formatted YYYY-MM-DD.\n Defaults to 30 days before end_date."New value: +"First day to include, formatted YYYY-MM-DD.\nDefaults to 30 days before end_date. Ranges over ~10 years are rejected."
1 tool update
v1.0.1- Changed
read_finance_data1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category name to filter to (case-insensitive,\n exact match — e.g. \"Groceries\"). Omit to include all categories."New value: +"Optional category name to filter to (case-insensitive,\n exact match — e.g. \"Groceries\"). A category with no matching\n rows returns an empty \"transactions\" list, not an error — this\n usually means a typo or a category that isn't in the ledger.\n Omit to include all categories."
2 tool updates
v1.0.0- First observed
read_finance_data - First observed
read_health_data
TDQS
Each tool maps to a distinct operation: reading, logging, and clearing metrics. There is no overlap or ambiguity between them.
All tool names are snake_case and follow a verb-first pattern. The object names vary slightly ('health_data' vs 'daily_metric' vs 'metric'), but the intent remains clear.
Three tools is well-scoped for a simple quantified-self server: read, log, and clear. Each tool serves a necessary purpose without redundancy.
Core workflow coverage is solid: read metrics, write metrics, and undo mistakes. Minor gaps exist, such as no way to delete an entire day or list supported metric types, but these are workable limitations.
Maintenance
Related MCP Connectors
- Era ContextOAuthapp.era
Personal finance, bank account, and shared memory connector for Claude, ChatGPT, Gemini Spark & more
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Your personal data for AI — Telegram, bank, courses, Zoom & more, scoped to you.
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server that allows users to query and analyze their Apple Health data using SQL and natural language, utilizing DuckDB for fast and efficient health data analysis.23491564MIT
- AlicenseNot gradedqualityCmaintenanceLoads Apple Health export data into a local SQLite database and exposes tools to query health metrics and workout records via natural language.3MIT
- AlicenseNot gradedqualityCmaintenanceTurns a personal-finance SQLite database into typed, schema-validated tools that an AI assistant can call directly, letting you manage accounts, transactions, budgets, debts, investments, tax estimates, and goals through natural language.47MIT
- AlicenseNot gradedqualityDmaintenanceEnables querying personal data synced from services like Lunch Money and Strava using SQL via Claude.151MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Thecimal/quantified-self-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server