Koskamo

LivinIsto MCP

An official MCP server by LivinIsto, a Slovak housing search engine. It allows AI agents to search for residential properties (flats, houses, etc.) for sale or rent, retrieve detailed listing information, and get price-per-square-meter comparisons against local market medians. It also includes a separate intent server for publishing and tracking property search requests.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

LivinIsto MCP logo, by LivinIstoVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by LivinIsto
MCP endpoint (Streamable HTTP)
https://www.livinisto.sk/mcp/zamery
Vendor documentation

What you can do with it

  • Search for properties by type, location, and price range
  • Retrieve detailed information for a specific property listing
  • Get price-per-square-meter verdicts for listings
  • Publish and track user intent for specific housing criteria

Source and maintenance

Vendor evidenceRegistry 0.1.1

Protocol and capabilities

Server
livinisto-zamery 0.1.0
MCP protocol
2025-06-18
Tools
5 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

This server lets a person ask LivinIsto, a Slovak property listings portal (flats, houses, cottages and plots, for sale or rent), to keep watching new listings for them (an "intent", Isto Intents protocol v0.1). Use intent_publish_intent when the user wants to be told about matching properties over time. It returns a consentUrl: the USER must open it, enter their own e-mail there and confirm the link LivinIsto e-mails them — nothing is watched before that. Never ask for or pass the user's e-mail, and never open or fill in the link for them. Keep the returned intentCode in the conversation; use intent_get_intent for the state, intent_list_matches for found properties and intent_withdraw_intent to stop. Use intent_search_offers to see what LivinIsto offers today; when it answers suggestIntent: true, offer intent_publish_intent with the same statement. Matches cover only properties listed on LivinIsto (Slovakia only, EUR) and may be incomplete. Show every url unchanged. Intent servers for other countries and categories are listed in the Isto Intents Registry: https://istointents.org/registry.json.

Tools

5 advertised

