Matchai Docs

MCP server

Connect an AI assistant to the Matchai MCP server to search published listings. Endpoints, transport, limits, and setup for Claude, ChatGPT and other clients.

The Matchai MCP server lets an AI assistant search the listings that real estate professionals have published on Matchai, open one listing, and look up a broker. MCP, the Model Context Protocol, is the open standard assistants use to call outside tools.

The server is public and read-only. It needs no account, no API key and no sign-in, and it returns published data only.

Endpoints

URLUse it for
https://matchai.co/mcpThe default endpoint. Use it for ChatGPT, Claude Code, the MCP Inspector, scripts and every other client.
https://matchai.co/mcp/claudeThe same server, for Claude apps, so that listing cards render inside the conversation.
https://matchai.co/mcp/server-cardA JSON description of the server for directories and scanners.

Why there are two connector URLs

Both URLs run the same server and return the same tools and data. They differ only in one widget setting, and the two assistants disagree about it: ChatGPT wants a dedicated widget domain to be declared, and Claude will not render a widget whose declared domain does not match its own connector URL. Two URLs let each assistant get what it needs.

Transport

The server speaks MCP over Streamable HTTP, in its stateless form, with JSON-RPC 2.0 messages.

  • POST one JSON-RPC message to the endpoint. A request gets 200 with an application/json body. A notification gets 202 with no body.
  • No sessions. The server issues no Mcp-Session-Id and remembers nothing between requests, so any request can be answered on its own. Follow the standard handshake anyway, so your client also works with other servers.
  • No event stream. GET and DELETE answer 405, which is the correct answer for a server with nothing to push. OPTIONS answers 204 for CORS.
  • No batches. Send one message per request. An array is refused with -32600.
  • Protocol versions: 2025-11-25, 2025-06-18 and 2025-03-26. initialize returns your version when the server speaks it, and the latest otherwise. If you send an MCP-Protocol-Version header after initialize, it must be one of these, or the request fails with 400.
  • Size. A request body can be up to 256 KB.

The server answers these methods:

MethodAnswer
initializeProtocol version, capabilities (tools and resources), serverInfo and usage instructions for the model. Requires params.protocolVersion.
pingAn empty result.
tools/listThe three public tools, with input and output schemas.
tools/callRuns one tool.
resources/listOne resource: the listing-card widget.
resources/templates/listAn empty list.
resources/readThe listing-card widget document.
notifications/initialized, notifications/cancelledAccepted with 202.

Any other method answers -32601 (method not found). The server has no prompts, logging or completion features.

serverInfo.name is matchai-listings and serverInfo.version is a semantic version. It changes when a tool or field is added or changes shape.

Access, data and limits

  • Authentication. None. /.well-known/mcp.json declares authentication.required: false, and the server asks for no key, token or sign-in.
  • Data. Published listings, and the public profile of brokers who have published a site, a Matchai Page or a business card. A broker's phone number and email address appear only when they are published on that business card.
  • Order of results. By relevance to the request and by how recently the listing was updated. No broker can pay to change the order or to be included.
  • Rate limit. Each calling address can make 600 tools/call requests per minute. Above that, the call returns a tool result with isError: true and a message asking you to try again in a minute. The limit applies to tools/call only. It is an abuse guard, set high enough that a busy assistant host does not reach it.
  • CORS. Open to every origin, so browser-based tools such as the MCP Inspector work. The server reads no cookie and no credential. Preflight answers are cacheable for 24 hours.
  • Caching. Responses are sent with Cache-Control: no-store.

Discovery documents

Matchai publishes machine-readable descriptions of the server. All are JSON, send an ETag, honour If-None-Match, and allow cross-origin reads.

URLWhat it is
https://matchai.co/mcp/server-cardThe MCP server card: name co.matchai/listings, version, description, endpoint and supported protocol versions. Also served at /.well-known/mcp/server-card.json.
https://matchai.co/.well-known/mcp.jsonA fuller description: both endpoints, authentication.required: false, the tools with their annotations, and the widget resource.
https://matchai.co/.well-known/ai-catalog.jsonA domain-level catalogue that points to the server card, the host's OpenAPI document and its llms.txt.
https://matchai.co/.well-known/api-catalogAn RFC 9727 API catalogue listing the public endpoints.
https://matchai.co/openapi.jsonAn OpenAPI 3.1 document for the public endpoints.

