# Fixando public price MCP

> Read-only structured access to the same service price estimates published on Fixando. No account, API key or OAuth is required.

## Connection

- Endpoint: `https://www.fixando.com.au/mcp`
- Transport: stateless Streamable HTTP, JSON responses.
- Method: POST. GET on the MCP endpoint returns 405.
- Content-Type: `application/json`
- Accept: `application/json, text/event-stream`
- Supported protocol versions: 2025-11-25, 2025-06-18, 2025-03-26.
- No session ID or persistent SSE channel is required.
- Human guide: [/mcp/docs](/mcp/docs)
- Website retrieval guidance: [/llms.txt](/llms.txt)

This reference is for agents with an MCP client. Standard HTTP crawlers can read public HTML price pages and sitemaps; they do not execute MCP tools automatically. The MCP is for public price data, not a general website crawler or access to private marketplace data.

## Protocol sequence

1. POST `initialize` with a supported version, client capabilities and clientInfo.
2. Read the negotiated protocolVersion from the response.
3. Send `notifications/initialized` without an id; successful notifications have HTTP 202 and no body.
4. Send `MCP-Protocol-Version` with the negotiated version on subsequent requests.
5. Call `tools/list` for the current public tool definitions.
6. Call `tools/call` with a tool name and its arguments.

Initialization:

```json
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"example-agent","version":"1.0"}}}
```

Notification:

```json
{"jsonrpc":"2.0","method":"notifications/initialized"}
```

Tool discovery:

```json
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
```

## Price retrieval workflow

1. Use `get_markets` to discover supported market codes, languages, currencies and endpoints. Do not assume every country has price data.
2. Use `search_price_categories` to discover root, parent or service price-page candidates for the selected market. Search reuses website keyword matching, connecting-word normalisation and aliases in the selected language. Exact category names rank first; root, parent and service candidates remain distinct. Do not invent category IDs or page slugs.
3. For a location-specific query, use `search_price_locations`. A municipality's cc ID is scoped to its dd district; retain both IDs. dd=0 means no district restriction for location discovery.
4. Use `get_prices` with a returned canonical page URL, or with site_code, catid and optional dd/cc. A URL cannot be combined with category/location IDs. A URL and optional explicit market/language must agree.
5. For search pagination, pass next_offset as the next offset and keep the same filters. Stop when next_offset is null. Fetch only the pages needed for the query; do not enumerate every category/location combination without a reason.
6. Cite the canonical url returned by get_prices as the public source.
7. If the user wants tailored quotes, offer request_url. It opens the existing request form or service-selection step. Confirm the service and postcode with the user; opening the link never submits a request. The requested location is not automatically prefilled.

Market discovery:

```json
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_markets","arguments":{}}}
```

Example service search in Portugal:

```json
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"search_price_categories","arguments":{"site_code":"pt","query":"limpeza","limit":5}}}
```

When a canonical public price-page URL is already known, get_prices can resolve it directly; a prior search is not required.

## Interpret and cite the response

Successful tools return structuredContent plus the same JSON serialized in a text content block. Price lookups include status, resolved market/language, currency, canonical url, category, location and a prices array.

- Preserve currency, billing_type_id and the localised unit. billing_basis supplies a language-independent quantity basis where established: hour, day, word, session or square_metre. A null basis denotes an unspecified quantity basis or a pricing condition; negotiable is not per project. Do not assume quantity multiplication is appropriate without confirming the scope.
- minimum, central and maximum are the rounded values published on the website.
- central_statistic is median for request-based calculations and mean for legacy data.
- range_statistic is p10_p90 for request-based calculations and legacy_range for legacy data. Do not describe P10-P90 as a measured minimum/maximum or a guaranteed quote.
- date identifies the published logical snapshot, including unchanged records carried forward by incremental publication. It is not an individual quote date or an invented fixed observation window.
- category and location describe the requested destination for navigation. They do not establish a locally observed sample. Describe amounts as Fixando reference estimates, without inferring local quote counts or observation scope.
- observation_period is the recorded eligibility window: start is inclusive and end exclusive, both YYYY-MM-DD in its recorded timezone. period_status=verified means these boundaries were recorded by the selected calculation. unavailable means they cannot be verified; boundaries and timezone remain null.
- calculated_at is the actual calculation completion time in UTC (RFC 3339), not the time of this response or a later republication. data_as_of is an ingestion watermark and currently remains null. Do not infer a recent-data claim from date or calculated_at.
- request_url preserves market, language and category using the existing web request route, with submit source mcp. Group categories open service selection. request_context.category_status indicates selected or selection_required; location_status=confirmation_required means the user must confirm the postcode. No personal data is placed in the URL.
- status=no_data with an empty prices array is a valid page without sufficient public prices. Do not invent missing numbers or interpret no_data as a zero price.
- Estimates are indicative, not binding quotes. Raw quotes, sample counts and admin-only statistics are unavailable.