intent_publish_intent — Watch new property listings for the user (needs the user's confirmation)
Advertised by the server during the last successful anonymous check.

Use this when the user asks LivinIsto to keep watching Slovak property listings (flats, houses, cottages, plots; for sale or rent) for them over time (e.g. "let me know until March about a 2-room flat in Žilina under 150 000 €"). This does NOT start watching by itself and takes no e-mail address or other personal data: it returns a consentUrl on www.livinisto.sk that the user must open themselves, enter their own e-mail there and confirm by clicking the link LivinIsto e-mails them. Never ask the user for their e-mail in the conversation and never open the link for them. An unconfirmed draft is deleted after 24 hours. Matching properties are e-mailed to the user and can also be read with intent_list_matches using the returned intentCode — keep it in the conversation. hiddenLimitEur is optional: the most the user would pay (for a rental, per month), stored encrypted and never shown to sellers or returned by any tool; pass it only if the user said it. Matches come from listings LivinIsto aggregates from the Slovak market (its own listings and public listings from Slovak property portals), so they cover only properties listed on LivinIsto (Slovakia only, EUR) and may be incomplete.

intent_publish_intent input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "statement"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "sk"
      ],
      "type": "string",
      "description": "Optional language of the replies (texts only; codes, URLs and statuses never change). By default the language of the statement."
    },
    "buyBy": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Date (YYYY-MM-DD) by which the user wants to buy or rent; watching stops after it."
    },
    "statement": {
      "type": "string",
      "maxLength": 300,
      "minLength": 2,
      "description": "What the property MUST be, as one short Slovak phrase, e.g. \"2-izbový byt Žilina do 150 000 €\" or \"prenájom 1-izbový byt Bratislava do 700 €\"."
    },
    "niceToHave": {
      "type": "string",
      "maxLength": 300,
      "description": "Wishes that are not required (never filters), e.g. \"balkón, výťah\"."
    },
    "hiddenLimitEur": {
      "type": "integer",
      "maximum": 10000000,
      "description": "Optional private maximum price in EUR (for a rental, per month); encrypted on receipt and never returned by any tool.",
      "exclusiveMinimum": 0
    }
  }
}
intent_publish_intent output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "intentCode",
    "status",
    "consentUrl",
    "consentExpiresAt",
    "statement",
    "niceToHave",
    "buyBy",
    "hasHiddenLimit",
    "understood",
    "notUnderstood"
  ],
  "properties": {
    "buyBy": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "enum": [
        "awaiting_consent",
        "awaiting_email_confirmation",
        "active",
        "expired",
        "withdrawn"
      ],
      "type": "string",
      "description": "awaiting_consent = the user has not confirmed on the LivinIsto page yet; awaiting_email_confirmation = the user filled in the page and must click the link in the e-mail; active = LivinIsto is watching; expired = the confirmation link, the buy-by date or the intent's validity ran out; withdrawn = cancelled."
    },
    "statement": {
      "type": "string"
    },
    "consentUrl": {
      "type": "string",
      "description": "Page on www.livinisto.sk where the USER confirms the intent with their own e-mail. Show it unchanged."
    },
    "intentCode": {
      "type": "string",
      "description": "Secret code of this intent; use it with intent_get_intent, intent_list_matches and intent_withdraw_intent."
    },
    "niceToHave": {
      "type": [
        "string",
        "null"
      ]
    },
    "understood": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "What LivinIsto will watch for, read from the statement (in Slovak). Tell the person before they confirm."
    },
    "notUnderstood": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Words of the statement that are NOT watched for as a filter. Tell the person."
    },
    "hasHiddenLimit": {
      "type": "boolean",
      "description": "Whether a hidden limit was stored. Its value is never returned."
    },
    "consentExpiresAt": {
      "type": "string",
      "description": "ISO time after which the unconfirmed draft is deleted."
    }
  },
  "additionalProperties": false
}
intent_publish_intent annotations
{
  "title": "Watch new property listings",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
intent_get_intent — Get the state of a property watch
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this to check whether an intent created with intent_publish_intent is already confirmed by the user and active, waiting, expired or withdrawn. Requires the intentCode; returns the statement and dates only — never the user's e-mail, the hidden limit or any other personal data.

intent_get_intent input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "intentCode"
  ],
  "properties": {
    "intentCode": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{32}$",
      "description": "The intentCode returned by intent_publish_intent."
    }
  }
}
intent_get_intent output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "found"
  ],
  "properties": {
    "buyBy": {
      "type": [
        "string",
        "null"
      ]
    },
    "found": {
      "type": "boolean"
    },
    "status": {
      "enum": [
        "awaiting_consent",
        "awaiting_email_confirmation",
        "active",
        "expired",
        "withdrawn"
      ],
      "type": "string",
      "description": "awaiting_consent = the user has not confirmed on the LivinIsto page yet; awaiting_email_confirmation = the user filled in the page and must click the link in the e-mail; active = LivinIsto is watching; expired = the confirmation link, the buy-by date or the intent's validity ran out; withdrawn = cancelled."
    },
    "statement": {
      "type": "string"
    },
    "niceToHave": {
      "type": [
        "string",
        "null"
      ]
    },
    "validUntil": {
      "type": "string",
      "description": "Date (YYYY-MM-DD) until which the intent is watched (before confirmation: until the draft is deleted)."
    },
    "activeSince": {
      "type": [
        "string",
        "null"
      ]
    },
    "hasHiddenLimit": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
intent_get_intent annotations
{
  "title": "Get the state of a property watch",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
intent_list_matches — List properties found for a property watch
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user asks what LivinIsto has found for an intent created with intent_publish_intent. These are the same properties LivinIsto e-mails to the user; this server cannot send messages into the conversation by itself. Requires the intentCode; optional since (ISO time) returns only newer matches. Returns at most 20 newest matches with the price and LivinIsto price verdict (per m², against comparable properties nearby) at the time of the match and a link. Before the user confirms the intent there are no matches. Matches come from listings LivinIsto aggregates from the market, so they cover only properties listed on LivinIsto and may be incomplete; a property may already be sold or rented.

intent_list_matches input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "intentCode"
  ],
  "properties": {
    "since": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "Only matches found after this ISO time."
    },
    "intentCode": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{32}$",
      "description": "The intentCode returned by intent_publish_intent."
    }
  }
}
intent_list_matches output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "found"
  ],
  "properties": {
    "more": {
      "type": "boolean",
      "description": "More matches exist than returned; call again with since."
    },
    "found": {
      "type": "boolean"
    },
    "status": {
      "enum": [
        "awaiting_consent",
        "awaiting_email_confirmation",
        "active",
        "expired",
        "withdrawn"
      ],
      "type": "string",
      "description": "awaiting_consent = the user has not confirmed on the LivinIsto page yet; awaiting_email_confirmation = the user filled in the page and must click the link in the e-mail; active = LivinIsto is watching; expired = the confirmation link, the buy-by date or the intent's validity ran out; withdrawn = cancelled."
    },
    "matches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "propertyId",
          "title",
          "propertyType",
          "transaction",
          "rooms",
          "roomOnly",
          "areaM2",
          "landAreaM2",
          "city",
          "cityPart",
          "district",
          "priceEur",
          "priceIsMonthly",
          "priceEurAtMatch",
          "priceVerdictAtMatch",
          "matchedAt",
          "stillListed",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "Link to the property on www.livinisto.sk — show it unchanged."
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "rooms": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": -9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "title": {
            "type": "string",
            "description": "Built from LivinIsto's own fields (type, rooms, place), never the seller's headline."
          },
          "areaM2": {
            "type": [
              "number",
              "null"
            ]
          },
          "cityPart": {
            "type": [
              "string",
              "null"
            ]
          },
          "district": {
            "type": [
              "string",
              "null"
            ]
          },
          "priceEur": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": -9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Asking price today; per month for a rental. Null when the listed number is not the price of the whole property (a share, an auction, a short stay) — check the listing."
          },
          "roomOnly": {
            "type": "boolean",
            "description": "True when the rent is for a room in a shared flat, not the whole flat."
          },
          "matchedAt": {
            "type": "string"
          },
          "landAreaM2": {
            "type": [
              "number",
              "null"
            ]
          },
          "propertyId": {
            "type": "string"
          },
          "stillListed": {
            "type": "boolean"
          },
          "transaction": {
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string"
          },
          "propertyType": {
            "enum": [
              "byt",
              "dom",
              "chata",
              "pozemok",
              "apartman"
            ],
            "type": "string"
          },
          "priceIsMonthly": {
            "type": "boolean"
          },
          "priceEurAtMatch": {
            "anyOf": [
              {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": -9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "priceVerdictAtMatch": {
            "anyOf": [
              {
                "enum": [
                  "below_market",
                  "around_market",
                  "above_market"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
intent_list_matches annotations
{
  "title": "List properties found for a property watch",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
intent_withdraw_intent — Stop a property watch
Advertised by the server during the last successful anonymous check.
Advertised destructive

Use this when the user wants LivinIsto to stop watching for an intent created with intent_publish_intent. Takes effect immediately; nothing more is e-mailed for it. Requires the intentCode.

intent_withdraw_intent input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "intentCode"
  ],
  "properties": {
    "intentCode": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{32}$",
      "description": "The intentCode returned by intent_publish_intent."
    }
  }
}
intent_withdraw_intent output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "found"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "status": {
      "enum": [
        "withdrawn"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
intent_withdraw_intent annotations
{
  "title": "Stop a property watch",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
intent_search_offers — Search properties LivinIsto offers today
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants to find a flat, house, cottage or plot for sale or rent in Slovakia now. Pass what they are looking for as one short phrase (Slovak works best), e.g. "2-izbový byt Bratislava do 200000 €". Returns up to 20 properties from LivinIsto's offer in LivinIsto's own order, each with a link to the property on www.livinisto.sk, plus what was understood, which words were not applied and what had to be relaxed. For rent the price is per month. When suggestIntent is true (nothing or little found, or part of the phrase was dropped), offer the user intent_publish_intent with the same statement so LivinIsto keeps watching. Results come from listings LivinIsto aggregates from the Slovak market and may be incomplete; no seller or agent contact is returned.

intent_search_offers input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "statement"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "At most this many properties (default 10; LivinIsto returns at most 10)."
    },
    "statement": {
      "type": "string",
      "maxLength": 300,
      "minLength": 2,
      "description": "What the user is looking for, e.g. \"dom Žilina do 250000 €\"."
    }
  }
}
intent_search_offers annotations
{
  "title": "Search properties LivinIsto offers today",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
786 ms
95th percentile latency
786 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 786 ms · metadata changed · 5 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http livinisto-mcp https://www.livinisto.sk/mcp/zamery

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add livinisto-mcp --url https://www.livinisto.sk/mcp/zamery

Cursor

Merge this server into .cursor/mcp.json in your project, then enable livinisto-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "livinisto-mcp": {
      "url": "https://www.livinisto.sk/mcp/zamery"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "livinisto-mcp": {
      "type": "streamableHttp",
      "url": "https://www.livinisto.sk/mcp/zamery",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start livinisto-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "livinisto-mcp": {
      "type": "http",
      "url": "https://www.livinisto.sk/mcp/zamery"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http livinisto-mcp https://www.livinisto.sk/mcp/zamery

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "livinisto-mcp": {
      "url": "https://www.livinisto.sk/mcp/zamery"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "livinisto-mcp": {
      "serverUrl": "https://www.livinisto.sk/mcp/zamery"
    }
  }
}

Let your agent find its tools

Find servers like LivinIsto MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run LivinIsto MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing