Skip to main content
Glama
StefanOOE

mcp-tirepressure

by StefanOOE

mcp-tirepressure

Local MCP server (FastMCP, stdio) implementing a SRAM-like tire pressure formula as tools for the Hermes Agent.

Note: This implementation is based on the formula from the SRAM AXS Tire Pressure Calculator. The formula was reverse-engineered from the SRAM web client (August 2026). Not an official SRAM product.

Safety Notice

Important: The calculated tire pressures are recommendations based on a simplified physical formula. They do not replace the manufacturer's specifications on the tire or your own riding feel. Always check the maximum tire pressure (on the tire sidewall) and, when in doubt, increase the pressure by 0.2–0.3 bar. Use at your own risk.

Related MCP server: Training Condition Check MCP

Setup

python -m venv .venv
.venv/bin/pip install -e ".[dev]"

Tools

  • get_bikes() — all 5 bike profiles

  • get_bike(name) — a single bike profile

  • calc_pressure(bike, rider_weight, bike_weight, surface) — front/rear pressure in bar

  • get_recommended_pressure(bike, rider_weight, bike_weight, lat, lon) — with live weather

Registration in Hermes

mcp_servers:
  mcp-tirepressure:
    command: /path/to/mcp-tirepressure/.venv/bin/python
    args: ["-m", "mcp_tirepressure"]

Tool Reference

get_bikes()

Lists all 5 configured bike profiles. Return: [{name, tire_width, inner_rim_width, wheel_diameter, ride_style, rim_type, tire_casing, bike_weight}, ...]

get_bike(name: str)

Returns a single bike profile. Args: name — key from get_bikes() (e.g. "bmc-teamachine"). Return: profile as dict.

calc_pressure(bike, rider_weight, bike_weight, surface="DRY")

Calculates the recommended tire pressure (front/rear) in bar. Args:

  • bike — bike name

  • rider_weight — rider weight in kg

  • bike_weight — bike weight in kg

  • surface"DRY", "WET", or "SNOW" (default: "DRY") Return: {bike, surface, front_bar, rear_bar, notes}

One-call recommendation with live weather (Open-Meteo). Args:

  • bike, rider_weight, bike_weight — as above

  • lat, lon — coordinates (e.g. Vienna: 48.2082, 16.3738) Return: {bike, surface, weather_reason, front_bar, rear_bar, notes}

Formula

The calculation is based on the formula from the SRAM AXS Tire Pressure Calculator:

P = 10^8.6847 / C^1.3046 × (1 + (2.2 × (W_bike + W_rider) - 180) × 0.0025)
    × R_pos × R_rim × R_style × R_surface × R_casing × 68.9476 × 0.001
  • C — tire circumference in mm (derived from wheel diameter + effective width)

  • R_pos — front/rear wheel factor (0.94 / 1.0)

  • R_rim — rim type factor (CROCHET, STRAIGHT_SIDE, TUBES, TUBULAR)

  • R_style — riding style factor (ROAD=1.0, GRAVEL=0.9, MTB=0.9–1.1)

  • R_surface — surface condition (DRY=1.0, WET=0.9, SNOW=0.5)

  • R_casing — tire casing (THIN=1.025, STANDARD=1.0, REINFORCED=0.95, DOUBLE=0.9)

  • 68.9476 — PSI → bar conversion (÷ 1000)

Details: src/mcp_tirepressure/core.py

Hookless Cap

For rim_type == STRAIGHT_SIDE (hookless), pressure is capped at max 4.96 bar (72 PSI). A note in the notes field indicates whether the cap was triggered.

Example (CLI)

.venv/bin/python -c "
from mcp_tirepressure.server import calc_pressure
import json
print(json.dumps(calc_pressure('bmc-teamachine', 93.0, 8.0, 'DRY'), indent=2))
"

License

MIT

Tool DescriptionsA

Average 3.6/5 across 4 of 4 tools scored.

Server CoherenceA
Disambiguation3/5

get_bikes and get_bike are clearly distinct list-vs-detail tools, but calc_pressure and get_recommended_pressure overlap noticeably. Both return front/rear pressure recommendations; the key difference is explicit surface vs live weather, which is described but could still cause selection ambiguity.

Naming Consistency4/5

