mydatavalue-mcp
Provides access to Airbnb property data and related analytics such as pricing, promotions, ranking, reviews, demand, compsets, and performance through the MyDataValue API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mydatavalue-mcplist my Booking.com properties"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mydatavalue-mcp
A small remote MCP (Model Context Protocol) server that lets Claude query the MyDataValue API — Booking.com + Airbnb properties, pricing, promotions, ranking, reviews, demand, compsets, performance, and the change log — as a native connector, instead of copying curl commands around.
It is read-only by design (GET requests only), matching the scope of the MyDataValue API key it was issued.
Why this exists / how the OAuth dance is handled
MyDataValue issues a refresh_token that:
is exchanged for a 1-hour
access_tokenviaPOST /oauth/tokenrotates on every exchange — the old
refresh_tokenstops working the instant a new one is issuedgets your whole integration shut off if an old, already-used
refresh_tokenis replayed (their theft-detection)
That means the refresh token can never live only in a chat transcript, a
.env file on a laptop, or this repo — it has to be persisted durably by
whatever is running the service, updated atomically on every rotation, and
never reused. src/tokenStore.js + src/mdvClient.js do exactly that:
the current
refresh_token/access_token/ expiry live in a JSON file atTOKEN_STORE_PATH(defaults to/data/token-store.json— point this at a mounted persistent volume in production)writes are atomic (temp file + rename) so a crash mid-write can't corrupt the store or leave you holding a half-written token
concurrent requests are coalesced onto a single in-flight refresh, so two simultaneous tool calls can never race each other into burning the refresh token twice
401s trigger exactly one forced refresh + retry; 429s honor
Retry-After
A note on durability
The first version of this service persisted the rotating refresh_token to
a Railway volume mounted at /data. In testing, that turned out not to
reliably survive redeploys on this service — a plain redeploy with zero code
or config changes came back up unable to find the file it had written
seconds earlier, twice in a row. Railway's own docs say this shouldn't
happen for a volume-attached service, so the exact cause is unconfirmed
(possibly an interaction with this service's multiRegionConfig), but it's
reproducible here, and reusing a stale refresh_token is exactly the
failure mode MyDataValue treats as a stolen-token replay and locks accounts
over — so this service does not rely on the volume for correctness.
Instead, MDV_SEED_REFRESH_TOKEN is the durable source of truth, and it's
kept current in place: every time the service rotates the token, it calls
Railway's public API (variableUpsert, with skipDeploys: true so it
doesn't force a redeploy) to overwrite MDV_SEED_REFRESH_TOKEN with the new
value. Env vars have reliably round-tripped through every redeploy in
testing, unlike the volume. The next boot - whenever that happens - reads
the current value straight from that env var. src/railwayVariable.js
implements this; it needs RAILWAY_PROJECT_TOKEN, RAILWAY_PROJECT_ID, and
RAILWAY_ENVIRONMENT_ID (RAILWAY_SERVICE_ID optional) to be set. Without
those, the service still runs (rotations just live only in memory), but it
logs a loud warning on every rotation, because a restart before persistence
succeeds means the next boot replays a now-stale token.
The local file at TOKEN_STORE_PATH is still written on a best-effort
basis (useful for poking at from Railway's file browser while debugging),
but nothing in this service depends on it being there.
Related MCP server: Hostkit MCP
Endpoints wired up
list_properties— Booking.com and/or Airbnb properties (/api/v1/{channel}/properties/)mdv_raw_get— a generic, read-only passthrough for any other/api/v1/...path (pricing, promotions, ranking, reviews, demand, compsets, performance, change log, ...)
I couldn't browse the private interactive docs link myself (it's blocked by
the site's robots.txt for automated fetching, and the JSON schema
variants I tried needed an interactive approval that timed out), so only the
one endpoint you gave me as an example (/booking/properties/) got a
dedicated, typed tool. mdv_raw_get covers everything else today.
If you paste the endpoint list (or an OpenAPI/Swagger export) from
https://app.mydatavalue.com/api/v1/docs/, I can add proper dedicated tools
(with typed parameters and nicer output) for pricing, promotions, ranking,
reviews, demand, compsets, performance, and the change log too — just ask.
Running locally
cp .env.example .env # fill in MDV_CLIENT_SECRET, MDV_SEED_REFRESH_TOKEN, MCP_ACCESS_TOKEN
npm install
npm startDeploying
Designed to run on Railway (or any host that gives you a persistent volume):
Deploy this repo.
Attach a persistent volume, mounted at
/data.Set env vars:
MDV_CLIENT_ID,MDV_CLIENT_SECRET,MDV_SEED_REFRESH_TOKEN(kept current automatically after the first rotation - see "A note on durability" above),TOKEN_STORE_PATH=/data/token-store.json(best-effort only),MCP_PUBLIC_URL(the exact public HTTPS URL Railway gives the service, no trailing slash),MCP_OAUTH_CLIENT_ID,MCP_OAUTH_CLIENT_SECRET(generate withopenssl rand -hex 32), andMCP_ACCESS_TOKEN(alsoopenssl rand -hex 32— this is now the one-time consent passphrase, see below, not a request header).For durable refresh-token persistence, create a Railway Project Token (Project Settings → Tokens, scoped to this project) and set it as
RAILWAY_PROJECT_TOKEN, plusRAILWAY_PROJECT_IDandRAILWAY_ENVIRONMENT_ID(andRAILWAY_SERVICE_IDif you want variable updates scoped to just this service). Skipping this makes rotations memory-only - fine for a quick test, risky for anything left running.Generate a public domain.
Connecting it in Claude
Claude's "Add custom connector" dialog only takes a server URL plus,
optionally, an OAuth Client ID and OAuth Client Secret in Advanced
settings — there's no field for a raw bearer header. So this server
implements a minimal (but spec-following) OAuth 2.1 authorization server in
front of /mcp: RFC 9728 protected resource metadata, RFC 8414
authorization server metadata, and the authorization_code + PKCE grant plus
refresh_token, per the MCP Authorization spec.
There's exactly one pre-shared client (this connector) - no Dynamic Client
Registration, which the spec allows as an alternative.
To connect:
In Claude, add a custom connector with URL
https://<your-domain>/mcp.In Advanced settings, enter
MCP_OAUTH_CLIENT_IDas the OAuth Client ID andMCP_OAUTH_CLIENT_SECRETas the OAuth Client Secret.Claude will open
/authorizein a browser tab. Enter theMCP_ACCESS_TOKENvalue as the passphrase to approve the connection. This is a one-time step (until the issued token expires/is revoked).
MCP_OAUTH_ALLOWED_REDIRECT_URIS defaults to * (accept any redirect_uri)
on first deploy, since Claude's exact callback URL isn't documented. Once
you've connected once, check the deploy logs for the redirect_uri that
was actually used ([oauthServer] /authorize request - redirect_uri=...)
and set MCP_OAUTH_ALLOWED_REDIRECT_URIS to that exact value (comma-separate
if there's more than one) to close the open-redirect surface.
Security notes
MCP_ACCESS_TOKENgates the one-time/authorizeconsent step — anyone who has it (and the client ID) can complete the OAuth flow and mint a token. Treat it like a password. It is no longer sent as a request header.MCP_OAUTH_CLIENT_SECRETand the issued access/refresh tokens are the keys to/mcpitself going forward - keep them as secret asMCP_ACCESS_TOKEN.MDV_CLIENT_SECRETand the rotating MyDataValuerefresh_tokennever leave the server process, Railway's env var store, and (best-effort) its volume. They are not logged in full (only the last 6 characters, for audit purposes).RAILWAY_PROJECT_TOKENcan rewrite this project's env vars - treat it with the same care as the other secrets here.If MyDataValue ever locks you out for a suspected replayed token, contact them to get re-issued, then set a fresh
MDV_SEED_REFRESH_TOKENbefore redeploying.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityBmaintenanceA read-only hospitality-focused MCP server that enables users to retrieve reservation details, listing briefs, and guest conversation contexts from Hostaway. It simplifies hospitality workflows by providing specialized tools for searching threads and viewing reservation data through natural language interfaces.Last updated631MIT

Hostkit MCPofficial
AlicenseBqualityBmaintenanceMCP server for the Hostkit API, enabling management of properties, reservations, guests, invoices, and other property operations.Last updated36MIT- FlicenseAqualityCmaintenanceMCP server for the Rizerve direct booking platform. Enables managing properties, bookings, availability, iCal sync, analytics, and webhooks through AI assistants.Last updated191
- Flicense-qualityBmaintenanceMCP server that exposes the Vikey API for reservation management, property listing, and payment information retrieval.Last updated
Related MCP Connectors
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
Unofficial read-only MCP server for VeryChic hotel offers
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Elev8-OS/mydatavalue-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server