Skip to content
All projects
Live · I use it

ur-mcp

UR has no public API. ur-mcp takes the same data the official site shows for vacancies and hands it to AI agents as three MCP tools: search vacancies, report what changed, save watch settings. Requests go one at a time and skip images, about the load of one person viewing a results page.

Asking for UR rooms in 板橋区: the AI calls search_vacancies and shows three rooms in a table
Type
MCP server · 3 tools for Claude and ChatGPT
Since
2026
Role
Solo
Runs on
Railway, Singapore · SQLite on a volume

About

After building UR check, I caught myself still asking an AI about rooms. AI assistants now have notifications and scheduled tasks of their own, and they're far better than my screens at talking a choice through. So why not just hand the AI accurate data and let it do the rest? That's where ur-mcp came from.

A skill would have been the simple route, but UR's data has gaps and needs cleaning up, so I built an MCP server. Ask Claude or ChatGPT for a 2DK near a station in 板橋区, it calls ur-mcp, and the rooms come back as a table with links to each listing and a map. Alerts come from a claude.ai scheduled task that asks for changes right after each check.

It's an amazing time. Without building notifications, a scheduler or a login, one MCP server with the right data gets better answers than the scraped results I used to show. It shares no code with UR check, and it's used by me and a few people I've given a private link to.

What it does

Search
One area with rent, floor space, layout, walk to a station without a bus, no ground floor and pets. Up to 50 rooms by monthly cost, each with the listing and a map.
What changed
New, relisted and gone rooms in your watched areas, filtered by your own settings. A report after each check misses nothing.
Watch settings in words
“Make it ¥140,000 and skip the ground floor” is saved per person and applies from the next alert.
Its own history
Watched areas are checked at 8, 12 and 16 JST and kept in SQLite, so “new” means new to this service, not just new since the last search.
Claude and ChatGPT
Claude Code with a bearer token; claude.ai and ChatGPT connectors with a secret URL per person.
How it works: Claude or ChatGPT calls ur-mcp, which queries UR one request at a time and keeps a history
Changing the alert budget in a chat: update_watch_settings saves it and lists what matches now

How it's built

Server
Node.js 24 (TypeScript run directly, no build) · Hono · MCP TypeScript SDK, stateless · Zod
Data
The vacancy data UR's site shows · SQLite (node:sqlite) on a Railway volume
Clients
Claude Code · claude.ai connectors and scheduled tasks · ChatGPT apps
Infra
Railway, Singapore · one replica · service config as code (railway.ts)
Quality
Vitest with recorded UR responses · live smoke tests · Biome · TypeScript 7

Engineering notes

The AI decides, the server gets it right

Reading the question, comparing and recommending are left to the AI. The server owns one thing: UR data that is complete and exact, with tool descriptions that tell the AI how to show it.

A partial result is an error

Every estate and room page is collected. A failed page or a count mismatch fails the whole search. What UR filters loosely — floor space, rent, layout — is checked again.

A secret URL, because connectors can't send a token

claude.ai and ChatGPT connectors can't send a bearer token, so each person gets a URL. Tokens are compared as SHA-256 digests in constant time; cutting someone off is one variable.

Polite by design

One request at a time, 0.5 s apart, with a 5-minute cache and daily caps. Searching 町田市 makes the same 7 API calls as opening the official results page, minus its ~30 images. It backs off on 429 and stops on 403.

Not affiliated with UR (Urban Renaissance Agency). Always confirm availability on the official UR site. The images are drawn from real ur-mcp results.