Tool names mostly follow a get_/calc_ verb_noun pattern, and the get_bikes/get_bike pair is nicely consistent. calc_pressure uses an abbreviation rather than calculate_pressure and get_recommended_pressure includes an adjective, so there are minor deviations but no chaotic mixing.

Tool Count5/5

Four tools is well-scoped for a niche tire-pressure server with no bloat or obvious excess. Each tool has a distinct role in listing bikes, retrieving bike details, manual calculation, and weather-driven recommendation.

Completeness4/5

The core workflow of retrieving bike profiles and getting pressure recommendations is covered, including both manual surface input and live weather. The main gap is the lack of bike profile creation/update/delete, though profiles may be externally configured.

Available Tools

4 tools
calc_pressureB

Calculate recommended tire pressure (front/rear in bar) for a given bike, rider weight, and surface (DRY/WET/SNOW). Applies hookless rim cap where needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
bikeYes
surfaceNoDRY
bike_weightYes
rider_weightYes
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior itself. It conveys that this is a non-mutating calculation and adds the hookless-rim-cap behavior, which is useful. Yet it does not describe return shape, possible failure cases, or assumptions about units for the numeric weights, so transparency is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, dense sentences with every phrase contributing. The core calculation and the special hookless-rim behavior are front-loaded, and there is no redundant boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple calculator: it names the core inputs and output units. However, one required parameter (bike_weight) is missing from the prose, there is no output schema, and no assumptions or error conditions are documented, so an agent could still make incorrect assumptions about required input format or result structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning by enumerating surface values (DRY/WET/SNOW) and specifying pressure in bar, but it omits the required paraméter bike_weight entirely and gives no units for rider_weight or bike_weight. This is a meaningful gap for an agent trying to invoke correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Calculate'), the resource ('tire pressure'), and the output unit ('bar'), which distinguishes it from generic names. However, it does not explicitly differentiate itself from the sibling get_recommended_pressure, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for a given bike, rider weight, and surface' implies when to use the tool, but there is no explicit guidance about when not to use it or when a sibling like get_recommended_pressure would be better. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bikeA

Get a single bike profile by name. Returns specs + bike weight.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the behavioral disclosure burden. It communicates a read operation and reveals return content (specs + bike weight). It does not cover not-found or error behavior, which is a minor gap for a simple GET-like tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no unnecessary words. The core action and return summary are front-loaded, making it fast for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description gives enough to invoke the tool and understand the response. It lacks detail on what 'specs' includes, but that does not affect correct selection or invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description slightly compensates by stating the lookup is by name, giving the sole parameter purpose. It adds no format, uniqueness, or exact-match constraints, so the added value over the bare schema is modest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Get', resource 'bike profile', and 'by name' identifies the lookup mechanism. The word 'single' implicitly distinguishes from the sibling get_bikes, though no sibling is explicitly named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage: use this tool to fetch one bike by name. It does not explicitly state when to prefer it over get_bikes or the pressure tools, so the agent must infer the boundary from sibling names and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bikesA

List all configured bike profiles (name, tire/rim specs, style).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden, and it clearly conveys a non-mutating list behavior plus the scope ('configured') and included fields. It does not mention response details or edge cases, but for a zero-parameter read operation the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The entire description is one well-structured sentence with no filler. It front-loads the action and resource, then appends the key output fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list operation with an output schema, the description provides enough context: what is returned, the scope, and the fields. No prerequisite, input, or alternative-usage details are needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the description does not need to clarify parameter meaning. It instead clarifies what the returned list contains, adding value beyond the empty input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('all configured bike profiles') and enumerates the returned fields (name, tire/rim specs, style). This distinguishes it from singular get_bike and calculation-focused siblings like calc_pressure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'List all' implies the tool is for retrieving the full set of bike profiles, but it does not explicitly contrast it with get_bike for a single profile or with pressure-related tools. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

A
license - permissive license
A
quality
B
maintenance

Maintenance

0Maintainers
No issuesResponse time
0Releases (12mo)
Commit activity

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

Related MCP Servers

View all related MCP servers

Latest Blog Posts

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/StefanOOE/mcp-tirepressure'

If you have feedback or need assistance with the MCP directory API, please join our Discord server