MCP server

JMAD runs a keyless MCP server at https://dnk.co/japan/mcp, using streamable HTTP. There is no auth handshake and no key to fetch first: an MCP client sends initialize, then calls tools.

Adding it to a client

Most MCP clients accept a remote server by URL. The exact settings screen differs, but the shape is the same everywhere: add a remote MCP server and give it https://dnk.co/japan/mcp. A generic config entry looks like this:

{
  "mcpServers": {
    "jmad": {
      "url": "https://dnk.co/japan/mcp"
    }
  }
}

Claude Desktop, Claude Code, Cursor, and ChatGPT all support adding a remote MCP server this way. Check your client's own documentation for where that setting lives; nothing about JMAD's server is client-specific.

Protocol versions and headers

The server speaks MCP 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05; initialize negotiates one of them and the response carries it in the Mcp-Protocol-Version header, along with an Mcp-Session-Id. Under the two newest revisions the specification makes Mcp-Protocol-Version a required header on every request after initialize, and the server enforces that: a tools/list or tools/call without it is rejected with a 400 whose body is a JSON-RPC error naming the missing header. Every MCP client library sends it for you; you only meet this when driving the endpoint by hand with curl. Transport-level rejections (a missing or wrong Accept, an unsupported content type, a wrong method) likewise carry a JSON-RPC error body (code: -32600) rather than an empty response.

Tools

Four tools, all read-only and all backed by the same query functions behind the REST API. Each one is annotated readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, so a client that gates tool calls on annotations can run them without confirmation.

search_assets. Same filters as GET /japan/api/v1/assets: q, prefecture, ward, machiAza, type, page. Returns the same { items, page, total, totalCapped } envelope described in search and pagination.

get_asset. Takes a DNK Asset ID and returns the full building page: fields, provenance, geometry, sources, venues, nearby buildings, and history, matching GET /japan/api/v1/assets/{id}.

get_asset_sources. Takes a DNK Asset ID and returns { "sources": [...] }: the list of sources joined into that building, each with its source ID, source record ID, source URL, and the fields it supplied. The array is the same one GET /japan/api/v1/assets/{id}/sources returns; MCP structured content has to be an object, hence the wrapper.

get_owner_portfolio. Takes an owner name and returns every building recorded under that public owner, matching GET /japan/api/v1/owners/{name}/assets.

{
  "tool": "get_asset",
  "arguments": { "id": "DNK-JP-13-01000000" }
}

A call like that returns the same BuildingPage shape as the REST endpoint as the tool's structured content, fields, provenance, conflicts, and estimates included, with dates as ISO-8601 strings; see provenance and precedence for how to read that shape. A well-formed ID with no building behind it comes back as a tool error (isError: true) whose text starts with not_found, not as a protocol error.

Server card

The server advertises itself at /japan/mcp/server-card, returning JSON with name, description, version, the server URL, transport: "streamable-http", and authentication: { "required": false }. A client that discovers the server through the card knows before its first tool call that no key is coming.

📘

Note

JMAD does not publish /.well-known/oauth-protected-resource, /.well-known/mcp.json or /.well-known/mcp/server-card.json: /.well-known/ is the host root, which belongs to the DNK marketing site, and there is nothing to protect and nothing to authorize; the server card's authentication.required: false is the whole story.

Rate limits

The MCP surface shares the same fixed 60-second window as the REST API: 120 requests per minute, keyed on the same hashed client identifier described in authentication. Going over it returns a JSON-RPC 2.0 error object rather than the REST API's ApiProblem body, using the MCP error format:

{
  "jsonrpc": "2.0",
  "id": null,
  "error": {
    "code": -32000,
    "message": "the mcp surface allows 120 requests per minute; retry after 12s"
  }
}

The response also carries a Retry-After header with the seconds to wait; unlike the REST API it does not carry X-RateLimit-Limit or X-RateLimit-Remaining on any response, success or 429. See rate limits and errors for how the three surfaces compare.

Request and session limits

Each server process admits up to 32 concurrent MCP requests. Excess requests receive HTTP 503 with Retry-After: 1; wait at least one second before retrying. This bound also covers clients that send their request bodies slowly.

MCP POST bodies are limited to 65,536 bytes, measured as received rather than by character count or a trusted Content-Length header. Larger bodies receive HTTP 413 with a JSON-RPC error. The complete body must arrive within 10 seconds or the server returns HTTP 408. Reduce oversized requests; do not retry the same oversized body.

A session expires 15 minutes after initialization, even if it is active. Send initialize again without the old Mcp-Session-Id after a 404 unknown-or-expired response. Initialization with an existing session ID is rejected with HTTP 400.

When finished, send DELETE to /japan/mcp with Mcp-Session-Id and the negotiated Mcp-Protocol-Version. Successful termination returns HTTP 204 with no body; later use of the ID returns 404. Version-header requirements also apply to DELETE. GET remains unsupported.

Each server process admits at most 256 sessions, including initializations in progress. When capacity is full, new initializations receive HTTP 503 and Retry-After: 30. Existing sessions remain usable. Wait at least 30 seconds before retrying. Sessions are held in process memory and can also be lost on a restart.

Next

  • Agent discovery for how a crawler or agent finds the server card and /llms.txt without being told the URL directly.
  • Search and pagination for the full parameter reference behind search_assets.

Connect from a building page

The homepage and area lists show Connect an agent with MCP in the Build with this data panel. Building records expose it in API & agent, also reachable through Use this data near the title. Expand the control to copy the server URL or generic URL-based JSON configuration. Client configuration formats vary; use the remote server option supported by your client.


Did this page help you?