## Contract changes

Server version 1.1 adds outputSchema to all four tools, billing_basis, observation metadata and the request handoff. Internal resolution diagnostics have been removed from the public result. Clients should use the requested category/location and neutral reference-estimate wording. Existing numeric fields, canonical citation URLs and the JSON text compatibility path remain available.

## Limits and retry behaviour

- Search page size: 20 by default, maximum 50.
- Request limit: 120 per client IP per minute, shared across tools and markets.
- HTTP 429: wait for Retry-After before retrying. Do not change IPs or markets to evade the limit.
- HTTP 503: temporary unavailability. Back off; do not retry in a tight loop.
- JSON-RPC errors describe protocol problems. isError=true describes a failed tool call; use its message to correct arguments.
- Save X-Request-ID for diagnostics. Access metadata is recorded in a dedicated log; full response payloads are not retained.
- Respect robots directives and access controls when retrieving linked HTML pages. This documentation does not grant access to private pages.

## Current public tool schemas

The definitions below are generated from the same registry used by tools/list. tools/list is authoritative if a previously fetched copy of this document differs.

```json
[
    {
        "name": "get_markets",
        "description": "List supported Fixando price markets, currencies, languages and MCP endpoints. Start here to select a site_code.",
        "inputSchema": {
            "type": "object",
            "properties": {},
            "required": [],
            "additionalProperties": false
        },
        "outputSchema": {
            "type": "object",
            "properties": {
                "markets": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "site_code": {
                                "type": "string"
                            },
                            "name": {
                                "type": "string"
                            },
                            "default_lang": {
                                "type": "string"
                            },
                            "languages": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "currency": {
                                "type": "string"
                            },
                            "endpoint": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "site_code",
                            "name",
                            "default_lang",
                            "languages",
                            "currency",
                            "endpoint"
                        ],
                        "additionalProperties": false
                    }
                }
            },
            "required": [
                "markets"
            ],
            "additionalProperties": false
        },
        "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
        }
    },
    {
        "name": "search_price_categories",
        "description": "Find root, parent and service price-page candidates by name, optionally for a location. Includes all routed pages regardless of SEO indexing. Use get_prices to check price availability; discovery does not guarantee data.",
        "inputSchema": {
            "type": "object",
            "properties": {
                "site_code": {
                    "type": "string",
                    "description": "Market code returned by get_markets, for example pt or de.",
                    "maxLength": 3
                },
                "lang": {
                    "type": "string",
                    "description": "Supported market language; defaults to the market language.",
                    "maxLength": 10
                },
                "query": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Optional name or keyword search; category search reuses website aliases and connecting-word normalisation."
                },
                "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                },
                "offset": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100000
                },
                "kind": {
                    "type": "string",
                    "maxLength": 7,
                    "enum": [
                        "root",
                        "parent",
                        "service"
                    ],
                    "description": "Optional category hierarchy level."
                },
                "dd": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "District ID from search_price_locations; 0 means national."
                },
                "cc": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Municipality ID from search_price_locations; requires its district dd."
                }
            },
            "required": [
                "site_code"
            ],
            "additionalProperties": false
        },
        "outputSchema": {
            "type": "object",
            "properties": {
                "site_code": {
                    "type": "string"
                },
                "lang": {
                    "type": "string"
                },
                "items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "catid": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "name": {
                                "type": "string"
                            },
                            "kind": {
                                "enum": [
                                    "root",
                                    "parent",
                                    "service"
                                ]
                            },
                            "url": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "catid",
                            "name",
                            "kind",
                            "url"
                        ],
                        "additionalProperties": false
                    }
                },
                "total": {
                    "type": "integer",
                    "minimum": 0
                },
                "next_offset": {
                    "type": [
                        "integer",
                        "null"
                    ],
                    "minimum": 0
                },
                "retry_hint": {
                    "type": [
                        "string",
                        "null"
                    ]
                }
            },
            "required": [
                "site_code",
                "lang",
                "items",
                "total",
                "next_offset",
                "retry_hint"
            ],
            "additionalProperties": false
        },
        "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
        }
    },
    {
        "name": "search_price_locations",
        "description": "Find districts and municipalities in one market. Use returned dd/cc IDs with get_prices or search_price_categories. Optionally restrict municipalities to dd.",
        "inputSchema": {
            "type": "object",
            "properties": {
                "site_code": {
                    "type": "string",
                    "description": "Market code returned by get_markets, for example pt or de.",
                    "maxLength": 3
                },
                "lang": {
                    "type": "string",
                    "description": "Supported market language; defaults to the market language.",
                    "maxLength": 10
                },
                "query": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Optional name or keyword search; category search reuses website aliases and connecting-word normalisation."
                },
                "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                },
                "offset": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100000
                },
                "dd": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "District ID from search_price_locations; 0 means national."
                }
            },
            "required": [
                "site_code"
            ],
            "additionalProperties": false
        },
        "outputSchema": {
            "type": "object",
            "properties": {
                "site_code": {
                    "type": "string"
                },
                "lang": {
                    "type": "string"
                },
                "items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "dd": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "cc": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "name": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "dd",
                            "cc",
                            "name"
                        ],
                        "additionalProperties": false
                    }
                },
                "total": {
                    "type": "integer",
                    "minimum": 0
                },
                "next_offset": {
                    "type": [
                        "integer",
                        "null"
                    ],
                    "minimum": 0
                }
            },
            "required": [
                "site_code",
                "lang",
                "items",
                "total",
                "next_offset"
            ],
            "additionalProperties": false
        },
        "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
        }
    },
    {
        "name": "get_prices",
        "description": "Read the same current reference prices published on a Fixando price page. Supply an absolute HTTPS price-page url OR site_code with catid and optional dd/cc; do not mix URL and IDs. Returns rounded values, billing basis, statistics, verified observation windows when available and a request_url opening the existing draft/selection flow. The requested destination does not prove locally observed data. Confirm location with the user; no request is submitted by this tool or by opening the link. A valid page without sufficient data returns no_data. No raw quotes, sample counts, internal resolution or admin-only statistics.",
        "inputSchema": {
            "type": "object",
            "properties": {
                "url": {
                    "type": "string",
                    "maxLength": 2048,
                    "description": "Absolute HTTPS Fixando price-page URL; never fetched remotely."
                },
                "site_code": {
                    "type": "string",
                    "description": "Market code returned by get_markets, for example pt or de.",
                    "maxLength": 3
                },
                "lang": {
                    "type": "string",
                    "description": "Supported market language; defaults to the market language.",
                    "maxLength": 10
                },
                "catid": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Root, parent or service category ID from search_price_categories."
                },
                "dd": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "District ID from search_price_locations; 0 means national."
                },
                "cc": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Municipality ID from search_price_locations; requires its district dd."
                }
            },
            "required": [],
            "additionalProperties": false,
            "oneOf": [
                {
                    "required": [
                        "url"
                    ],
                    "not": {
                        "anyOf": [
                            {
                                "required": [
                                    "catid"
                                ]
                            },
                            {
                                "required": [
                                    "dd"
                                ]
                            },
                            {
                                "required": [
                                    "cc"
                                ]
                            }
                        ]
                    }
                },
                {
                    "required": [
                        "site_code",
                        "catid"
                    ],
                    "not": {
                        "required": [
                            "url"
                        ]
                    }
                }
            ]
        },
        "outputSchema": {
            "type": "object",
            "properties": {
                "status": {
                    "enum": [
                        "available",
                        "no_data"
                    ]
                },
                "site_code": {
                    "type": "string"
                },
                "lang": {
                    "type": "string"
                },
                "currency": {
                    "type": "string"
                },
                "url": {
                    "type": "string"
                },
                "category": {
                    "type": "object",
                    "properties": {
                        "catid": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "name": {
                            "type": "string"
                        }
                    },
                    "required": [
                        "catid",
                        "name"
                    ],
                    "additionalProperties": false
                },
                "location": {
                    "type": "object",
                    "properties": {
                        "dd": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "cc": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "district": {
                            "type": [
                                "string",
                                "null"
                            ]
                        },
                        "municipality": {
                            "type": [
                                "string",
                                "null"
                            ]
                        }
                    },
                    "required": [
                        "dd",
                        "cc",
                        "district",
                        "municipality"
                    ],
                    "additionalProperties": false
                },
                "request_url": {
                    "type": "string"
                },
                "request_context": {
                    "type": "object",
                    "properties": {
                        "category_status": {
                            "enum": [
                                "selected",
                                "selection_required"
                            ]
                        },
                        "location_status": {
                            "enum": [
                                "confirmation_required"
                            ]
                        }
                    },
                    "required": [
                        "category_status",
                        "location_status"
                    ],
                    "additionalProperties": false
                },
                "prices": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "billing_type_id": {
                                "type": "integer",
                                "minimum": 0
                            },
                            "unit": {
                                "type": "string"
                            },
                            "billing_basis": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "hour",
                                    "day",
                                    "word",
                                    "session",
                                    "square_metre",
                                    null
                                ]
                            },
                            "currency": {
                                "type": "string"
                            },
                            "minimum": {
                                "type": "number",
                                "minimum": 0
                            },
                            "central": {
                                "type": "number",
                                "minimum": 0
                            },
                            "maximum": {
                                "type": "number",
                                "minimum": 0
                            },
                            "central_statistic": {
                                "enum": [
                                    "median",
                                    "mean"
                                ]
                            },
                            "range_statistic": {
                                "enum": [
                                    "p10_p90",
                                    "legacy_range"
                                ]
                            },
                            "central_formatted": {
                                "type": "string"
                            },
                            "minimum_formatted": {
                                "type": "string"
                            },
                            "maximum_formatted": {
                                "type": "string"
                            },
                            "date": {
                                "type": "string",
                                "description": "Logical publication cutoff, YYYY-MM-DD; not an observation or calculation timestamp."
                            },
                            "observation_period": {
                                "type": "object",
                                "properties": {
                                    "start": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Inclusive eligibility boundary, YYYY-MM-DD."
                                    },
                                    "end": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Exclusive eligibility boundary, YYYY-MM-DD."
                                    },
                                    "timezone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Recorded calculation timezone for the eligibility boundaries."
                                    }
                                },
                                "required": [
                                    "start",
                                    "end",
                                    "timezone"
                                ],
                                "additionalProperties": false
                            },
                            "period_status": {
                                "enum": [
                                    "verified",
                                    "unavailable"
                                ]
                            },
                            "calculated_at": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Actual selected calculation completion in UTC, RFC 3339; null if unknown."
                            },
                            "data_as_of": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Verified ingestion watermark, RFC 3339; currently unavailable (null)."
                            }
                        },
                        "required": [
                            "billing_type_id",
                            "unit",
                            "billing_basis",
                            "currency",
                            "minimum",
                            "central",
                            "maximum",
                            "central_statistic",
                            "range_statistic",
                            "central_formatted",
                            "minimum_formatted",
                            "maximum_formatted",
                            "date",
                            "observation_period",
                            "period_status",
                            "calculated_at",
                            "data_as_of"
                        ],
                        "additionalProperties": false
                    }
                }
            },
            "required": [
                "status",
                "site_code",
                "lang",
                "currency",
                "url",
                "category",
                "location",
                "request_url",
                "request_context",
                "prices"
            ],
            "additionalProperties": false,
            "oneOf": [
                {
                    "properties": {
                        "status": {
                            "enum": [
                                "available"
                            ]
                        },
                        "prices": {
                            "minItems": 1
                        }
                    }
                },
                {
                    "properties": {
                        "status": {
                            "enum": [
                                "no_data"
                            ]
                        },
                        "prices": {
                            "maxItems": 0
                        }
                    }
                }
            ]
        },
        "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
        }
    }
]
```
