inbody-api-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@inbody-api-mcpshow my latest InBody scan results"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
inbody-api-mcp
Hosted version for Claude.ai, ChatGPT, and Grok coming soon. Join the waitlist →
An MCP (Model Context Protocol) server for InBody body-composition data, built on the reverse-engineered mobile REST API used by the InBody Android app.
InBody has no public API and no web UI for personal scan data. This server talks to the same JSON REST endpoints the mobile app uses, exposing your body composition history (body fat, muscle mass, body water, segmental impedance) to any MCP client.
Features
Profile -- identity and baseline metrics (height, weight, age, gender)
Scan history -- chronological summaries (weight, BMI, % body fat, muscle mass)
Full scan metrics -- complete body composition (BCA), BMI/%fat/muscle with normal ranges (MFA), and segmental/multi-frequency impedance (IMP)
Automatic region routing -- resolves the correct regional API host from your country code
Automatic re-authentication -- caches the 24h JWT and re-logs in on expiry
Related MCP server: Withings MCP Server
Quick Start
1. Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh2. Set credentials
export INBODY_LOGIN_ID="3026323617" # registration phone number, digits only
export INBODY_LOGIN_PW="your-password"
export INBODY_COUNTRY_CODE="US" # ISO country code (default US)
INBODY_LOGIN_IDis the phone number used at registration, not your email -- digits only, no country code or+(e.g.3026323617). InBody keys login on the phone number; the email is only returned as profile data. An email value will fail login withEmptyData.
3. Configure your MCP client
uvx downloads and runs the server on demand -- no separate install step.
OpenCode (opencode.json)
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"inbody": {
"type": "local",
"command": ["uvx", "inbody-api-mcp"],
"environment": {
"INBODY_LOGIN_ID": "{env:INBODY_LOGIN_ID}",
"INBODY_LOGIN_PW": "{env:INBODY_LOGIN_PW}",
"INBODY_COUNTRY_CODE": "US"
},
"enabled": true
}
}
}Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"inbody": {
"command": "uvx",
"args": ["inbody-api-mcp"],
"env": {
"INBODY_LOGIN_ID": "3026323617",
"INBODY_LOGIN_PW": "your-password",
"INBODY_COUNTRY_CODE": "US"
}
}
}
}Available Tools
Tool | Description |
| User identity and baseline metrics (height, weight, age, gender) |
| Total number of scans on the account |
| Chronological scan summaries (weight, BMI, % body fat, muscle mass) |
| Full metric set for one scan (BCA / MFA / IMP blocks) |
This server is read-only: no write or delete endpoints are exposed.
How It Works
This server communicates with the regional *.lookinbody.com REST API -- the
same backend used by the InBody Android app (v2.8.31). The API was
reverse-engineered by capturing app traffic with mitmproxy and confirming
payload shapes against the live API.
The auth flow:
POST /CommonAPI/GetCountryInfoV2(onappapicommon.lookinbody.com) returns a per-country host table. TheType == "API"row for your ISO country code gives the regional API base (US ->appapiusav2.lookinbody.com) and the numeric phone code used in request bodies.POST /V2/Main/GetLoginWithSyncDataPartV2exchanges the login ID + password for a 24-hour JWT, a refresh token, and the account UID.Subsequent calls send
Authorization: Bearer <JWT>. The client re-authenticates automatically when the token expires.
Each scan record nests three blocks: BCA (body composition analysis -- body water, protein, mineral, fat, segmental water), MFA (BMI, % body fat, skeletal muscle mass, WHR with normal ranges), and IMP (raw impedance per frequency and body segment).
Python API
You can use the client directly:
from inbody_api_mcp.client import InBodyClient
client = InBodyClient()
# Total number of scans
count = client.get_scan_count()
# Recent scans (newest first), paginated
scans = client.get_scans(number=20, index=0)
# User profile
profile = client.get_user_info()Transport
stdio only. MCP clients (OpenCode, Claude Desktop) spawn the stdio process
directly via uvx/uv.
License
MIT
Available Tools
4 toolsget_profileARead-onlyIdempotent
Get the InBody user profile.
Returns identity and baseline body metrics (name, gender, age, height, weight, email) useful for interpreting scan results.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint and idempotentHint; description adds value by stating return values are 'useful for interpreting scan results', enhancing context beyond annotations.
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?
Two concise sentences, front-loaded with main action, no 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?
Fully adequate for a zero-parameter tool with output schema; describes purpose and return value utility.
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?
No parameters, so baseline 4; description doesn't need to add param info, and schema coverage is 100%.
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?
Description clearly states 'Get the InBody user profile' and lists specific returned data (name, gender, age, height, weight, email), distinguishing it from sibling scan tools.
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?
No explicit when-to-use or alternatives, but purpose is clear from description and sibling names imply this is for profile info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scanARead-onlyIdempotent
Get the full metric set for a single InBody scan.
Returns the complete BCA (body composition), MFA (BMI/%fat/muscle with norm ranges), and IMP (segmental/multi-frequency impedance) blocks.
Args: raw_datetime: The scan's raw DATETIMES value (YYYYMMDDHHMMSS) from list_scans. Defaults to the most recent scan.
| Name | Required | Description | Default |
|---|---|---|---|
| raw_datetime | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds value by specifying return blocks (BCA, MFA, IMP) and the default behavior (most recent scan if no parameter provided), which goes beyond annotation data. No contradictions.
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 extremely concise: a one-line purpose, a two-line summary of return data, and a one-line parameter description. Every sentence adds value, with no redundancy or fluff.
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?
Given the tool has a single parameter and an output schema (not shown), the description covers all necessary context: what the tool does, what data it returns (blocks), and the parameter semantics. It is fully sufficient 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?
The single parameter raw_datetime is not described in the input schema (0% coverage), but the description fully compensates by detailing its format (YYYYMMDDHHMMSS) and default behavior (most recent scan). This provides complete semantic meaning beyond the schema.
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 clearly states the tool retrieves the full metric set for a single InBody scan, listing specific blocks (BCA, MFA, IMP). While it doesn't explicitly differentiate from sibling tools like list_scans, the purpose is specific and 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?
The description implies the tool is for retrieving details of a single scan, but provides no explicit guidance on when to use it vs. alternatives (e.g., list_scans for browsing, get_scan_count for counting). No 'when-not' or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scan_countARead-onlyIdempotent
Get the total number of InBody scans available for the account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, fully covering safety and idempotency. The description adds minimal behavioral context beyond 'available for the account', which is already implied. No contradictions or additional traits disclosed.
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, direct sentence with no extraneous words. Every word serves a purpose, making it highly efficient.
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 simple count tool with no parameters and an existing output schema, the description is complete. It states the core function, and the output schema covers return value details. Minor gap: does not explicitly state the return type, but it's implied.
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?
There are no parameters, so the description does not need to add parameter semantics. The baseline for zero parameters is 4, and the description is sufficient for a parameterless tool.
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 clearly states the verb 'Get', the resource 'total number of InBody scans', and the scope 'for the account'. It distinctly differentiates from sibling tools like get_scan (single scan) and list_scans (list of scans).
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?
While no explicit when-to-use or when-not-to-use guidance is given, the sibling tool names imply distinct purposes: this tool is for getting a count, while others retrieve specific scans or lists. The context is clear enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scansARead-onlyIdempotent
List InBody scans with headline metrics, newest first.
Returns a slim summary per scan (date, weight, BMI, %body fat, skeletal muscle mass, body fat mass, total body water, equipment). Use get_scan with a scan's raw_datetime for the full metric set.
Args: limit: Maximum number of scans to return (default 20). offset: Pagination offset into the scan history (default 0).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, which inform safety. The description adds that it returns a slim summary per scan with specific fields and is ordered newest first, but does not disclose additional behavioral traits like permissions or side effects beyond what annotations provide.
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 very concise: two short paragraphs and a bulleted list for arguments. It front-loads the main action and includes necessary details without fluff. Every sentence adds value.
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?
Given the simple nature of the tool (list with pagination), the description covers the purpose, output summary, pagination, and pointer to the sibling tool for full data. The annotations confirm read-only and idempotent behavior. An output schema exists, so the description does not need to detail return values. All relevant context is provided.
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?
The input schema has 0% description coverage, so the description compensates fully by explaining each parameter: 'limit: Maximum number of scans to return (default 20)' and 'offset: Pagination offset into the scan history (default 0).' This adds clear semantics beyond the raw schema types.
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 clearly states 'List InBody scans with headline metrics, newest first.' It identifies the verb (list), resource (scans), scope (headline metrics), and ordering (newest first). It also distinguishes from sibling tools by mentioning get_scan for full metrics.
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 explicitly guides the agent to use get_scan for full metric set, providing an alternative. It explains the limit and offset parameters for pagination. However, it does not explicitly state when not to use this tool, but the context is clear.
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.
4 tool updates
v0.1.0- First observed
get_profile - First observed
get_scan - First observed
get_scan_count - First observed
list_scans
TDQS
Each tool has a clearly distinct purpose: get_profile returns user identity and baseline metrics; get_scan returns full metrics for a specific scan; get_scan_count returns the total number of scans; list_scans returns a summary list of scans. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case: get_profile, get_scan, get_scan_count, list_scans. The convention is uniform and predictable.
With 4 tools, the server is well-scoped for an InBody API: it provides profile retrieval, scan listing, scan detail, and scan count. No unnecessary tools, and the count is appropriate for the domain.
The tool set covers the essential read operations for InBody scans and user profile. A minor gap is the lack of filtering or searching scans by date range, but the core workflow (list, get detail, count) is fully supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read wearables and lab health data — sleep, activity, workouts, timeseries, lab tests and orders.
Read-only access to InfluSense influencer discovery, ratings, watchlists, and reports via MCP.
Private health and fitness analytics through a secure remote MCP connection.
1Collect Apple Health data from your wearables through the Context app and query it via MCP
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExposes personal Garmin wellness data through MCP tools for accessing summary, sleep, HRV, heart rate, stress, body battery, and historical data.MIT
- AlicenseNot gradedqualityCmaintenanceEnables reading Withings smart-scale data (weight, body composition, etc.) through MCP tools, with OAuth2 authentication and automatic token refresh.MIT
- FlicenseNot gradedqualityCmaintenanceExposes user profile data from the Sapphire Wellness App via MCP tools for health alerts, personalised recommendations, and partner service subscriptions.-
- FlicenseNot gradedqualityCmaintenanceRead access to Withings scale data, including weight and body composition metrics, through a local MCP server.-
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/rwestergren/inbody-api-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server