Broker sites and Matchai Pages serve their own copies of these documents. They point to the same MCP server on matchai.co.

Connect an assistant

Plans and settings

Whether you can add a custom connector depends on your plan and, in a team workspace, on your administrator. Menu names can change between app versions.

Claude

Open Claude and go to Settings → Connectors, then choose Add custom connector.

Enter the name Matchai and the server URL https://matchai.co/mcp/claude.

Leave any authentication options empty. The server needs no sign-in.

Save the connector, start a new conversation, and ask for something concrete, such as "Find a 3-bedroom condo for sale in Laval under $600,000". Claude calls search_listings and shows the results as listing cards.

To add the server to Claude Code from a terminal:

claude mcp add --transport http matchai https://matchai.co/mcp

ChatGPT

Open ChatGPT and go to Settings → Apps & Connectors → Advanced settings, then turn on developer mode.

Choose Create to add a connector.

Enter the name Matchai and the server URL https://matchai.co/mcp, and set authentication to none.

Save it, enable the connector in a new chat, and ask for listings in your own words.

Other clients

Most clients that support remote MCP servers accept a URL in a configuration file:

mcp.json
{
  "mcpServers": {
    "matchai": {
      "url": "https://matchai.co/mcp"
    }
  }
}

Clients that ask for a transport type should use Streamable HTTP, with no authentication.

Call the server from your own code

The examples use curl. Each request is a single JSON-RPC message.

Initialize. Send initialize with the protocol version you want.

curl -s https://matchai.co/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-11-25",
      "capabilities": {},
      "clientInfo": { "name": "my-client", "version": "0.1.0" }
    }
  }'

An abridged answer:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-11-25",
    "capabilities": { "tools": {}, "resources": {} },
    "serverInfo": {
      "name": "matchai-listings",
      "title": "Matchai",
      "version": "1.0.0",
      "websiteUrl": "https://matchai.co"
    },
    "instructions": "Matchai is a real estate platform where licensed brokers in Québec and across Canada publish their listings. …"
  }
}

Confirm. Send the initialized notification. The server answers 202 with no body.

curl -s -i https://matchai.co/mcp \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "2.0", "method": "notifications/initialized" }'

List the tools.

curl -s https://matchai.co/mcp \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }'

The result has a tools array with search_listings, get_listing and get_professional. Each entry carries a name, a title, a description, an inputSchema, an outputSchema and annotations that mark the tool as read-only.

Call a tool.

curl -s https://matchai.co/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "search_listings",
      "arguments": { "query": "3 bedroom condo in Laval under 600k", "limit": 3 }
    }
  }'

The result holds readable text in content, typed data in structuredContent, and a _meta object for the listing-card widget. See public tools for the shape of each.

Errors

Problems with the message itself are JSON-RPC errors. Problems a model can fix, such as a bad argument or a URL that matches no listing, come back as a tool result with isError: true and a message the model can read.

SituationResponse
The body is not valid JSONHTTP 400, error -32700
Not a JSON-RPC 2.0 message, a batch, or no methodHTTP 400, error -32600
The body is over 256 KBHTTP 413, error -32600
Unsupported MCP-Protocol-Version headerHTTP 400, error -32600
Unknown methodHTTP 200, error -32601
Missing or invalid parameters, or an unknown tool nameHTTP 200, error -32602
resources/read for a URI the server does not haveHTTP 200, error -32002
GET or DELETEHTTP 405, with Allow: POST, OPTIONS
A tool argument that fails validationHTTP 200, result with isError: true
Nothing matches a get_listing or get_professional lookupHTTP 200, result with isError: true
Over the rate limit, or a temporary failureHTTP 200, result with isError: true. Try again shortly.

On this page