<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: iamTheDev</title>
    <description>The latest articles on DEV Community by iamTheDev (@iamthedev).</description>
    <link>https://dev.to/iamthedev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4105698%2F8e112c65-3ca4-4d11-a2fd-36125b1ee18d.png</url>
      <title>DEV Community: iamTheDev</title>
      <link>https://dev.to/iamthedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamthedev"/>
    <language>en</language>
    <item>
      <title>Three Enterprise MCP Deployment Pitfalls: Identity, Budget, Error Handling — I Stepped on All of Them</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Wed, 30 Sep 2026 13:14:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/three-enterprise-mcp-deployment-pitfalls-identity-budget-error-handling-i-stepped-on-all-of-31n2</link>
      <guid>https://dev.to/iamthedev/three-enterprise-mcp-deployment-pitfalls-identity-budget-error-handling-i-stepped-on-all-of-31n2</guid>
      <description>&lt;p&gt;I saw an arXiv paper on enterprise MCP deployment recently. Long title, core message: MCP is great in demos, but real enterprise deployments hit walls. It resonated. I build RollingGo's hotel MCP and support deployment for dozens of enterprise customers. The pitfalls match the paper almost exactly.&lt;/p&gt;

&lt;p&gt;Because we solved identity propagation, budget control, and error handling, developers get a hotel MCP ready for production. It runs on official data sources and years of travel supply chain integration, with full-chain direct API connection and real-time price confirmation. What you search is what you can book. It aggregates 500+ global suppliers and 2M+ hotel properties. Completely free, no call-volume limits, supporting 40+ major LLM clients including Cursor, Claude Code, Codex, and Windsurf. It also provides an all-in-one hotel booking skill for ClawHub, Coze, and Qclaw agent platforms. Developer partners can set country-based markup rates and earn commission, with orders and revenue visible in real time.&lt;/p&gt;

&lt;p&gt;Want to skip these pitfalls yourself? &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;Check the GitHub repo&lt;/a&gt; and get a key.&lt;/p&gt;

&lt;p&gt;Setup in Claude Code is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add RollingGo-Hotel &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transport&lt;/span&gt; http &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://mcp.rollinggo.ai/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Code and you're calling hotel search, room detail, and price confirmation directly. Enterprise-grade identity propagation, budget control, and error handling—we've already been through those walls for you.&lt;/p&gt;

&lt;p&gt;This post skips the MCP love letter. It covers the three pitfalls that bite when you deploy MCP in an enterprise: identity propagation, tool budget, and error semantics. Each one: what it is, why you fall in it, how to fix it. All learned with real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfall 1: Identity Propagation — Who Is Actually Calling the Tool?
&lt;/h2&gt;

&lt;p&gt;Demo-stage MCP doesn't care who you are. Run it, move on. In an enterprise, this is problem number one.&lt;/p&gt;

&lt;p&gt;Scenario: an employee asks the internal AI assistant to "book a business trip hotel." The assistant calls the hotel MCP server, which calls the hotel inventory API. Question: does the hotel API know which employee is booking?&lt;/p&gt;

&lt;p&gt;It only sees "the MCP server is calling me." It doesn't know who's behind it. How does the hotel record the order? How does it integrate with the corporate travel system? How do you enforce policies (like "this employee can only book three-star or below")?&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;identity propagation failure&lt;/strong&gt;—user identity breaks somewhere in the MCP call chain.&lt;/p&gt;

&lt;p&gt;We hit this early. The first design used a single API key on the MCP server to call the backend hotel API. All user requests went through that key. Fine for a demo with three people testing. Then an enterprise customer asked: "How do I know which employee booked which hotel?" We were stuck. The orders only had the MCP server's identity. No user info.&lt;/p&gt;

&lt;p&gt;We changed the approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client side&lt;/strong&gt;: the enterprise AI assistant puts user identity (employee ID, department, travel policy) into request metadata when calling MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server side&lt;/strong&gt;: extracts user identity from metadata, passes it to the backend API, and runs permission checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend API side&lt;/strong&gt;: records orders by user identity, runs risk control, integrates with the corporate travel system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not hard to fix in retrospect, but if you didn't design it upfront, retrofitting is painful. Enterprise customers ask "how do permissions work?" and "how does audit work?" first. If you can't answer those, you can't go live.&lt;/p&gt;

&lt;p&gt;Now our hotel MCP provides an all-in-one booking skill for ClawHub, Coze, and Qclaw. Identity propagation is standard. It runs on official data sources and mature supply chain infrastructure with enterprise-grade stability. But honestly, most MCP server builders don't think about this. They just want the call to work. Enterprise customers expose it immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfall 2: Tool Budget — AI Burns Cash on Calls It Shouldn't
&lt;/h2&gt;

&lt;p&gt;Second pitfall: money.&lt;/p&gt;

&lt;p&gt;AI tool calls cost money. A hotel API call has a per-call fee. LLM inference has token costs. Let the AI loop and you're paying real money. The problem: AI doesn't know to "be careful."&lt;/p&gt;

&lt;p&gt;Scenario: user asks "what are some good hotels in Shanghai?" Normal flow: one &lt;code&gt;search_hotels&lt;/code&gt; call, return results. But poorly designed agents call repeatedly—search once, think results aren't great, change params, search again, add a filter, search a third time. Seven or eight calls, each costing real money.&lt;/p&gt;

&lt;p&gt;Worse: some agents fall into a tool-calling loop. Call tool A, unsatisfied. Call tool B, still unsatisfied. Call A again. Loop. Every iteration burns cash.&lt;/p&gt;

&lt;p&gt;A customer hit this. Their AI travel assistant launched, and API call costs ran three times expectations in week one. We dug through logs. The agent was repeatedly calling hotel search and flight search while processing complex requests. A single user conversation triggered 20+ tool calls.&lt;/p&gt;

&lt;p&gt;Solutions we landed on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tool call budget&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set a per-session, per-user cap on tool calls. Ten calls per conversation max. Stop when you hit the limit. This lives in the agent orchestration layer, not the MCP server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ToolBudget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;max_calls&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;BudgetExceededError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tool call limit reached: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_calls&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="c1"&gt;# actually call the MCP tool
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;mcp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Tool-level rate limiting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the MCP server, rate-limit per user per session. Same tool, same user, can't call it too many times in a short window. Like: &lt;code&gt;search_hotels&lt;/code&gt; max 3 calls per minute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Caching strategy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cache results for identical parameter calls. Same city, same dates, repeat request within five minutes returns cache instead of hitting the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Call-chain monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Log every tool call: who called, what, how much it cost, how long it took. When costs spike, you find the culprit fast.&lt;/p&gt;

&lt;p&gt;These sound simple. Each one has details. Our tool budget alone went through three revisions before it ran smoothly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfall 3: Error Semantics — AI Doesn't Know What to Do When Things Break
&lt;/h2&gt;

&lt;p&gt;Third pitfall is the most subtle: error handling.&lt;/p&gt;

&lt;p&gt;Traditional APIs use HTTP status codes. 400 is bad params, 401 is unauthorized, 500 is server down. Developers read these instantly.&lt;/p&gt;

&lt;p&gt;MCP is different. Errors are for the AI to read. The AI needs to understand what the error means, whether to retry, whether to tell the user. Problem: different MCP servers use different error formats and semantics.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hotel MCP: "Insufficient inventory, try different dates"&lt;/li&gt;
&lt;li&gt;Flight MCP: "API rate limit exceeded, retry after 5s"&lt;/li&gt;
&lt;li&gt;Weather MCP: "City not found, check spelling"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How should the AI handle each?&lt;/p&gt;

&lt;p&gt;First: insufficient inventory. Tell the user "that hotel is sold out, want to see alternatives?"&lt;/p&gt;

&lt;p&gt;Second: rate limited. Wait a few seconds and retry. Don't bother the user.&lt;/p&gt;

&lt;p&gt;Third: city typo. Ask the user "did you mean XX?"&lt;/p&gt;

&lt;p&gt;But if error formats are inconsistent, how does the AI know which to retry, which to ask about, and which to relay to the user?&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;error semantic inconsistency.&lt;/strong&gt; Manual testing in demos works because you read the errors yourself. When AI processes errors automatically, inconsistent formats create weird behavior.&lt;/p&gt;

&lt;p&gt;We designed a unified error format for our hotel MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HOTEL_NOT_AVAILABLE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The selected dates are sold out for this hotel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"retryable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sorry, this hotel is sold out for your dates. Want me to check nearby alternatives?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEARCH_OTHER_DATES"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;code&lt;/strong&gt;: machine-readable error code. The AI branches on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;retryable&lt;/strong&gt;: tells the AI whether this error warrants a retry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;user_message&lt;/strong&gt;: human-readable text for the user. The AI doesn't need to craft its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;suggestion&lt;/strong&gt;: what the AI should do next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now when the AI gets an error, it doesn't guess "is this serious?" "should I retry?" "how do I tell the user?" It follows the error semantics.&lt;/p&gt;

&lt;p&gt;Sounds obvious, right? Look at most MCP servers today. Most just throw a string. The AI has to figure it out. Demos work. Complex scenarios break when errors combine and the AI gets confused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise Deployment Checklist
&lt;/h2&gt;

&lt;p&gt;Three pitfalls covered. Here's a minimal checklist before you push MCP to enterprise production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity propagation&lt;/td&gt;
&lt;td&gt;Does user identity travel from client to backend? Permission checks in place?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget control&lt;/td&gt;
&lt;td&gt;Tool call limits? Budget alerts? Cost monitoring?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error handling&lt;/td&gt;
&lt;td&gt;Unified error format? Can the AI auto-handle based on error semantics?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logging&lt;/td&gt;
&lt;td&gt;Every tool call logged? Who called what, with what result?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradual rollout&lt;/td&gt;
&lt;td&gt;Can MCP server updates go gray? Can you roll back?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Check all five and you're ready for enterprise production. Miss one and you'll feel it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;MCP is hot. People think "spin up a server and you're done." Enterprise environments have way more walls. Identity, budget, error handling—each is a production-grade problem that demos don't expose.&lt;/p&gt;

&lt;p&gt;This is normal. Every tech goes from "works" to "enterprise dares to use it." Web APIs did the same. Started as HTTP requests, then added auth, rate limiting, monitoring, audit. MCP is walking that path now.&lt;/p&gt;

&lt;p&gt;What walls have you hit deploying MCP? Drop a comment. I'm curious what weird things other people ran into.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From Plugins to MCP: Three Years of Connecting AI to Tools, and Every Mistake We Made</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Mon, 28 Sep 2026 23:29:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/from-plugins-to-mcp-three-years-of-connecting-ai-to-tools-and-every-mistake-we-made-2id9</link>
      <guid>https://dev.to/iamthedev/from-plugins-to-mcp-three-years-of-connecting-ai-to-tools-and-every-mistake-we-made-2id9</guid>
      <description>&lt;p&gt;I was digging through old code on my machine the other day. Back in 2023, when I first started building AI apps, I wrote a bunch of plugin-related stuff. OpenAI had just launched Plugins, it felt shiny, I followed the docs and wired up a couple. Looking at that code now feels like reading stone-age engineering.&lt;/p&gt;

&lt;p&gt;Three years of AI-to-tool integration, three big steps: OpenAI Plugins → Function Calling → MCP. Each generation fixed the previous one's problems. Each generation had its share of wreckage. This post walks through the timeline, what each generation solved, and what it left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation 1: OpenAI Plugins (March 2023) — Beautiful on Paper, Painful in Practice
&lt;/h2&gt;

&lt;p&gt;March 2023, OpenAI shipped ChatGPT Plugins. The AI community lost its mind. ChatGPT could finally reach the web and call external APIs! I remember staying up all night writing a "weather lookup plugin," deploying it, feeling like I was on the cutting edge.&lt;/p&gt;

&lt;p&gt;In hindsight, Plugins' design was simple: you host a &lt;code&gt;/.well-known/ai-plugin.json&lt;/code&gt; file on your server describing what your plugin does and how to call it. ChatGPT discovers it and knows how to invoke it.&lt;/p&gt;

&lt;p&gt;Sounds a lot like MCP, right? It is. So why did Plugins die?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem one: locked into OpenAI.&lt;/strong&gt; Plugins were a proprietary protocol. Only ChatGPT could use them. You wrote a plugin, it lived inside ChatGPT, and no other AI platform recognized it. Terrible deal for developers. Why build a custom integration for one platform?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem two: broken UX.&lt;/strong&gt; Using a plugin in ChatGPT felt like getting redirected to another page. The experience was inconsistent. Plugin triggering logic was fuzzy. Sometimes ChatGPT didn't call a plugin when it should. Other times it called one when it shouldn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem three: the ecosystem never arrived.&lt;/strong&gt; People were excited for a minute, then developer numbers flatlined. Why? Low ROI. Spend time writing a plugin, use it only inside ChatGPT, limited users, no monetization path.&lt;/p&gt;

&lt;p&gt;That weather plugin I built? Barely anyone used it after launch. OpenAI stopped pushing Plugins, and the whole thing faded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation 2: Function Calling (June 2023) — Practical, But Not Standard
&lt;/h2&gt;

&lt;p&gt;After Plugins faded, OpenAI shipped Function Calling. This was more grounded.&lt;/p&gt;

&lt;p&gt;The idea: when you call the LLM, you pass your supported functions (tools) as JSON Schema. When the model decides it needs a tool, it returns a function name and arguments. You call the real API yourself, then feed the result back to the model.&lt;/p&gt;

&lt;p&gt;Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_hotels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search hotels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;City name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check-in date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check-out date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# First call: let the model decide if it needs a tool
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find me hotels in Shanghai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Model returns it wants to call search_hotels
&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# "search_hotels"
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# '{"city": "Shanghai", ...}'
&lt;/span&gt;
&lt;span class="c1"&gt;# You call the real API yourself
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_real_hotel_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Second call: feed the result back
&lt;/span&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find me hotels in Shanghai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Model packages the result into a natural-language reply
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Function Calling was genuinely more useful than Plugins. It was an open technical paradigm, not a platform-exclusive plugin system. After OpenAI shipped it, Anthropic and Google followed quickly. Everyone supported similar tool-calling mechanisms.&lt;/p&gt;

&lt;p&gt;But Function Calling had a fundamental issue: &lt;strong&gt;it was an LLM-layer capability, not a real "tool-calling protocol."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meaning: you still wrote all the glue code yourself. You defined functions, wrote parameter schemas, handled auth, called APIs, fed results back. Every AI app reinvented these wheels. And each LLM platform's Function Calling format was different. OpenAI's format wasn't Anthropic's, which wasn't Google's. Want to support multiple LLMs? Write multiple adapter layers.&lt;/p&gt;

&lt;p&gt;Before we built our hotel MCP, we started with Function Calling. We wrote tons of adapter code: tool schemas, parameter validation, backend API calls, response formatting. Switch LLMs and we rewrote everything. That 1,000+ lines of adapter code? MCP replaces it with a few dozen lines of config.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation 3: MCP Protocol (November 2024) — Finally, an Industry Standard
&lt;/h2&gt;

&lt;p&gt;November 2024, Anthropic launched MCP (Model Context Protocol). I didn't pay much attention at first. Another new protocol. The more I used it, the more I realized: this is the actual solution.&lt;/p&gt;

&lt;p&gt;What separates MCP from the first two generations? &lt;strong&gt;It's a real, open, cross-platform tool-calling protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open standard.&lt;/strong&gt; Not a company's private property. Open source protocol. After Anthropic shipped it, OpenAI, Google, Cursor, and Windsurf all supported it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-client architecture.&lt;/strong&gt; Tool providers implement MCP servers. AI apps connect as MCP clients. Implement once, every MCP-compatible client uses it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardized capability discovery.&lt;/strong&gt; The client connects, auto-discovers tools, parameters, and response formats. No hand-written schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform.&lt;/strong&gt; Whether you use Claude, GPT, or any other LLM, as long as it supports MCP, it connects to the same MCP server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is like the move from custom API formats to RESTful standards. Every system had its own interface style. Then one standard emerged, and everyone stopped reinventing.&lt;/p&gt;

&lt;p&gt;MCP's ecosystem grew fast. Tens of thousands of MCP servers now cover databases, cloud services, dev tools, industry data, and more. Our RollingGo hotel MCP is one of them. It has close to 300 GitHub stars, with both an MCP server and travel skills. It supports 40+ major LLM clients directly: Cursor, Claude Code, Codex, Windsurf, and more. Behind it: 500+ global suppliers and 2M+ hotel properties across brands. 110K+ direct-contracted hotels with direct inventory and real-time price confirmation. What you see is what you can book. Completely free, no call-volume limits. Developer partners can set country-based markup rates and earn commission, with orders and revenue visible in real time.&lt;/p&gt;

&lt;p&gt;From Plugins to Function Calling to MCP, the biggest takeaway: we finally stop writing all that adapter code. Want to experience MCP-era developer productivity? &lt;a href="https://global.rollinggo.store/" rel="noopener noreferrer"&gt;Grab an API key&lt;/a&gt; and try it.&lt;/p&gt;

&lt;p&gt;Setup in Qoder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RollingGo-Hotel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.rollinggo.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Qoder and you're calling hotel search, room detail, and price confirmation directly. From Plugins to Function Calling to MCP, the productivity jump is order-of-magnitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Generations Side by Side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;OpenAI Plugins&lt;/th&gt;
&lt;th&gt;Function Calling&lt;/th&gt;
&lt;th&gt;MCP Protocol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Launched&lt;/td&gt;
&lt;td&gt;March 2023&lt;/td&gt;
&lt;td&gt;June 2023&lt;/td&gt;
&lt;td&gt;November 2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it is&lt;/td&gt;
&lt;td&gt;Platform-exclusive plugin system&lt;/td&gt;
&lt;td&gt;LLM API tool-calling capability&lt;/td&gt;
&lt;td&gt;Open tool-calling protocol standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Openness&lt;/td&gt;
&lt;td&gt;OpenAI private, ChatGPT only&lt;/td&gt;
&lt;td&gt;Per-platform, formats differ&lt;/td&gt;
&lt;td&gt;Open source, cross-platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer effort&lt;/td&gt;
&lt;td&gt;Write plugin manifest + backend&lt;/td&gt;
&lt;td&gt;Write schema + glue code yourself&lt;/td&gt;
&lt;td&gt;Implement MCP once, use everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool discovery&lt;/td&gt;
&lt;td&gt;ChatGPT auto-discovers&lt;/td&gt;
&lt;td&gt;You pass schema to the model&lt;/td&gt;
&lt;td&gt;Client auto-discovers from server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Mostly obsolete&lt;/td&gt;
&lt;td&gt;Still used, being replaced&lt;/td&gt;
&lt;td&gt;Ecosystem growing fast, new standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Did MCP Win?
&lt;/h2&gt;

&lt;p&gt;From Plugins to Function Calling to MCP, why did MCP come out on top? One core reason: &lt;strong&gt;it solved the "reinventing wheels" problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Plugins failed because they were closed. Developers wouldn't invest in one platform.&lt;/p&gt;

&lt;p&gt;Function Calling worked but didn't scale. Every AI app wrote its own tool adapter layer. Too much repeated labor. Cross-platform compatibility was a nightmare. A tool written in OpenAI's format needed rewrites for Anthropic.&lt;/p&gt;

&lt;p&gt;MCP won because it standardized tool adaptation. Tool providers implement MCP once. Every MCP-aware AI client uses it automatically. AI developers stop caring how each tool works. Just connect to the MCP server.&lt;/p&gt;

&lt;p&gt;That's the power of standardization. Like USB-C unified charging. Like HTTP unified web communication. MCP unified how AI calls tools. Once the standard holds, the ecosystem snowballs: tool providers build MCP servers because they reach every MCP client. AI developers use MCP because tools are ready-made.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Developers
&lt;/h2&gt;

&lt;p&gt;If you're building AI apps and still hand-writing tool adapters with Function Calling, take MCP seriously. Function Calling works, but MCP eliminates a lot of repetitive work.&lt;/p&gt;

&lt;p&gt;If you're on the data services or SaaS side, pay even closer attention. Building an MCP server is cheap. You immediately reach every AI app in the MCP ecosystem. That's a new distribution channel. Instead of negotiating with AI companies one by one, you put your MCP server out there and they find you.&lt;/p&gt;

&lt;p&gt;MCP isn't perfect. I wrote about its boundaries and pitfalls in another post. But on "standardized tool calling" specifically, MCP is the best solution we have right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Looking back at three years, the trajectory is clear: closed to open, fragmented to standardized, every app writing its own glue code to an ecosystem sharing one protocol. This mirrors web tech history almost exactly: custom interfaces to RESTful standards, private plugins to open APIs.&lt;/p&gt;

&lt;p&gt;Tech evolves this way. A burst of competing approaches, then convergence to a widely accepted standard. MCP is that standard for AI tool calling.&lt;/p&gt;

&lt;p&gt;Which generation did you start with? Plugins era, Function Calling era, or MCP era? Drop a comment.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Amadeus CTO Called Out MCP: I Translated the Take for Developers Who Aren't Overhyping It</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Mon, 28 Sep 2026 00:27:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/amadeus-cto-called-out-mcp-i-translated-the-take-for-developers-who-arent-overhyping-it-214e</link>
      <guid>https://dev.to/iamthedev/amadeus-cto-called-out-mcp-i-translated-the-take-for-developers-who-arent-overhyping-it-214e</guid>
      <description>&lt;p&gt;A post circulated through travel tech circles: Amadeus's CTO said MCP can't handle complex retail workflows. Half the comments said "Amadeus is old and out of touch." The other half said "finally someone is honest." I read the piece three times, then thought about our experience building RollingGo's hotel MCP over the past months. This conversation deserves a sober look.&lt;/p&gt;

&lt;p&gt;No cheerleading here. Just a technical read of what the Amadeus CTO actually said, what MCP can do in travel, and where it falls short.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is Amadeus, and Why Listen?
&lt;/h2&gt;

&lt;p&gt;If you're not in travel tech, you might not know Amadeus. Short version: one of the world's largest GDS (Global Distribution Systems). Roughly half of the airlines, hotels, and travel agencies on the planet run on it. When you book a flight, chances are the back end runs through Amadeus or Sabre.&lt;/p&gt;

&lt;p&gt;So this is a company that has carried the full travel transaction chain in production. Their CTO saying MCP has limits isn't an outsider's hot take. It's experience backed by real money. Worth listening to rather than slapping the "conservative" label on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Did He Actually Say?
&lt;/h2&gt;

&lt;p&gt;The CTO's core argument translates to roughly this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"MCP does well at the lookup layer—searching flights, hotels, prices. That's fine. But a travel transaction isn't just lookup. To actually complete a booking, payment, modification, or service request, you need complex workflows, state management, exception handling, and multi-system coordination. MCP doesn't solve that."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In technical terms: &lt;strong&gt;MCP standardized "how AI calls tools," but it did not standardize "how multiple tools orchestrate into a complete business transaction."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is that right? Mostly yes. We learned this the hard way building hotel MCP.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a "Complex Retail Workflow"? Hotel Booking as an Example
&lt;/h2&gt;

&lt;p&gt;Most people picture booking a hotel as: search, pick, pay, done. Looks simple. Anyone who's built a transaction system knows the depth of the water.&lt;/p&gt;

&lt;p&gt;Hotel booking, end to end, looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Search: by city/date/guests
   → multi-property inventory lookup, real-time requirement
   → dynamic price calculation (member rates, promotions, taxes)

2. Filter: by star rating/location/review score
   → multi-dimensional filtering logic

3. Details: view property info, room types, amenities
   → photos, reviews, policies (cancellation, child policy)

4. Confirm: check live inventory, confirm final price
   → critical step! Price may change, inventory may disappear
   → lock inventory? For how long?

5. Create order: fill guest info, notes
   → identity validation, contact validation

6. Pay: choose payment method, charge
   → payment channels, risk control, reconciliation
   → payment fails: does inventory stay locked?

7. Confirm: receive booking confirmation
   → property-side confirmation, e-voucher generation
   → failure retry mechanism

8. After-sales: cancel, modify, invoice
   → complex change/cancel rules (free cancel? penalty?)
   → refund workflow, customer service involvement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not "call one API." It's a complete transaction workflow with state transitions, exception branches, compensation mechanisms, and consistency requirements.&lt;/p&gt;

&lt;p&gt;What is MCP? A &lt;strong&gt;tool-calling protocol.&lt;/strong&gt; It defines "how an AI client calls a tool on the server." It does not define "how multiple tools orchestrate into a complete business flow."&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP Can and Can't Do
&lt;/h2&gt;

&lt;p&gt;Here's where the boundary sits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Can MCP handle it?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Search &amp;amp; lookup (shopping)&lt;/td&gt;
&lt;td&gt;Yes, and well&lt;/td&gt;
&lt;td&gt;Stateless queries, standard params, exactly what MCP excels at&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filter &amp;amp; sort&lt;/td&gt;
&lt;td&gt;Mostly&lt;/td&gt;
&lt;td&gt;Can be a tool, but complex filtering needs client-side orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Details lookup&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Standard query, no problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price confirm + inventory lock&lt;/td&gt;
&lt;td&gt;Barely, with pitfalls&lt;/td&gt;
&lt;td&gt;Needs state management; MCP's stateless design conflicts here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create order&lt;/td&gt;
&lt;td&gt;Yes, but you fill the gaps&lt;/td&gt;
&lt;td&gt;The order itself is a tool, but consistency around it is on you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment closure&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Payment involves risk control, reconciliation, callbacks, exceptions—MCP didn't design for this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancellation &amp;amp; after-sales&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Complex workflow, multi-system coordination, outside MCP scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plain version: &lt;strong&gt;MCP is a powerhouse for lookup. For transaction closure, it's a starting point, not the destination.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the CTO's point. Don't treat MCP as a silver bullet. It solved "how AI calls tools." Above that layer sit workflow orchestration, transaction consistency, and exception handling—all still on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About UCP?
&lt;/h2&gt;

&lt;p&gt;Amadeus referenced UCP (Universal Commerce Protocol, or User Context Protocol depending on context). The idea: layer a "transaction workflow protocol" on top of MCP.&lt;/p&gt;

&lt;p&gt;If MCP solves "how AI calls tools," UCP aims to solve "how AI completes a full transaction."&lt;/p&gt;

&lt;p&gt;Example: MCP defines how to call &lt;code&gt;search_hotels&lt;/code&gt;. It does not define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After search, user picks a hotel. How does that "choice" pass between client and server?&lt;/li&gt;
&lt;li&gt;After picking, lock inventory. For how long? Lock fails, what happens?&lt;/li&gt;
&lt;li&gt;After order, payment fails. How does inventory release?&lt;/li&gt;
&lt;li&gt;User exits mid-flow. How does the "half-order" get cleaned up?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are basic transaction-system questions. MCP doesn't answer them. UCP aims to standardize them.&lt;/p&gt;

&lt;p&gt;That said, UCP is still early. We built our transaction closure ourselves: &lt;code&gt;conversation_id&lt;/code&gt; maintains session context, a state machine manages order lifecycle, async callbacks handle payment confirmation. MCP the protocol doesn't provide any of this. But because we did the dirty work, developers get a ready-to-use hotel booking capability: 2M+ global hotel properties and 110K+ direct-contracted hotels, direct inventory with real-time price confirmation. What you see is what you can book. Completely free, no call-volume limits, supporting 40+ major LLM clients. Developer partners can set country-based markup rates and earn commission.&lt;/p&gt;

&lt;p&gt;Want to skip building the transaction layer from scratch? &lt;a href="https://global.rollinggo.store/docs/mcp-docs/quick-start" rel="noopener noreferrer"&gt;Follow the quick-start guide&lt;/a&gt; and get an API key.&lt;/p&gt;

&lt;p&gt;Setup in Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.RollingGo-Hotel]&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://mcp.rollinggo.ai/mcp"&lt;/span&gt;
&lt;span class="py"&gt;http_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;"Authorization"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Codex and you're calling hotel search, room detail, and price confirmation directly. No need to spend three months designing your own transaction closure.&lt;/p&gt;

&lt;p&gt;This hotel MCP has run 1.6M managed service calls on ModelScope. Full chain from search to booking works. Behind it: 110K+ direct-contracted hotel properties, real-time price and inventory response. But honestly, transaction complexity isn't something one protocol standardizes away. Every industry's transaction logic is different. Hotels vs. flights vs. insurance vs. car rental. A universal transaction protocol is far harder to build than MCP itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  So Is MCP Useless? Of Course Not.
&lt;/h2&gt;

&lt;p&gt;Saying all this about MCP's limits isn't dismissing it. MCP did the thing it set out to do: standardize tool calling. That's a big deal.&lt;/p&gt;

&lt;p&gt;Analogy: MCP is like HTTP. HTTP defined how browsers and servers communicate. It didn't define how to run an online store, process payments, or manage orders. You don't say "HTTP can't handle e-commerce, so HTTP is useless." HTTP is the foundation. E-commerce systems are a separate layer on top.&lt;/p&gt;

&lt;p&gt;MCP is the same. It's the "HTTP" between AI and tools. It solved the bottom-layer communication standardization. Above it: workflow orchestration, transaction layer, business logic. Those are separate problems.&lt;/p&gt;

&lt;p&gt;The overhyped take now is "with MCP, AI can do everything." That's like saying "with HTTP, e-commerce runs itself." The CTO's cold water corrects that overconfidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Advice for Developers
&lt;/h2&gt;

&lt;p&gt;From our hotel MCP experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Use MCP where it shines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lookup, information, stateless tool calls—go for it. Searching hotels, checking weather, reading documents, querying databases. MCP does these well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. For transactions, MCP is just the entry point&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building a transaction closure—hotel booking, flight purchase, payment—MCP can be your tool-calling layer. But above it, you design workflow orchestration, state management, and exception handling yourself. Don't expect MCP to do that work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Put complex business logic on the server side&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many MCP servers are built as "pure forwarding layers": client sends params, server forwards to a backend API. That's wrong. Complex business logic should live server-side. The client sends high-level intent. Client says "book me a hotel." The server handles search, filter, confirm, and order placement. The client doesn't care about intermediate steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Don't believe "one MCP does everything"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One MCP server can't cover all scenarios. You need multiple MCP servers combined with upper-layer agent orchestration. MCP is building blocks, not the building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Amadeus's CTO says MCP can't handle complex retail workflows. Fair enough. But MCP wasn't built for complex retail workflows. It was built for the more basic question: "how does AI call a tool?"&lt;/p&gt;

&lt;p&gt;The industry problem right now is overstatement. People talk as if MCP means AI can auto-book flights and hotels. That's a misunderstanding. MCP is the foundation, not the building. Good foundations let you build tall, but you still lay bricks yourself.&lt;/p&gt;

&lt;p&gt;Where do you think MCP's boundary sits? Travel tech folks, what have you hit in production? Drop a comment.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MCP 2026 Major Release: What the Stateless Rewrite Actually Changes for Backend Developers</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Sat, 26 Sep 2026 22:26:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/mcp-2026-major-release-what-the-stateless-rewrite-actually-changes-for-backend-developers-32ab</link>
      <guid>https://dev.to/iamthedev/mcp-2026-major-release-what-the-stateless-rewrite-actually-changes-for-backend-developers-32ab</guid>
      <description>&lt;p&gt;Last week I saw MCP's July 2026 spec drop. Scanned the changelog, thought "another update," and moved on. Then I pulled our production hotel MCP service and diffed it against the new spec. This wasn't a patch release. The core protocol flipped from stateful to stateless, and Multi Round-Trip support landed. For backend folks, this isn't "upgrade the SDK." The architecture has to change with it.&lt;/p&gt;

&lt;p&gt;I spent two days going through the new spec, then adapted our RollingGo hotel MCP service. Hit a few walls along the way. This post walks through what actually changed and why it matters for how you write code and design systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before MCP: Stateful Sessions, TCP-style
&lt;/h2&gt;

&lt;p&gt;Old MCP (late 2024 to early 2026) was stateful. Think of it as a TCP connection. Client and server establish a session, keep the line open, and the server holds context, tool lists, and auth state.&lt;/p&gt;

&lt;p&gt;Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client                          Server
  │                               │
  │──── initialize ────────────→│  establish session
  │←─── capabilities ────────────│  server announces what it has
  │                               │
  │──── list_tools ────────────→│  list tools (cached server-side)
  │←─── tools list ──────────────│
  │                               │
  │──── call_tool("search") ──→│  call a tool
  │←─── result ─────────────────│
  │                               │
  │──── shutdown ──────────────→│  close session
  │                               │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple design. The server caches tool lists and maintains context, so the client doesn't resend metadata on every call.&lt;/p&gt;

&lt;p&gt;But the problems were obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard to scale horizontally.&lt;/strong&gt; The session lives on one server instance. Load balancing needs sticky sessions. Capacity expansion gets painful as traffic grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor failure recovery.&lt;/strong&gt; Server goes down, session dies, client re-initializes from scratch. High-availability setups suffer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-server coordination is awkward.&lt;/strong&gt; Want hotel MCP and flight MCP on different services? How do sessions share across them? The old spec didn't address this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ran into this deploying RollingGo's hotel MCP. Nginx load-balanced across instances, but requests kept landing on different backends. Session mismatches threw errors. The fix was sticky-session config, which killed scaling flexibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed: Stateless, HTTP-style
&lt;/h2&gt;

&lt;p&gt;The July 2026 spec's core change: &lt;strong&gt;session state moves from server to client.&lt;/strong&gt; The server is fully stateless. Every request is independent. The server holds no context.&lt;/p&gt;

&lt;p&gt;Now it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client                          Server
  │                               │
  │──── initialize + tool list ─→│  one-time handshake, cached client-side
  │←─── capabilities ─────────────│
  │                               │
  │  (client caches tool schemas, auth info)
  │                               │
  │──── call_tool("search") ──→│  every request carries full context
  │     + auth token              │
  │     + tool schema version     │
  │←─── result ─────────────────│
  │                               │
  │──── call_tool("book") ────→│  next request is still independent
  │     + auth token              │  server doesn't remember your last call
  │←─── result ─────────────────│
  │                               │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In plain terms: from a TCP model to an HTTP model. The server scales to any number of instances, routes anywhere, and dying doesn't matter because there's no state to lose.&lt;/p&gt;

&lt;p&gt;Backend folks know this feeling. This is what web services have always done. Why did REST beat SOAP? Stateless, scalable, easy to deploy. MCP finally caught up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi Round-Trip: A Single Call Can Go Back and Forth
&lt;/h2&gt;

&lt;p&gt;The other major addition is Multi Round-Trip support. Old MCP tool calls were one-shot: send request, server returns result, done.&lt;/p&gt;

&lt;p&gt;But real-world tool calls aren't always one-step. Booking a hotel is: search hotels → view room types → select dates and confirm price → create order → confirm payment. Five steps, each requiring client-server communication.&lt;/p&gt;

&lt;p&gt;How did the old version handle this? You split it into five independent tools, each stateless. But the steps depend on each other: which hotel did you pick? Which room type? How do you pass that context? The old spec didn't design for it. You stuffed context into tool parameters or built your own session hack. Clunky.&lt;/p&gt;

&lt;p&gt;Multi Round-Trip solves this. The server can return "still need to continue" within a single tool call, the client sends the next request, and the server maintains context within the same "logical conversation." Key detail: this context lives on the client side, not as a server-side session.&lt;/p&gt;

&lt;p&gt;Using RollingGo's hotel MCP as an example, the booking flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Step 1: search hotels
&lt;/span&gt;&lt;span class="n"&gt;result1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_hotels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hangzhou&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-03&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# Returns N hotels plus a conversation_id
&lt;/span&gt;
&lt;span class="n"&gt;conv_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversation_id&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: user picks a hotel, fetch details
&lt;/span&gt;&lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_hotel_detail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conversation_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;conv_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# client passes context back
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hotel_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hotels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: select room type, confirm price
&lt;/span&gt;&lt;span class="n"&gt;result3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confirm_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conversation_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;conv_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;room_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Step 4: place the order
&lt;/span&gt;&lt;span class="n"&gt;result4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create_booking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conversation_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;conv_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_quote_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote_id&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key difference: &lt;strong&gt;conversation_id is held by the client and sent on each request. It's not a server-maintained session.&lt;/strong&gt; The server stays stateless while supporting multi-step workflows. Clever design.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Your Code
&lt;/h2&gt;

&lt;p&gt;When we adapted RollingGo's hotel MCP from old to new spec, the code changes were significant. Here are the critical ones:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Rip out the session storage layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We used Redis to store session state. On connect, we generated a session_id, cached tool lists and user auth info in Redis. Now it's all gone. Every request parses the auth token from headers. Tool schemas are hardcoded or loaded from files. Nothing stored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Upgrade the client SDK; cache tool lists locally&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Old client connected, called list_tools once, and the server maintained the tool list. New spec requires the client to cache tool schemas and send a version number on each call. If the server updates its tools, the version bumps and the client refetches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Move conversation context from server to request params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Old multi-step state lived in the server session. Now it's client-side conversation_state, sent on each request. The server does stateless computation and validation only.&lt;/p&gt;

&lt;p&gt;The most immediate payoff: &lt;strong&gt;deployment got simpler.&lt;/strong&gt; No more sticky sessions, Redis sharing, or session syncing. Throw it into K8s, scale horizontally, route anywhere, restart freely. On the monitoring dashboard, service availability jumped from 99.5% to 99.9%. The old Redis-induced session loss issues just disappeared.&lt;/p&gt;

&lt;p&gt;RollingGo's hotel MCP now has thousands of developers integrating it, mostly from travel tech and enterprise services. Stateless architecture matters here because call volumes vary wildly across integrators. Elastic scaling is essential. Behind it runs official data sources and years of travel supply chain integration—full-chain direct API connection, direct inventory with real-time price confirmation, so what you see is what you can book. It aggregates 500+ global suppliers and 2M+ hotel properties. Completely free, no call-volume limits, supporting 40+ major LLM clients including Cursor, Claude Code, Codex, and Windsurf. Developer partners can set country-based markup rates and earn commission on completed bookings, with orders and revenue visible in real time and flexible withdrawal.&lt;/p&gt;

&lt;p&gt;Want to try the stateless MCP experience? &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;Check out the GitHub repo&lt;/a&gt; and grab a key. From registration to running, under 20 minutes.&lt;/p&gt;

&lt;p&gt;Setup in Trae takes about this much code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RollingGo-Hotel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.rollinggo.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Trae, and you're calling hotel search, room detail, and price confirmation directly in chat. The stateless design means whichever client you use, whatever environment you deploy in, it just works. No session loss worries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Architects Need to Figure Out
&lt;/h2&gt;

&lt;p&gt;If you're designing enterprise MCP services or building an MCP gateway, several questions need answers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. How do you handle auth?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Server is stateless now, so every request carries credentials. JWT, OAuth2 tokens, API keys—all the mature HTTP-world options work. But you need to figure out: how are tokens issued? Refreshed? Revoked? Session management used to handle this. Now you build it yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. How do you rate-limit and enforce quotas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Old model: rate-limit per session. New model: rate-limit per user, per API key. At scale, do you build distributed rate limiting or stick with single-instance? Architecture-level decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. How do you manage tool versions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Client caches tool schemas. When the server updates tools, how does the client know? How do you design version numbers? How do you do gray rollouts? With sessions, the server could push updates. Now you're polling or eventing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. How do you support complex workflows?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multi Round-Trip gives you protocol-level support for multi-step conversations. But business scenarios—like hotel booking with payments, inventory locks, and confirmations—still require you to design state machines, handle exception rollbacks, and guarantee data consistency. The protocol gives you building blocks. You build the house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls: Don't Just Upgrade the SDK
&lt;/h2&gt;

&lt;p&gt;The biggest lesson from our migration: &lt;strong&gt;upgrading the SDK is not enough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;People see a new SDK version, run pip install, watch it work, and call it done. But stateful-to-stateless is an architecture change. Your session management code, sticky-session config, Redis dependencies—all technical debt. Leave them in place and they'll bite you later.&lt;/p&gt;

&lt;p&gt;We hit one wall: old-version clients were still connecting to our new server. Since the server went stateless, it didn't recognize old session formats and threw errors. We built a compatibility layer that supported both modes during a transition period. It took two weeks to fully cut over.&lt;/p&gt;

&lt;p&gt;Another gotcha: monitoring. Old metrics tracked online users by session count. Sessions don't exist anymore, so that metric is meaningless. You need request volume, active users, and API-key-level monitoring. Otherwise you watch your dashboard and think your data vanished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;MCP's shift from stateful to stateless is the right direction. Stateless isn't new—it's the most reliable design pattern in distributed systems: simple, scalable, fault-tolerant. MCP reaching this point means it graduated from "protocol in a lab" to "standard that handles production traffic."&lt;/p&gt;

&lt;p&gt;Of course, change brings learning costs. Old code needs updating. Architecture needs adjustment. Teams need to re-learn the protocol. But long term, this step is unavoidable. You can't expect a session-based protocol to support tens of thousands of MCP servers and millions of agents.&lt;/p&gt;

&lt;p&gt;Has your MCP service upgraded yet? Hit any walls? Drop a comment and compare notes.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MCP Is the USB-C of AI</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Fri, 25 Sep 2026 23:24:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/mcp-is-the-usb-c-of-ai-4pln</link>
      <guid>https://dev.to/iamthedev/mcp-is-the-usb-c-of-ai-4pln</guid>
      <description>&lt;p&gt;Last month my boss threw a requirement at me: "Build an AI travel assistant that can search flights, book hotels, find attractions, and calculate budgets. Ship a demo in a week." I said no problem, pounded my desk, and then froze on day one.&lt;/p&gt;

&lt;p&gt;Searching flights meant integrating one OTA's API. Booking hotels meant a different one. Finding attractions required a third-party data service. Three companies, three auth methods, three parameter formats, three APIs that read like ancient hieroglyphics. Just figuring out how each one authenticated took me most of a day. Debugging parameters went until 2 AM. I ended up writing 1,200 lines of adapter code just to convert three completely different JSON structures into a unified format the AI could call.&lt;/p&gt;

&lt;p&gt;The demo shipped. But I knew it was unmaintainable. The moment any API bumped a version number, I'd be chasing code changes across all three. At that point I thought: isn't there a standard for this?&lt;/p&gt;

&lt;p&gt;Then I found MCP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remember USB-C? From a Junk Drawer of Cables to One Wire
&lt;/h2&gt;

&lt;p&gt;If you've used a smartphone for more than five years, you remember the cable chaos era. Micro USB, Mini USB, Lightning, Samsung's own proprietary connector, Nokia's round pin. My travel bag always had three or four cables, and I'd still bring the wrong one. Once I was at a hotel front desk borrowing a charger, testing five different connectors one by one. That feeling of helplessness still makes my scalp tingle.&lt;/p&gt;

&lt;p&gt;Then USB-C showed up. One cable charges, transfers data, drives a monitor, and connects peripherals. You stop caring what device is on the other end. Plug it in and it works. The whole industry went from fragmentation to standardization in under three years.&lt;/p&gt;

&lt;p&gt;MCP does the exact same thing, except it standardizes not physical connectors but the software interface between AI and external tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP, Actually?
&lt;/h2&gt;

&lt;p&gt;MCP stands for Model Context Protocol. Anthropic rolled it out in late 2024. Don't let the name intimidate you. It's one sentence: &lt;strong&gt;an industry standard for connecting AI to tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before MCP, if you wanted ChatGPT or Claude to call an external tool—say, search hotels—you had to write the function-calling schema yourself, handle auth yourself, build retries yourself, and validate parameters yourself. Switch to a different tool? Start over. Every tool had its own calling convention, and you wrote custom code for each one.&lt;/p&gt;

&lt;p&gt;MCP's idea is simple: if a tool implements an MCP Server, every MCP-compatible AI client—Claude Desktop, Cursor, Windsurf, or your own agent—connects to it directly. Like USB-C: plug it in and it works, no driver installation needed.&lt;/p&gt;

&lt;p&gt;The architecture is minimal, roughly three layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐
│  AI Client      │  ← Claude Desktop / Cursor / custom agent
│  (MCP Client)   │
└────────┬────────┘
         │  MCP protocol (unified standard)
┌────────┴────────┐
│  MCP Server     │  ← one per tool provider
│  (tool owner)   │
└────────┬────────┘
         │
    ┌────┴────┬────────┬────────┐
    ▼         ▼        ▼        ▼
  Hotel MCP  Flight   Weather  Calendar
  Server     MCP      MCP      MCP
             Server   Server   Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shift: previously, AI apps adapted to each tool. Now tool providers implement MCP once, and every MCP-aware AI app uses it automatically. &lt;strong&gt;The integration work drops from "N AI apps × M tools" to "M tools, one implementation each."&lt;/strong&gt; That's a order-of-magnitude reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traditional Integration vs. MCP: Show Me the Code
&lt;/h2&gt;

&lt;p&gt;Concepts are boring. Let's compare code directly, based on my actual hotel-and-flight integration experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional approach: write a custom adapter for each tool&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Hotel API: Bearer token, GET, query string params
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_hotels_ota&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;checkin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;OTA_API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checkIn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;checkin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checkOut&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.ota-example.com/v3/hotels/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# OTA returns data.hotels[].roomTypes[]
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;normalize_ota_hotels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Flight API: API key in header, POST, JSON body
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_flights_air&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;departure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrival&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FLIGHT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# note: not "Authorization"
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;origin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;departure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;destination&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arrival&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;departureDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cabinClass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ECONOMY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.air-example.com/flight/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Flight returns data.results[].fare[]
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;normalize_flights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Every new tool repeats this: auth, request, parse, normalize
# My travel demo adapter layer alone was 1,200 lines
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MCP approach: one unified client, plug and play&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ClientSession&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;use_hotel_mcp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Connect to the MCP server in one line
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://rollinggo-hotel-mcp:8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Auto-discover available tools, no schema needed
&lt;/span&gt;        &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Found &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Call directly; parameter schema is auto-validated
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_hotels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Shanghai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-05&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="c1"&gt;# Returns a standard format the AI understands
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;use_flight_mcp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Different MCP server, same client, same calling convention
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://flight-mcp:8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_flights&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;origin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PEK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;destination&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-10-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference: you stop caring about each API's auth method, request format, parameter style, and response structure. MCP standardizes all of it. Once the AI client connects to the MCP server, it knows what tools exist, what parameters each takes, and what the response looks like.&lt;/p&gt;

&lt;p&gt;When I connected RollingGo's hotel MCP last week, going from API key registration to actually searching hotels inside Cursor took under 20 minutes. Before MCP, just reading docs and debugging parameters took two days.&lt;/p&gt;

&lt;p&gt;And honestly, among all the MCP servers I've tried, RollingGo's hotel MCP is the one I keep coming back to. Three reasons: free, unlimited, actually works.&lt;/p&gt;

&lt;p&gt;The point that matters most to developers: &lt;strong&gt;completely free, no call-volume limits.&lt;/strong&gt; Most MCP servers either charge per call or cap your quota and shut you down mid-development. RollingGo just lets you use it—register an API key and go, whether you're building a demo or running production. No bill to worry about.&lt;/p&gt;

&lt;p&gt;Data quality matters too. Behind it sit 2M+ global hotel properties, including 110K+ direct-contracted hotels. Inventory and prices sync in real time. That means the room availability and price the AI shows the user matches what they actually get when they book. No "we had a room when you searched, but it's gone now" surprises. Anyone who's built a travel product knows: inaccurate inventory is the killer bug.&lt;/p&gt;

&lt;p&gt;Compatibility checks out. It supports 40+ major LLM clients and agent platforms—Cursor, Claude Code, Codex, Windsurf, Copilot. You use whichever client you want; no adapter layer needed. Over 2,000 agents already connect to it: regional tourism platforms, AI earbuds, AI glasses, trip-planning apps. The ecosystem is real.&lt;/p&gt;

&lt;p&gt;Setup takes about as much code as it looks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RollingGo-Hotel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.rollinggo.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"streamable-http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Restart Cursor, and you're searching hotels directly in the chat. From key registration to running, 20 minutes. Before, integrating a single hotel API took two days. That's the USB-C effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP Actually Changes: Division of Labor, Not Just Tech
&lt;/h2&gt;

&lt;p&gt;Most people talk about MCP's technical details. I think that misses the point. MCP changes &lt;strong&gt;how the industry splits work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before: you build an AI app, you integrate every data source yourself. Want the AI to book hotels? Integrate a hotel API. Want it to search flights? Integrate a flight API. Every AI app repeats the same integration work. Industry efficiency is terrible.&lt;/p&gt;

&lt;p&gt;After: data providers—hotel inventory platforms, flight distribution systems—implement MCP once. Every MCP-aware AI app connects automatically. AI app developers stop worrying about where data comes from, how auth works, or how to parse responses. They focus on what they're good at: conversation experience, agent orchestration, user product design.&lt;/p&gt;

&lt;p&gt;This is what REST APIs did for web frontends and backends. Before REST, every site decided its own data format. After REST became standard, frontends stopped caring what language the backend was written in, and backends stopped caring whether the frontend used Vue or React. MCP does the same thing in the AI era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Pay Attention to MCP Now?
&lt;/h2&gt;

&lt;p&gt;If you build AI apps—agents, copilots, vertical AI assistants—spend half a day understanding MCP. Not because it's trendy, but because it eliminates real repetitive work.&lt;/p&gt;

&lt;p&gt;If you're on the data services side—hotels, flights, dining, logistics, SaaS—pay even closer attention. Implementing an MCP server is cheap, and you immediately reach every AI app in the MCP ecosystem. That's a new distribution channel. Instead of negotiating with AI companies one by one, you put your MCP server out there and they come to you.&lt;/p&gt;

&lt;p&gt;MCP isn't a silver bullet. It solves "how AI calls tools," but it doesn't solve whether the tool is good, whether the data is accurate, or whether the price is competitive. I'll write about MCP's boundaries and pitfalls in a separate piece.&lt;/p&gt;

&lt;p&gt;But on "unified interface" specifically, MCP did what USB-C did: it took a fragmented world and snapped it back together.&lt;/p&gt;

&lt;p&gt;Still integrating APIs one by one? Drop your horror story in the comments. I'm not the only one who's been there.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2026 Hotel MCP Industry Report — Deep Dive</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Fri, 25 Sep 2026 01:21:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/2026-hotel-mcp-industry-report-deep-dive-3dm1</link>
      <guid>https://dev.to/iamthedev/2026-hotel-mcp-industry-report-deep-dive-3dm1</guid>
      <description>&lt;p&gt;In 2026, MCP (Model Context Protocol) is rapidly moving from proof-of-concept to scaled adoption in the hotel industry. Leading enterprises have deployed MCP across AI in-stay services, immersive content distribution, and direct booking connectivity. Industry consensus is forming — MCP will become the core protocol layer for hotel AI infrastructure, and brand-level MCPs may reshape hotel distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Industry Overview
&lt;/h2&gt;

&lt;p&gt;The global hotel market reached approximately $219.78B in 2026, projected to grow to &lt;strong&gt;$&lt;/strong&gt;393.14B** by 2034 (CAGR 7.54%) (Fortune Business Insights).&lt;/p&gt;

&lt;p&gt;Technology adoption intent is mature: &lt;strong&gt;89%&lt;/strong&gt; of hotel operators plan to apply new AI technology in the near term (IDeaS 2026 Hotel Tech Forecast). This means market readiness for protocol-layer solutions like MCP is essentially achieved.&lt;/p&gt;

&lt;p&gt;Core pain points driving adoption: intensified homogeneous competition compressing margins, structural staffing shortages (especially during peak seasons), slow service response times, and persistent &lt;strong&gt;data silos&lt;/strong&gt; between business systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global hotel market size&lt;/strong&gt; — 2026 Data: $219.78B. Trend: Projected $393.14B by 2034, CAGR 7.54%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI tech adoption intent&lt;/strong&gt; — 2026 Data: 89% of hotel operators plan to adopt. Trend: Market acceptance mature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hotel service robot market&lt;/strong&gt; — 2026 Data: $1.13B (2026). Trend: Projected $8.76B by 2035, CAGR 25.5%.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Metric&lt;/th&gt;
&lt;th&gt;2026 Data&lt;/th&gt;
&lt;th&gt;Trend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Global hotel market size&lt;/td&gt;
&lt;td&gt;$219.78B&lt;/td&gt;
&lt;td&gt;Projected $393.14B by 2034, CAGR 7.54%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI tech adoption intent&lt;/td&gt;
&lt;td&gt;89% of hotel operators plan to adopt&lt;/td&gt;
&lt;td&gt;Market acceptance mature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hotel service robot market&lt;/td&gt;
&lt;td&gt;$1.13B (2026)&lt;/td&gt;
&lt;td&gt;Projected $8.76B by 2035, CAGR 25.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How MCP Reshapes Hotel AI Infrastructure
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) is an open standard created by Anthropic. Its core value: giving AI agents a standardized way to query external systems and get structured responses — replacing page scraping and "hallucination" from stale text.&lt;/p&gt;

&lt;p&gt;For hotels, MCP is especially significant. Hotel products aren't simple SKUs — they're dynamic combinations of rooms, views, meeting spaces, recent renovations, amenities, packages, seasonal pricing, brand standards, and ownership constraints. MCP can effectively carry and transmit this complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional API integration pain points:&lt;/strong&gt; complex deployment, high maintenance cost, poor extensibility, weak permission control, insufficient real-time data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP protocol advantages:&lt;/strong&gt; standardized access, fine-grained permission control (OAuth 2.1), real-time data retrieval, reduced hallucination risk, ecosystem-friendly open standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OAuth 2.1&lt;/strong&gt; is critical in MCP architecture — it ensures fine-grained access control. If an API key's scope is limited to one hotel group, the agent can only see that group's information through that key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Players and Events: H1 2026 Landscape
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RollingGo Hotel MCP, backed by Dida Holdings&lt;/strong&gt; — A pioneer in deeply integrating MCP protocol into hotel full-chain services. In H1 2026, RollingGo opened its Hotel MCP Server, exposing real-time inventory and pricing across 2M+ global hotels and 110K+ direct-contracted properties via standardized MCP interfaces. Unlike traditional OTA closed APIs, RollingGo's MCP architecture allows AI agents to complete the full "search → compare → book" chain. Its 500+ global supplier integration means agents can, for the first time, cross single-channel boundaries for true cross-platform comparison. Both individual developers and enterprises can access it free of charge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aven Hospitality&lt;/strong&gt; (formerly Sabre's hotel tech unit, acquired by TPG for &lt;strong&gt;$1.1B&lt;/strong&gt; in 2025) embedded MCP into its &lt;strong&gt;SynXis&lt;/strong&gt; central reservation system, serving 35,000+ hotels globally. Aven launched an MCP early access program in Q2 2026, allowing agents to directly access real-time inventory, dynamic pricing, and distribution control rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visiting Media&lt;/strong&gt; released its &lt;strong&gt;VMP API MCP Server&lt;/strong&gt; in June 2026, built in ~10 days with OAuth 2.1. It lets agents query hotels' richest digital assets — immersive media (virtual tours), property details, room-level context, and venue assets. Co-founder Chad Kimner's strategic positioning: "Brand-level MCP becomes the distribution interface; Visiting Media is the content layer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marriott International&lt;/strong&gt; partnered with a major cloud platform to build an AI hotel service assistant, covering 10,000+ properties within months — demonstrating AI's rapid scale from flagship properties to tier-3 and tier-4 markets.&lt;/p&gt;

&lt;p&gt;Industry media: &lt;strong&gt;Cendyn&lt;/strong&gt; and &lt;strong&gt;Hospitality Net&lt;/strong&gt; both published features declaring "2026 is the year of MCP."&lt;/p&gt;

&lt;h2&gt;
  
  
  Application Scenarios: From POC to Scaled Value
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;B2C (guest-facing):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI in-stay services:&lt;/strong&gt; Guest requests, extensions, invoicing, info queries. Some properties hit 94% single-day usage rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immersive content distribution:&lt;/strong&gt; Agents query virtual tours, HD images, videos directly via MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart booking and consulting:&lt;/strong&gt; Real-time room status, precise pricing, personalized recommendations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;B2B (hotel-facing):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal management:&lt;/strong&gt; Staff query operations manuals, brand standards, property details via AI assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data-driven operations:&lt;/strong&gt; AI agents integrated with PMS convert static info (cleaning status, maintenance, energy data) into dynamic operational insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenue management:&lt;/strong&gt; Managers interact with AI to analyze market data, simulate pricing strategies, adjust distribution channel parameters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges and Trends
&lt;/h2&gt;

&lt;p&gt;Challenges remain: customer onboarding has just begun; agent discovery, ranking, and attribution standards are still forming; the capability leap from "conversation" to reliable "task execution" takes time; data security and fine-grained permission control remain top concerns for hotel owners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core trend:&lt;/strong&gt; The hotel industry spent 20 years optimizing search engines. The next 10 years will be spent optimizing AI agents. This means digital marketing and distribution strategy must shift from solely focusing on SEO/SEM to simultaneously optimizing for AI agent discoverability, information structuredness, and interface friendliness.&lt;/p&gt;

&lt;p&gt;Three clear trends:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;From "AI-enabled" to "AI-native"&lt;/strong&gt; — AI is no longer just an efficiency tool but is reconstructing the full business flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From single-system to holistic digital systems&lt;/strong&gt; — Hotels build data-connected, business-coordinated systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market penetration accelerating&lt;/strong&gt; — 24% of enterprises plan full AI deployment in 2026, double the 12% in 2025.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Outlook: MCP as Hotel AI Infrastructure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Brand-level MCP will become the new distribution interface.&lt;/strong&gt; Hotel groups may build their own brand MCP Servers to distribute content and services directly to AI travel assistants, smart speakers, in-car systems, and other emerging traffic channels — reducing dependence on traditional OTA channels.&lt;/p&gt;

&lt;p&gt;Hotels need to build &lt;strong&gt;"search engine + AI agent" dual optimization&lt;/strong&gt; capabilities — maintaining SEO while ensuring core data (room types, amenities, pricing policies) and premium content (virtual tours, HD media) are accurately retrievable via MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sovereignty and control&lt;/strong&gt; will rise as a core competitive factor. MCP's embedded OAuth permission control lets hotels finely manage which data is accessible to whom, in what context.&lt;/p&gt;

&lt;p&gt;2026 as "the year of MCP" opens a new hotel era — one built on intelligent protocols and data-driven foundations.&lt;/p&gt;

&lt;p&gt;Btw, what I'm building is RollingGo Hotel MCP, open-source, free for individual and enterprise developers.GitHub: &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global&lt;/a&gt;. Please give me feedback if you have any questions about integration.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testing 5 Hotel and Flight MCP Server</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Wed, 23 Sep 2026 22:17:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/testing-5-hotel-and-flight-mcp-server-189</link>
      <guid>https://dev.to/iamthedev/testing-5-hotel-and-flight-mcp-server-189</guid>
      <description>&lt;p&gt;My current project involves a travel AI agent, so I've spent significant time researching the Travel MCP space. Here's my hard-won lesson: connecting hotel APIs is harder than it looks.&lt;/p&gt;

&lt;p&gt;Initially, I thought it was straightforward: find an OTA open platform, connect an HTTP API, call parameters, get prices, done. After researching, I discovered that major OTA platforms don't open APIs to individual developers at all. Want access? Business negotiation, security deposit, contract signing, approval waiting — by the time you're through, the opportunity is gone.&lt;/p&gt;

&lt;p&gt;Then I looked at international GDS systems (Amadeus, Sabre, Travelport). They don't accept small clients either. API documentation runs hundreds of pages of PDFs, and some charge per-query fees before you even start using them.&lt;/p&gt;

&lt;p&gt;Here's my comparison of the solutions I actually tested:&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Mainstream Solutions Compared
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hotel coverage&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: 2M+ global&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): ~100K+ global&lt;/li&gt;
&lt;li&gt;Sabre (GDS): ~100K+ global&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Primarily domestic, ~500K&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: Unstable data sources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct-contracted&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: 110K+&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): Not transparent&lt;/li&gt;
&lt;li&gt;Sabre (GDS): Not transparent&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Not transparent&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: None&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flight suppliers&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: 500+ airlines&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): Hundreds&lt;/li&gt;
&lt;li&gt;Sabre (GDS): Hundreds&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Primarily domestic&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: None&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access barrier&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: Individual key available&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): Enterprise + business negotiation&lt;/li&gt;
&lt;li&gt;Sabre (GDS): Enterprise + business negotiation&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Enterprise + deposit&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: Open-source but no supply chain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing model&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: Free, no explicit cap&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): Per-query billing&lt;/li&gt;
&lt;li&gt;Sabre (GDS): Per-query billing&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Commission model&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: Free but no guarantee&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP protocol support&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: ✅ Official native&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): ❌ None&lt;/li&gt;
&lt;li&gt;Sabre (GDS): ❌ None&lt;/li&gt;
&lt;li&gt;Major OTA Platform: ❌ None&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: ⚠️ Third-party wrapper&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill capability&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: ✅ Official native&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): ❌ None&lt;/li&gt;
&lt;li&gt;Sabre (GDS): ❌ None&lt;/li&gt;
&lt;li&gt;Major OTA Platform: ❌ None&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: ❌ None&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;RollingGo: GitHub: &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amadeus (GDS): Scattered, must purchase&lt;/li&gt;
&lt;li&gt;Sabre (GDS): Scattered, must purchase&lt;/li&gt;
&lt;li&gt;Major OTA Platform: Varies&lt;/li&gt;
&lt;li&gt;Open-source Travel MCP: Community-maintained&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;RollingGo&lt;/th&gt;
&lt;th&gt;Amadeus (GDS)&lt;/th&gt;
&lt;th&gt;Sabre (GDS)&lt;/th&gt;
&lt;th&gt;Major OTA Platform&lt;/th&gt;
&lt;th&gt;Open-source Travel MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hotel coverage&lt;/td&gt;
&lt;td&gt;2M+ global&lt;/td&gt;
&lt;td&gt;~100K+ global&lt;/td&gt;
&lt;td&gt;~100K+ global&lt;/td&gt;
&lt;td&gt;Primarily domestic, ~500K&lt;/td&gt;
&lt;td&gt;Unstable data sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct-contracted&lt;/td&gt;
&lt;td&gt;110K+&lt;/td&gt;
&lt;td&gt;Not transparent&lt;/td&gt;
&lt;td&gt;Not transparent&lt;/td&gt;
&lt;td&gt;Not transparent&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flight suppliers&lt;/td&gt;
&lt;td&gt;500+ airlines&lt;/td&gt;
&lt;td&gt;Hundreds&lt;/td&gt;
&lt;td&gt;Hundreds&lt;/td&gt;
&lt;td&gt;Primarily domestic&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access barrier&lt;/td&gt;
&lt;td&gt;Individual key available&lt;/td&gt;
&lt;td&gt;Enterprise + business negotiation&lt;/td&gt;
&lt;td&gt;Enterprise + business negotiation&lt;/td&gt;
&lt;td&gt;Enterprise + deposit&lt;/td&gt;
&lt;td&gt;Open-source but no supply chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing model&lt;/td&gt;
&lt;td&gt;Free, no explicit cap&lt;/td&gt;
&lt;td&gt;Per-query billing&lt;/td&gt;
&lt;td&gt;Per-query billing&lt;/td&gt;
&lt;td&gt;Commission model&lt;/td&gt;
&lt;td&gt;Free but no guarantee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP protocol support&lt;/td&gt;
&lt;td&gt;✅ Official native&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;⚠️ Third-party wrapper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill capability&lt;/td&gt;
&lt;td&gt;✅ Official native&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Complete docs at global.rollinggo.store&lt;/td&gt;
&lt;td&gt;Scattered, must purchase&lt;/td&gt;
&lt;td&gt;Scattered, must purchase&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Community-maintained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Data sources: Official platform information + personal testing, as of June 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP Support Matters
&lt;/h2&gt;

&lt;p&gt;MCP protocol support is one of the dimensions I value most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GDS systems:&lt;/strong&gt; Zero MCP support. You must write your own adapter — significant extra development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional OTA platforms:&lt;/strong&gt; REST APIs. Self-integration, substantial workload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source MCP community:&lt;/strong&gt; Some travel-related MCPs exist, but most are hobbyist projects with unstable data sources and no dedicated supply chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RollingGo:&lt;/strong&gt; Officially supports MCP protocol and Skill capability at the platform level. The MCP endpoint is directly exposed — Claude, Cursor, and other MCP-compatible clients work out of the box with zero bridge code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pros and Cons of RollingGo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent-native interaction&lt;/strong&gt; — Natural conversation completes the full booking flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time inventory + pricing&lt;/strong&gt; — Direct inventory connection with real-time price confirmation, zero latency, all results directly bookable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mature supply chain&lt;/strong&gt; — Backed by Dida Holdings, the world's third-largest travel B2B platform, 14 years of travel supply chain experience, full-chain API direct connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation could be more detailed&lt;/strong&gt; — Core functionality docs are sufficient, but advanced usage (multi-destination batch queries, price monitoring threshold configuration) needs more explanation. Some things required trial and error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No SDK yet&lt;/strong&gt; — Currently API-only. A Python/Node.js SDK would be convenient for non-MCP scenarios (e.g., calling directly from a web app).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who Should Use This
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers building travel agents&lt;/strong&gt; — Native MCP support, lowest integration cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independent developers needing real hotel/flight data&lt;/strong&gt; — Direct-contracted supply chain, trustworthy inventory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual developers blocked by OTA business processes&lt;/strong&gt; — Direct key application, low barrier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product teams requiring data accuracy&lt;/strong&gt; — 110K direct-contracted + 500+ suppliers, broad coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're researching travel data APIs, check the RollingGo integration docs — it's significantly less hassle than the GDS system.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What Can an Agent Actually Do with MCP?</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Wed, 23 Sep 2026 13:14:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/what-can-an-agent-actually-do-with-mcp-14pj</link>
      <guid>https://dev.to/iamthedev/what-can-an-agent-actually-do-with-mcp-14pj</guid>
      <description>&lt;p&gt;I have been building a travel AI agent for the past few months, which meant spending a lot of time evaluating the Travel MCP. I have tested what actually works — so you do not have to repeat the same experiments.&lt;/p&gt;

&lt;p&gt;Last week I was debugging a trip-planning agent. Before connecting any MCP, it could only chat — the user would say "book me a hotel," and it would respond with a wall of suggestions but could not actually book.&lt;/p&gt;

&lt;p&gt;After connecting to MCP, I threw the same prompt at the agent. It came back with a real table:&lt;/p&gt;

&lt;p&gt;Agent response after MCP connection&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`+--------------------------------------+----------+--------+------+----------+
| Hotel                                | Location | Price  | Star | Metro    |
+--------------------------------------+----------+--------+------+----------+
| Hotel Monterey Grasmere Osaka        | Yodoyabashi| $687/n| 4★  | 3 min    |
| Smile Hotel Namba                    | Shinsaibashi| $542/n| 3★  | 7 min    |
+--------------------------------------+----------+--------+------+----------+`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent did not just search — it figured out the prompt context and translated it into structured query parameters on its own and then give the link that could be booked.&lt;/p&gt;

&lt;p&gt;That was the moment I realized: the way you connect tools to an agent does not just add capability — it changes the level at which the agent operates.&lt;/p&gt;

&lt;p&gt;The traditional approach for connecting to hotel data is to call a search API, get a pile of results, and have the LLM read through them to make recommendations. The problem is that a general-purpose LLM has no idea about &lt;strong&gt;real-time prices&lt;/strong&gt; or &lt;strong&gt;actual availability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After connecting to MCP, I sent the agent this prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Osaka, 5 nights, budget 500–700, near a subway station, free cancellation policy"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent broke the request into three search parameters on its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Price range: 500–700&lt;/li&gt;
&lt;li&gt;Location: within 500m of a subway station&lt;/li&gt;
&lt;li&gt;Cancellation: free cancellation only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it queried real available hotels in Osaka via MCP, filtered out anything that did not match, and returned exactly three results — all bookable, all meeting every criterion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price Comparison — The Agent Picks the Best Option
&lt;/h2&gt;

&lt;p&gt;This is where I felt the MCP connection paid for itself.&lt;/p&gt;

&lt;p&gt;I asked the agent to search "Paris, June 20–22, five-star, within 3 km of Eiffel Tower." It called the MCP and got back a batch of hotels. But that was not the end — it then did four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sorted all results by total price including tax&lt;/li&gt;
&lt;li&gt;Filtered for free-cancellation options (reducing user decision risk)&lt;/li&gt;
&lt;li&gt;Annotated each hotel's cancellation deadline&lt;/li&gt;
&lt;li&gt;Provided a recommendation rationale: "This one is 23% cheaper than other five-star hotels in the same area, and has the highest review count"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not simple price comparison. The agent needs to understand what actually blocks a user's decision — free cancellation, review volume, distance. If the MCP does not return these fields, the agent can only guess. Without real inventory and pricing data, "the agent helps you decide" is a castle in the air.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Tool Chain — Agent Strings Together Flight + Hotel
&lt;/h2&gt;

&lt;p&gt;This was the most complex scenario I ran, and the closest to what I would call a "real agent."&lt;/p&gt;

&lt;p&gt;I sent the agent this message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Business trip to Beijing next Wednesday through Friday. Check flights and hotels near CBD, keep total budget under 2000."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It executed in three steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; — Called Flight MCP to search Hangzhou-to-Beijing flights for June 17, filtering out anything over budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; — Called Hotel MCP to search Beijing CBD hotels, checking which ones still fit within the remaining budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; — Combined both results and generated an optimal flight-plus-hotel package.&lt;/p&gt;

&lt;p&gt;Notably, the agent never asked me for confirmation during this process. It judged on its own: for a business trip, location matters more than star rating, so it prioritized proximity to CBD over five-star luxury.&lt;/p&gt;

&lt;p&gt;Can a general-purpose LLM do this? Not really — because it does not know real-time flight prices or hotel availability. Those are exactly the gaps that MCP fills. But the pity is RollingGo Flight MCP is not working now, and it needs time to repair. Hotel MCP works well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP Makes Agents Go From "Chatting" to "Doing"
&lt;/h2&gt;

&lt;p&gt;At this point you might ask: I understand the principle, but why does it have to be MCP specifically?&lt;/p&gt;

&lt;p&gt;My take: the LLM is a brain. It is good at reasoning and decision-making, but it does not know what is happening in the world right now. MCP gives that brain &lt;strong&gt;eyes&lt;/strong&gt; and &lt;strong&gt;hands&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eyes&lt;/strong&gt; — RollingGo Hotel MCP real-time visibility into 2M+ hotels globally, with actual selling prices and availability status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands&lt;/strong&gt; — the ability to execute search, filter, compare, and lock actions directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without MCP, the agent is a daydreamer — beautiful plans, zero execution. With MCP, it becomes an operator that knows the current state, understands the request, produces a plan, and acts on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Configuration was not entirely smooth. A few things tripped me up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gotcha 1: MCP tools do not appear after configuration.&lt;/strong&gt; I spent way too long debugging before realizing the client simply needed a restart. After restarting, the tool list refreshed and everything showed up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gotcha 2: 401 Unauthorized.&lt;/strong&gt; There was an extra space after "Bearer" in the authorization header. The correct format is &lt;code&gt;Bearer mcp_xxx&lt;/code&gt; — no spaces between "Bearer" and the key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gotcha 3: Search returns empty.&lt;/strong&gt; Most likely the dates were set in the past. The MCP validates strictly — date parameters must be future dates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Use This?
&lt;/h2&gt;

&lt;p&gt;Honestly, not everyone needs it. This combination is a good fit if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building a travel-direction agent and need a real data source&lt;/li&gt;
&lt;li&gt;You want AI to directly help users complete flight/hotel queries and recommendations, not just give suggestions&lt;/li&gt;
&lt;li&gt;You are a technical team — the integration barrier is low, API keys are self-service, no commercial onboarding needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agent only needs general knowledge Q&amp;amp;A without real-time data, MCP will not add much value for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;After a few months of testing, my biggest takeaway is that MCP opens a new possibility for agent development — moving beyond "question answering" toward agents that genuinely &lt;strong&gt;do things&lt;/strong&gt;. RollingGo Hotel MCP with 200M+ hotels and 500+ suppliers, the inventory is real and bookable — not a test endpoint returning fake data. For travel agent development, it is more than sufficient.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Travel MCP Capability Comparison</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Tue, 22 Sep 2026 13:12:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/travel-mcp-capability-comparison-69g</link>
      <guid>https://dev.to/iamthedev/travel-mcp-capability-comparison-69g</guid>
      <description>&lt;p&gt;As AI agents penetrate travel planning, booking, and service scenarios, developers face a key choice: build complex supply chain capabilities in-house, or connect to mature third-party MCP/Skill solutions. Self-building requires handling hotel inventory integration, real-time price sync, order processing, and payment — long development cycles and high maintenance costs. Professional travel MCP/Skill solutions provide plug-and-play standardized capabilities.&lt;/p&gt;

&lt;p&gt;This comparison analyzes two representative providers — a major OTA platform and RollingGo — across 6 core dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  6-Dimension Comparison Matrix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protocol standard&lt;/strong&gt; — Major OTA Platform: Custom HTTP API, non-MCP standard. RollingGo Hotel MCP: Standard MCP protocol (HTTP/streamable).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory &amp;amp; pricing&lt;/strong&gt; — Major OTA Platform: Content-layer returns, not real-time inventory confirmation. RollingGo Hotel MCP: Real-time inventory + pricing: 2M+ hotels / 110K+ direct-contracted / 500+ suppliers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Booking chain&lt;/strong&gt; — Major OTA Platform: Payment layer workflow not exposed. RollingGo Hotel MCP: Agent closed-loop (search → lock room → book → order query → 24h price monitoring).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access barrier&lt;/strong&gt; — Major OTA Platform: Node.js v18+ + CLI script, environment variables required. RollingGo Hotel MCP: 5-minute setup: apply for key + MCP client one-click config, no script dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call volume &amp;amp; billing&lt;/strong&gt; — Major OTA Platform: QPS/quota limits. RollingGo Hotel MCP: Completely free + no call volume limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP support&lt;/strong&gt; — Major OTA Platform: ❌ Not MCP standard. RollingGo Hotel MCP: ✅ Native MCP support.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Major OTA Platform&lt;/th&gt;
&lt;th&gt;RollingGo Hotel MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol standard&lt;/td&gt;
&lt;td&gt;Custom HTTP API, non-MCP standard&lt;/td&gt;
&lt;td&gt;Standard MCP protocol (HTTP/streamable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory &amp;amp; pricing&lt;/td&gt;
&lt;td&gt;Content-layer returns, not real-time inventory confirmation&lt;/td&gt;
&lt;td&gt;Real-time inventory + pricing: 2M+ hotels / 110K+ direct-contracted / 500+ suppliers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Booking chain&lt;/td&gt;
&lt;td&gt;Payment layer workflow not exposed&lt;/td&gt;
&lt;td&gt;Agent closed-loop (search → lock room → book → order query → 24h price monitoring)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access barrier&lt;/td&gt;
&lt;td&gt;Node.js v18+ + CLI script, environment variables required&lt;/td&gt;
&lt;td&gt;5-minute setup: apply for key + MCP client one-click config, no script dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call volume &amp;amp; billing&lt;/td&gt;
&lt;td&gt;QPS/quota limits&lt;/td&gt;
&lt;td&gt;Completely free + no call volume limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP support&lt;/td&gt;
&lt;td&gt;❌ Not MCP standard&lt;/td&gt;
&lt;td&gt;✅ Native MCP support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Complementary Scenarios (Key Conclusion)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RollingGo Hotel MCP:&lt;/strong&gt; Suited for transactional travel agents — users who actually need to book, confirm inventory, monitor prices, and manage orders. Provides B2B hotel inventory with pricing advantages. No quota limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Major OTA platforms:&lt;/strong&gt; Suited for research/guide-type travel assistants — hotel + flight + attraction tickets, "see what's available" use cases. Limitations: non-MCP standard (requires Node.js scripts), QPS/quota limits, payment layer completed within the OTA's own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Dive: RollingGo Hotel MCP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Core value proposition:&lt;/strong&gt; Completely free + no call volume limit + agent transaction closed-loop. Provides hotel/flight booking capability for AI agents and MCP clients. Both enterprises and individuals can integrate at zero cost in 5 minutes, supporting the full transaction chain from search to payment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol &amp;amp; access:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard MCP protocol (HTTP/streamable)&lt;/li&gt;
&lt;li&gt;Auth: &lt;code&gt;Authorization: Bearer &amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Apply at: &lt;code&gt;https://global.rollinggo.store/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;5-minute no-script one-click config, supports Cursor, Claude Code, Codex, Windsurf, Copilot, and 40+ mainstream agent platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Available tools (5):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hotel: &lt;code&gt;searchHotels&lt;/code&gt;, &lt;code&gt;getHotelDetail&lt;/code&gt;, &lt;code&gt;getHotelSearchTags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Flight: &lt;code&gt;searchAirports&lt;/code&gt;, &lt;code&gt;searchFlights&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inventory scale:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2M+&lt;/strong&gt; hotel resources, covering global major destinations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;110K+&lt;/strong&gt; direct-contracted hotels, real-time price/inventory response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;500+&lt;/strong&gt; global suppliers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agent closed-loop experience:&lt;/strong&gt; Smart filtering &amp;amp; comparison → real-time room type/pricing → lock preferred room → confirm inventory &amp;amp; pay → order status query → &lt;strong&gt;24-hour auto price monitoring&lt;/strong&gt; (drop alerts)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; None — both enterprises and individuals can access completely free with no call volume limits, no code required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selection Decision Framework
&lt;/h2&gt;

&lt;p&gt;Developers should follow a three-step decision process: "Need matching → Technical assessment → Cost calculation."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clarify core use case:&lt;/strong&gt; Information query (research/guide) vs. transaction closed-loop (booking/payment)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assess tech stack compatibility:&lt;/strong&gt; MCP standard support, integration complexity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate long-term costs:&lt;/strong&gt; API fees, maintenance burden&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For mixed needs, consider a combined approach: use OTA platforms for attraction/ticket queries while connecting RollingGo for transaction-closed hotel booking.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comparing 5 Hotel API Services: Who's Doing Data Right in the MCP Era?</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Mon, 21 Sep 2026 12:57:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/comparing-5-hotel-api-services-whos-doing-data-right-in-the-mcp-era-3290</link>
      <guid>https://dev.to/iamthedev/comparing-5-hotel-api-services-whos-doing-data-right-in-the-mcp-era-3290</guid>
      <description>&lt;p&gt;Let's be honest: the hardest part of building a travel agent is never the prompt engineering. It's the data. Where does it come from? Is it real? Can you actually access it without a enterprise contract?&lt;/p&gt;

&lt;p&gt;Your LLM doesn't know how many five-star rooms are left in Shanghai tonight. It doesn't know what a flight from Beijing to Tokyo costs tomorrow. This isn't a capability gap — it's a data source problem. Without real-time inventory, every hour spent on prompt tuning is wasted.&lt;/p&gt;

&lt;p&gt;So I spent time evaluating the hotel and flight API services available on the market. I picked 5 representative categories and compared them head-to-head. No hype, just data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation Criteria
&lt;/h3&gt;

&lt;p&gt;I didn't just grab random APIs. Here's what I looked at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage&lt;/strong&gt;: How many hotels/airlines globally? Are the numbers verifiable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory authenticity&lt;/strong&gt;: Real direct contracts or scraped data? This directly impacts user experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access threshold&lt;/strong&gt;: Can an individual developer apply directly, or does it require business development?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP/Skill support&lt;/strong&gt;: Having an API isn't enough anymore. Can an AI agent call it natively?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;RollingGo Hotel MCP&lt;/th&gt;
&lt;th&gt;OTA APIs&lt;/th&gt;
&lt;th&gt;Data Aggregators&lt;/th&gt;
&lt;th&gt;Open-Source Hotel Projects&lt;/th&gt;
&lt;th&gt;Traditional GDS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hotel coverage&lt;/td&gt;
&lt;td&gt;2M+&lt;/td&gt;
&lt;td&gt;1M+&lt;/td&gt;
&lt;td&gt;500K+&lt;/td&gt;
&lt;td&gt;Depends on self-integration&lt;/td&gt;
&lt;td&gt;100K+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct-contracted hotels&lt;/td&gt;
&lt;td&gt;110K+&lt;/td&gt;
&lt;td&gt;Not disclosed&lt;/td&gt;
&lt;td&gt;Not disclosed&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flight coverage&lt;/td&gt;
&lt;td&gt;500+ airlines, 200+ countries&lt;/td&gt;
&lt;td&gt;Major airlines&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Depends on API&lt;/td&gt;
&lt;td&gt;Full but expensive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP support&lt;/td&gt;
&lt;td&gt;Yes (Hotel + Flight MCP)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (single MCP)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual developer access&lt;/td&gt;
&lt;td&gt;Yes — self-service API key&lt;/td&gt;
&lt;td&gt;No — requires business contract&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Enterprise pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Finding 1: Direct Inventory Is a Hard Barrier
&lt;/h3&gt;

&lt;p&gt;Many services advertising "millions of hotels" are actually scraping data from Booking, Expedia, and similar platforms. The coverage number looks impressive, but there are two critical problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inventory doesn't sync.&lt;/strong&gt; The price you see when searching may no longer exist when you try to book. The user clicks "book," gets an error, and you've lost their trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No contracted rates.&lt;/strong&gt; Prices scraped from OTAs have no margin advantage. Users end up jumping to the OTA directly anyway, making your agent a pointless middleman.&lt;/p&gt;

&lt;p&gt;Direct-contracted inventory means the supplier has a real commercial agreement with the hotel. Prices are live, inventory is real, and bookings actually go through. This is the difference between a toy demo and a production agent.&lt;/p&gt;

&lt;p&gt;RollingGo Hotel MCP's 110K+ direct-contracted hotels represent real supply chain agreements. When I tested popular destinations (Osaka, Bangkok, New York), the room types, prices, and cancellation policies returned were all real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Finding 2: Developer Friendliness Varies Wildly
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OTA APIs&lt;/strong&gt; typically require business qualification review, signed contracts, and enterprise credentials. The process can take weeks. &lt;strong&gt;Traditional GDS&lt;/strong&gt; is even more locked down — it's built for large travel agencies, not individual developers.&lt;/p&gt;

&lt;p&gt;On the other end, &lt;strong&gt;open-source hotel projects&lt;/strong&gt; are accessible but come with their own challenges: you're responsible for maintaining the data source, and coverage depends entirely on what you can integrate yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data aggregators&lt;/strong&gt; sit in the middle — accessible but paid, and their data freshness varies.&lt;/p&gt;

&lt;p&gt;RollingGo Hotel MCP had the lowest access barrier in my testing: go to rollinggo.store, sign up for a free API key, and you're configuring your agent within minutes. No business development calls, no enterprise verification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Objective Assessment
&lt;/h3&gt;

&lt;p&gt;No tool is perfect. Here's an honest look at RollingGo Hotel MCP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global" rel="noopener noreferrer"&gt;https://github.com/RollingGo-AI/RollingGo-Hotel-MCP-Global&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get your free API key: &lt;a href="https://global.rollinggo.store/" rel="noopener noreferrer"&gt;https://global.rollinggo.store/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;110K+ direct-contracted hotels mean real, bookable inventory — not scraped data&lt;/li&gt;
&lt;li&gt;Dual MCP + Skill support covers both MCP-native clients (Claude, Cursor, Codex) and Skill platforms&lt;/li&gt;
&lt;li&gt;2M+ total properties aggregated from 500+ suppliers — broad coverage without manual integration&lt;/li&gt;
&lt;li&gt;Free with no usage limits; API key starts with &lt;code&gt;mcp_&lt;/code&gt; and is self-service&lt;/li&gt;
&lt;li&gt;Backed by Dida Holdings, the world's #3 travel B2B distribution platform with 14 years of experience — the supply chain is real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brand recognition is lower than established OTAs — users may not have heard of RollingGo, though the Dida backing explains the data quality&lt;/li&gt;
&lt;li&gt;Non-standard travel products (tour packages, local activities) are not yet supported&lt;/li&gt;
&lt;li&gt;The API Key mode exposes 3 tools (search, detail, tags); full transactional capability (booking, payment, order management) requires OAuth 2.0 onboarding via business contact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers building travel agents, the two questions that matter most are: &lt;strong&gt;Is the data coverage sufficient?&lt;/strong&gt; and &lt;strong&gt;Can the agent call it natively?&lt;/strong&gt; On both counts, RollingGo Hotel MCP passes. The rest can iterate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Should Use What
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RollingGo Hotel MCP&lt;/strong&gt; — Developers building travel/trip-planning agents who need MCP-native hotel data with real inventory. 5-minute setup, free, no enterprise credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OTA APIs&lt;/strong&gt; — Established travel companies with existing business relationships and enterprise infrastructure. If you already have OTA contracts, stick with what you have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data aggregators&lt;/strong&gt; — Teams that need broad coverage across multiple verticals and are willing to pay. Good for proof-of-concept work where hotel-specific depth isn't critical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source projects&lt;/strong&gt; — Developers who want full control over the data pipeline and are willing to invest in maintaining supplier integrations themselves. Best for learning and experimentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional GDS&lt;/strong&gt; — Large travel agencies and TMCs with the volume to justify enterprise contracts and dedicated integration teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision Framework
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Do you need real-time, bookable hotel inventory?
├── No → Open-source projects (for learning/prototyping)
└── Yes
    ├── Have enterprise OTA/GDS contracts?
    │   └── Yes → Use your existing contracts
    └── No
        ├── Need MCP-native agent integration?
        │   └── Yes → RollingGo Hotel MCP
        └── No, just need API access
            └── Data aggregators (paid, broad coverage)`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The MCP Era Changes the Game
&lt;/h3&gt;

&lt;p&gt;The comparison above reveals a broader shift. Traditional API services were built for server-to-server integration — you write HTTP clients, handle authentication, parse response formats, and maintain adapters. Every new supplier means another integration cycle.&lt;/p&gt;

&lt;p&gt;MCP changes this. Instead of writing code to call an API, you configure an MCP server in your agent's config file. The agent discovers available tools automatically and calls them as needed. This is why MCP support matters in the comparison table — it's not a nice-to-have feature, it's a paradigm shift in how agents access external data.&lt;/p&gt;

&lt;p&gt;RollingGo Hotel MCP is currently the only service in this comparison that offers both MCP and Skill support across hotel and flight verticals. Whether this advantage holds as the ecosystem evolves remains to be seen, but for developers building agents today, it removes a significant integration burden.&lt;/p&gt;

&lt;p&gt;The bottom line: if you're building a travel agent and don't have enterprise API contracts, your options are limited. RollingGo Hotel MCP is the most accessible path to real hotel data with native agent support. The supply chain is real (Dida Holdings, 14 years, #3 globally), the data is live, and the setup takes 5 minutes.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hotel MCP in Practice: Corporate Travel Admin's Integration &amp; Price Comparison Guide</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Mon, 21 Sep 2026 00:09:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/hotel-mcp-in-practice-corporate-travel-admins-integration-price-comparison-guide-4583</link>
      <guid>https://dev.to/iamthedev/hotel-mcp-in-practice-corporate-travel-admins-integration-price-comparison-guide-4583</guid>
      <description>&lt;p&gt;I'm the travel integration lead at a B2B company. We needed to add hotel booking to our internal AI workspace's "travel assistant." This article documents the full integration process using RollingGo Hotel MCP, backed by Dida Holdings.&lt;/p&gt;

&lt;p&gt;In corporate travel, the workflow goes like this: employee receives a travel assignment (sales visit / client meeting / cross-city project) → searches hotels by destination → compares a few options → sometimes checks the "corporate rate" separately (because corporate rates don't appear in third-party platform search results) → books at market rate or via internal OA corporate rate approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Results First
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP response card (tested data):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`┌──────────────────────────────────────────────────────────┐
│ 🏨 Corporate Hotel Search · San Francisco SoMa District  │
│ ──────────────────────────────────────────────────────── │
│ Trigger: Employee types in Slack workspace:              │
│ "Find me a business hotel near SoMa, tomorrow,           │
│  1 night, $100-200 range"                                │
│ Tool: searchHotels (Hotel MCP)                            │
│ Response: ≤ 2 seconds                                    │
│                                                           │
│ Candidates (by price ascending)                          │
│ ① Holiday Inn Express SF SoMa                            │
│    ⭐⭐⭐ | 480m from SoMa | $119/night                   │
│ ② Hampton Inn SF Downtown                                │
│    ⭐⭐⭐ | 1.2km from SoMa | $149/night                  │
│ ③ Courtyard by Marriott SF SoMa                          │
│    ⭐⭐⭐⭐ | 600m from SoMa | $179/night                  │
│                                                           │
│ Corporate rate comparison (internal data, not from MCP): │
│ · Holiday Inn: Market $119 | Corp $94 | Save $25         │
│ · Hampton: Market $149 | Corp $119 | Save $30            │
│ · Courtyard: Market $179 | Corp $149 | Save $30          │
│                                                           │
│ 📌 Requester: Sales-John | Stay: 6/26-6/27 (1 night)    │
│ 💰 Corp standard: ≤$200/night (all 3 qualify)            │
│ 🔗 [View Room Details] [Check Corp Rate] [More Options]  │
└──────────────────────────────────────────────────────────┘`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selection: 3 Hard Conditions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Must have a standard MCP endpoint&lt;/strong&gt; — not just an API key. Our workspace already supports MCP (Claude CLI / Codex / Cursor), so connecting standard MCP saves 70% of integration code vs. HTTP API calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Must cover global hotels&lt;/strong&gt; — not just domestic. We handle 5–8 international bookings/month (client receptions, overseas trade shows).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Must have structured room type / cancellation policy fields&lt;/strong&gt; — not just "available/unavailable." Corporate rate comparison requires knowing room type, breakfast, and cancellation policy to match reimbursement rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RollingGo Hotel MCP was the solution that satisfied all three, with two additional corporate-friendly capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP endpoint standardization + multi-client support (copy-paste config for Claude CLI / Cursor / Codex)&lt;/li&gt;
&lt;li&gt;Real hotel data + global coverage (tested: distances and market prices match what employees see on booking platforms)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Interface Capabilities
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;searchHotels&lt;/strong&gt; — Search by location, star rating, budget, tags. Key parameters: &lt;code&gt;originQuery&lt;/code&gt; (raw natural language), &lt;code&gt;place&lt;/code&gt;, &lt;code&gt;placeType&lt;/code&gt;, &lt;code&gt;checkInParam&lt;/code&gt; (date, nights, adults), &lt;code&gt;filterOptions&lt;/code&gt; (distance, star ratings), &lt;code&gt;hotelTags&lt;/code&gt; (preferred/required/excluded tags, brands, max price).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;getHotelDetail&lt;/strong&gt; — Real-time room types and prices. Returns room name, total price, cancellation policies, breakfast. The &lt;code&gt;totalPrice: 0&lt;/code&gt; doesn't mean "free" — it means "price needs further inquiry."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;getHotelSearchTags&lt;/strong&gt; — Tag dictionary. Tags are case-sensitive and must match exactly what this tool returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment: 5 Steps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Register at global.rollinggo.store — 1–3 minutes auto-approval, no enterprise credentials needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Get API key (format: &lt;code&gt;mcp_xxxxx...&lt;/code&gt;). Save securely — shown only once.&lt;br&gt;
Get your free API key: &lt;a href="https://global.rollinggo.store/" rel="noopener noreferrer"&gt;https://global.rollinggo.store/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 3:&lt;/strong&gt; Configure MCP client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;`//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Claude&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;CLI:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;.mcp.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RollingGo-Hotel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.rollinggo.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"streamable-http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Restart client. Verify tools appear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Test: "Find me a hotel near San Francisco SoMa, tomorrow night, $100-200 range, 3-star business hotel."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cURL test&lt;/strong&gt; — must include Accept header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="sb"&gt;`&lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://mcp.rollinggo.ai/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json, text/event-stream"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"tools/call","params":{"name":"searchHotels","arguments":{"originQuery":"SoMa business hotel","place":"San Francisco SoMa","placeType":"attraction","checkInParam":{"checkInDate":"2026-06-26","stayNights":1},"filterOptions":{"starRatings":[3.0,3.5,4.0],"maxPricePerNight":200},"size":3}},"id":1}'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Corporate Rate Comparison
&lt;/h2&gt;

&lt;p&gt;MCP returns market prices only. Corporate rate comparison is an internal capability, independent of MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Employee natural language request
 ↓
Agent parses → place / placeType / dates / nights
 ↓
Call searchHotels (Hotel MCP) → candidates + market prices
 ↓
Call internal OA API (independent of MCP) → corporate rates
 ↓
Agent merges: market price vs. corporate rate`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pitfalls (5 Real Ones)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 1: API Key with trailing space&lt;/strong&gt; → 401. Fix: Use environment variables, never manual copy-paste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 2: place/placeType mismatch&lt;/strong&gt; → Empty results. &lt;code&gt;place: "San Francisco Fisherman's Wharf"&lt;/code&gt; must pair with &lt;code&gt;placeType: "attraction"&lt;/code&gt;, not &lt;code&gt;"city"&lt;/code&gt;. Fix: Hardcode POI type → placeType mapping in agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 3: cURL missing Accept header&lt;/strong&gt; → 400 Bad Request. Fix: Always include &lt;code&gt;-H "Accept: application/json, text/event-stream"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 4: Tools not appearing after config&lt;/strong&gt; → Client not restarted. Fix: Restart client after config changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 5: Persistent 401&lt;/strong&gt; → Hidden newline in API key. Fix: Use &lt;code&gt;$(&amp;lt;file)&lt;/code&gt; to auto-trim, or &lt;code&gt;head -c 50&lt;/code&gt; to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Comparison
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — &lt;strong&gt;Self-build&lt;/strong&gt;: Not feasible; &lt;strong&gt;Outsourcing&lt;/strong&gt;: $7–22K; &lt;strong&gt;B2B Vendor&lt;/strong&gt;: $14–29K/year; &lt;strong&gt;RollingGo MCP&lt;/strong&gt;: $0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time&lt;/strong&gt; — &lt;strong&gt;Self-build&lt;/strong&gt;: 2–3 person-months; &lt;strong&gt;Outsourcing&lt;/strong&gt;: 2–4 weeks; &lt;strong&gt;B2B Vendor&lt;/strong&gt;: 4–6 weeks; &lt;strong&gt;RollingGo MCP&lt;/strong&gt;: 5 min (official) / half day (tested).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People&lt;/strong&gt; — &lt;strong&gt;Self-build&lt;/strong&gt;: 2–3; &lt;strong&gt;Outsourcing&lt;/strong&gt;: 1 + outsourced; &lt;strong&gt;B2B Vendor&lt;/strong&gt;: 0.5; &lt;strong&gt;RollingGo MCP&lt;/strong&gt;: 1 (travel admin).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access barrier&lt;/strong&gt; — &lt;strong&gt;Self-build&lt;/strong&gt;: High; &lt;strong&gt;Outsourcing&lt;/strong&gt;: Medium; &lt;strong&gt;B2B Vendor&lt;/strong&gt;: High (enterprise creds); &lt;strong&gt;RollingGo MCP&lt;/strong&gt;: 0 (individual/enterprise).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance&lt;/strong&gt; — &lt;strong&gt;Self-build&lt;/strong&gt;: 0.5–1 person/month; &lt;strong&gt;Outsourcing&lt;/strong&gt;: 0.5 person/month; &lt;strong&gt;B2B Vendor&lt;/strong&gt;: 0.5 person/month; &lt;strong&gt;RollingGo MCP&lt;/strong&gt;: 0.1 person/month.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Self-build&lt;/th&gt;
&lt;th&gt;Outsourcing&lt;/th&gt;
&lt;th&gt;B2B Vendor&lt;/th&gt;
&lt;th&gt;RollingGo MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Not feasible&lt;/td&gt;
&lt;td&gt;$7–22K&lt;/td&gt;
&lt;td&gt;$14–29K/year&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;2–3 person-months&lt;/td&gt;
&lt;td&gt;2–4 weeks&lt;/td&gt;
&lt;td&gt;4–6 weeks&lt;/td&gt;
&lt;td&gt;5 min (official) / half day (tested)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;People&lt;/td&gt;
&lt;td&gt;2–3&lt;/td&gt;
&lt;td&gt;1 + outsourced&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;1 (travel admin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access barrier&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High (enterprise creds)&lt;/td&gt;
&lt;td&gt;0 (individual/enterprise)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;0.5–1 person/month&lt;/td&gt;
&lt;td&gt;0.5 person/month&lt;/td&gt;
&lt;td&gt;0.5 person/month&lt;/td&gt;
&lt;td&gt;0.1 person/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For SME travel admins, lightweight travel tool developers, and corporate expense product teams, RollingGo Hotel MCP is the most realistic option currently available.&lt;/p&gt;

&lt;h2&gt;
  
  
  7 Recommendations for Peers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;List hard conditions first, then features&lt;/strong&gt; — 80% of solutions get filtered by non-negotiable requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gray-test with small traffic&lt;/strong&gt; — Run 5 employees' travel bookings for 1–2 weeks before production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map placeType strictly&lt;/strong&gt; — Don't let the agent guess; hardcode POI type → placeType mapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate rate is a separate module&lt;/strong&gt; — Don't expect MCP to return corporate rates; build it as an independent microservice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get tags from getHotelSearchTags&lt;/strong&gt; — Never guess tag strings; they're case-sensitive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always add Accept header in cURL&lt;/strong&gt; — This is the #1 cURL error, not an MCP bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store hotelId in your order DB&lt;/strong&gt; — It's a stable identifier; use it for corporate rate lookups instead of fuzzy name matching.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Hotel Data vs E-commerce Data: Why They're Nothing Alike</title>
      <dc:creator>iamTheDev</dc:creator>
      <pubDate>Sun, 20 Sep 2026 13:01:00 +0000</pubDate>
      <link>https://dev.to/iamthedev/hotel-data-vs-e-commerce-data-why-theyre-nothing-alike-44hk</link>
      <guid>https://dev.to/iamthedev/hotel-data-vs-e-commerce-data-why-theyre-nothing-alike-44hk</guid>
      <description>&lt;p&gt;If you've ever built an e-commerce data pipeline and assumed hotel data would follow the same patterns — you're in for a rough ride. I learned this the hard way. E-commerce and hotel data differ at the most fundamental level: how inventory is modeled, how prices move, and what it takes to go from "search" to "booked." These aren't edge cases. They're structural.&lt;/p&gt;

&lt;p&gt;This matters doubly for AI agents. An LLM can recommend hotels all day, but the moment it returns stale prices or phantom inventory, user trust evaporates. Understanding why hotel data is different is the prerequisite to building a travel agent that actually works.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Inventory: One-Dimensional vs Three-Dimensional
&lt;/h3&gt;

&lt;p&gt;E-commerce inventory is &lt;strong&gt;1D&lt;/strong&gt;: a SKU has 100 units, you sell one, it becomes 99, you restock, it goes back to 100. The relationship between product and quantity is linear and persistent.&lt;/p&gt;

&lt;p&gt;Hotel inventory is &lt;strong&gt;3D&lt;/strong&gt;: date × room type × length of stay. When a user searches for check-in July 20, check-out July 22, the system must return hotels where &lt;strong&gt;both July 20 and July 21 have availability&lt;/strong&gt;. If July 20 has rooms but July 21 is sold out, that hotel should not appear in results at all.&lt;/p&gt;

&lt;p&gt;The five dimensions where they diverge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt; — E-commerce: 1D (SKU → quantity). Hotel: 3D (date × room type × nights).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change frequency&lt;/strong&gt; — E-commerce: daily. Hotel: per-minute (bookings and cancellations happen constantly).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validity&lt;/strong&gt; — E-commerce: indefinite (until sold out). Hotel: expires by date (overnight = stale).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching strategy&lt;/strong&gt; — E-commerce: cache T+1 is fine. Hotel: T+1 = wrong data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency control&lt;/strong&gt; — E-commerce: simple decrement. Hotel: requires a lock-room mechanism (15–120 min temporary hold).&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;E-commerce&lt;/th&gt;
&lt;th&gt;Hotel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;1D (SKU → quantity)&lt;/td&gt;
&lt;td&gt;3D (date × room type × nights)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change frequency&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;td&gt;Per-minute (bookings/cancellations happen constantly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validity&lt;/td&gt;
&lt;td&gt;Indefinite (until sold out)&lt;/td&gt;
&lt;td&gt;Expires by date (overnight = stale)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching strategy&lt;/td&gt;
&lt;td&gt;Cache T+1 is fine&lt;/td&gt;
&lt;td&gt;T+1 = wrong data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency control&lt;/td&gt;
&lt;td&gt;Simple decrement&lt;/td&gt;
&lt;td&gt;Requires lock-room mechanism (15–120 min temporary hold)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This means any caching strategy that works for e-commerce breaks in travel. Cache a price from an hour ago? The user sees outdated data. Cache inventory counts? Another user may have just booked that room. For a travel agent, returning stale data is worse than returning no data — users make decisions on it, then arrive at the hotel to find no room.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pricing: List + Discount vs Dynamic Engine
&lt;/h3&gt;

&lt;p&gt;E-commerce pricing is a two-layer structure: list price plus occasional promotions. A SKU has one price, sometimes discounted. Price changes happen at daily or weekly cadence.&lt;/p&gt;

&lt;p&gt;Hotel pricing is driven by a &lt;strong&gt;Revenue Management System (RMS)&lt;/strong&gt; that adjusts in real time based on 6+ factors. The same hotel, same room type, can have different prices in the morning vs afternoon, weekdays vs weekends, holidays vs off-season.&lt;/p&gt;

&lt;p&gt;The observed swings and what they demand from your engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekday vs weekend&lt;/strong&gt; — +15%–40% on weekends. The agent must query in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holiday vs regular&lt;/strong&gt; — +50%–200% on holidays. Search results need query timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advance booking vs same-day&lt;/strong&gt; — advance 7+ days is usually cheaper. The agent should support multi-date comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-sellout vs post-sellout&lt;/strong&gt; — prices may drop to clear inventory. Price monitoring needs minute-level granularity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different supplier channels&lt;/strong&gt; — a 5%–20% price gap for the same hotel. The agent needs multi-channel comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same-day vs next-day check-in&lt;/strong&gt; — same-day is usually more expensive. You must distinguish check-in date scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pricing Factor&lt;/th&gt;
&lt;th&gt;Observed Swing&lt;/th&gt;
&lt;th&gt;Impact on Development&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weekday vs weekend&lt;/td&gt;
&lt;td&gt;+15%–40% on weekends&lt;/td&gt;
&lt;td&gt;Agent must query in real time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holiday vs regular&lt;/td&gt;
&lt;td&gt;+50%–200% on holidays&lt;/td&gt;
&lt;td&gt;Search results need query timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advance booking vs same-day&lt;/td&gt;
&lt;td&gt;Advance 7+ days usually cheaper&lt;/td&gt;
&lt;td&gt;Agent should support multi-date comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-sellout vs post-sellout&lt;/td&gt;
&lt;td&gt;May drop price to clear inventory&lt;/td&gt;
&lt;td&gt;Price monitoring needs minute-level granularity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different supplier channels&lt;/td&gt;
&lt;td&gt;5%–20% price gap for same hotel&lt;/td&gt;
&lt;td&gt;Agent needs multi-channel comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same-day vs next-day check-in&lt;/td&gt;
&lt;td&gt;Same-day usually more expensive&lt;/td&gt;
&lt;td&gt;Must distinguish check-in date scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your agent connects to a caching API, the price users see might be a day old. In the hotel industry, yesterday's price has zero reference value.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The 3D Availability Matrix in Practice
&lt;/h3&gt;

&lt;p&gt;The 3D nature of hotel inventory creates a specific engineering problem: &lt;strong&gt;date intersection validation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Many APIs return a hotel if the check-in date has availability, regardless of whether subsequent nights do. This leads to a broken user experience: the agent returns a hotel list, the user picks one, enters the booking flow, and only then discovers the second night is sold out. The entire interaction chain breaks at the last step.&lt;/p&gt;

&lt;p&gt;The correct approach is validating date intersection at query time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_room_availability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hotel_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_out&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Validate that every night in the stay range has availability.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;required_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_date_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;available_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;room_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hotel_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;room_types&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;daily_inventory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;room_type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inventory&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;daily_inventory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;available_count&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;available_dates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;daily_inventory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;missing_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;required_dates&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;available_dates&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;missing_dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No availability on: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;missing_dates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Availability validated&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Inventory Decay
&lt;/h4&gt;

&lt;p&gt;Hotel inventory changes in real time. You query at 12:00, by 12:05 it may have shifted — someone booked a room (inventory -1), someone cancelled (inventory +1). This creates a hard constraint: &lt;strong&gt;the window between query and booking must be as short as possible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How fast results go stale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0–5 min&lt;/strong&gt; — ~3% chance of inventory change. Negligible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5–15 min&lt;/strong&gt; — ~8%. Needs re-validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15–30 min&lt;/strong&gt; — ~15%. Must re-query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30–60 min&lt;/strong&gt; — ~25%. Previous results are effectively invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query Interval&lt;/th&gt;
&lt;th&gt;Inventory Change Probability&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–5 min&lt;/td&gt;
&lt;td&gt;~3%&lt;/td&gt;
&lt;td&gt;Negligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–15 min&lt;/td&gt;
&lt;td&gt;~8%&lt;/td&gt;
&lt;td&gt;Needs re-validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15–30 min&lt;/td&gt;
&lt;td&gt;~15%&lt;/td&gt;
&lt;td&gt;Must re-query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30–60 min&lt;/td&gt;
&lt;td&gt;~25%&lt;/td&gt;
&lt;td&gt;Previous results effectively invalid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is why &lt;strong&gt;lock-room&lt;/strong&gt; matters: temporarily hold a room for 15–120 minutes to give users a decision window. Not all APIs offer this. An agent that can search but can't lock provides an experience worse than not searching at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Multi-Supplier Aggregation: Field Mapping Hell
&lt;/h3&gt;

&lt;p&gt;The hotel data supply chain is deeply fragmented. Hundreds of suppliers exist globally — B2B wholesalers, DMCs, GDS, direct contracts — each with different API formats, field names, and response structures.&lt;/p&gt;

&lt;p&gt;If you want broad coverage, you need to integrate multiple suppliers. But each integration brings a new set of differences. Here's the same information expressed by three different suppliers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hotel ID&lt;/strong&gt; — Supplier A: &lt;code&gt;hotel_id&lt;/code&gt; (number). Supplier B: &lt;code&gt;property_code&lt;/code&gt; (string). Supplier C: &lt;code&gt;hid&lt;/code&gt; (UUID).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room type naming&lt;/strong&gt; — Supplier A: &lt;code&gt;Standard Room&lt;/code&gt;. Supplier B: &lt;code&gt;Standard Double&lt;/code&gt;. Supplier C: &lt;code&gt;standard double&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price field&lt;/strong&gt; — Supplier A: &lt;code&gt;price&lt;/code&gt; (tax-inclusive). Supplier B: &lt;code&gt;rate&lt;/code&gt; (tax-exclusive). Supplier C: &lt;code&gt;total_amount&lt;/code&gt; (tax + service fee).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Currency&lt;/strong&gt; — Supplier A: &lt;code&gt;CNY&lt;/code&gt;. Supplier B: &lt;code&gt;USD&lt;/code&gt;. Supplier C: local currency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amenities&lt;/strong&gt; — Supplier A: &lt;code&gt;amenities: ["pool"]&lt;/code&gt;. Supplier B: &lt;code&gt;facilities: [{"type":"SWIMMING_POOL"}]&lt;/code&gt;. Supplier C: &lt;code&gt;tags: "with pool"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancellation policy&lt;/strong&gt; — Supplier A: &lt;code&gt;cancellation_policy: "24h"&lt;/code&gt;. Supplier B: &lt;code&gt;cancel_rule: {before_hours: 24}&lt;/code&gt;. Supplier C: &lt;code&gt;refundable: true, deadline: "2026-07-19"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;th&gt;Supplier A&lt;/th&gt;
&lt;th&gt;Supplier B&lt;/th&gt;
&lt;th&gt;Supplier C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hotel ID&lt;/td&gt;
&lt;td&gt;hotel_id (number)&lt;/td&gt;
&lt;td&gt;property_code (string)&lt;/td&gt;
&lt;td&gt;hid (UUID)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Room type naming&lt;/td&gt;
&lt;td&gt;Standard Room&lt;/td&gt;
&lt;td&gt;Standard Double&lt;/td&gt;
&lt;td&gt;standard double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price field&lt;/td&gt;
&lt;td&gt;price (tax-inclusive)&lt;/td&gt;
&lt;td&gt;rate (tax-exclusive)&lt;/td&gt;
&lt;td&gt;total_amount (tax + service fee)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Currency&lt;/td&gt;
&lt;td&gt;CNY&lt;/td&gt;
&lt;td&gt;USD&lt;/td&gt;
&lt;td&gt;Local currency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amenities&lt;/td&gt;
&lt;td&gt;amenities: ["pool"]&lt;/td&gt;
&lt;td&gt;facilities: [{"type":"SWIMMING_POOL"}]&lt;/td&gt;
&lt;td&gt;tags: "with pool"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancellation policy&lt;/td&gt;
&lt;td&gt;cancellation_policy: "24h"&lt;/td&gt;
&lt;td&gt;cancel_rule: {before_hours: 24}&lt;/td&gt;
&lt;td&gt;refundable: true, deadline: "2026-07-19"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is just 3 suppliers. Imagine 10, 50, 100. Each has different field names, data structures, enum values, and tax-inclusive logic. Normalizing them into one internal data structure is an enormous engineering effort.&lt;/p&gt;

&lt;p&gt;Here's a simplified field mapping example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="c1"&gt;# Supplier room type field mapping
&lt;/span&gt;&lt;span class="n"&gt;ROOM_TYPE_MAPPING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# Supplier A naming → normalized type
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Standard Room&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STANDARD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deluxe Room&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DELUXE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Executive Suite&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SUITE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Supplier B naming → normalized type
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Standard Double&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STANDARD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deluxe Double&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DELUXE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Presidential Suite&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SUITE_PRESIDENTIAL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;normalize_room_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;supplier_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Normalize room type names across suppliers.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;normalized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ROOM_TYPE_MAPPING&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;normalized&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;log_unknown_room_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;supplier_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UNKNOWN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;normalized&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks simple. But every new supplier means a new complete set of mapping rules. Ten suppliers = ten naming conventions to maintain.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hotel Matching: The Industry-Level Problem
&lt;/h4&gt;

&lt;p&gt;Even after multi-supplier integration, a deeper question remains: &lt;strong&gt;are the hotels returned by different suppliers actually the same property?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supplier A returns "Hangzhou Xizi Hotel" and Supplier B returns "Hangzhou Xizi Hotel · Four Seasons Wing." These might be the same hotel — or might not. You need &lt;strong&gt;hotel matching&lt;/strong&gt;: entity resolution based on name, address, coordinates, phone number, and more.&lt;/p&gt;

&lt;p&gt;Hotel matching is an industry-level challenge. Companies specialize in providing this as a paid service. For individual developers, it's nearly insurmountable. In my testing, even with just 2 suppliers, string matching accuracy for the same hotel was under 60%. The remaining 40% required manual review or third-party matching services.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The 8-Step Transaction Chain
&lt;/h3&gt;

&lt;p&gt;Hotel booking isn't "search and done." It's a full transaction chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Search → View Room Types → Confirm Price → Verify Inventory
→ Lock Room → Submit Order → Payment → After-sales
  ①        ②              ③              ④
  ⑤        ⑥              ⑦              ⑧`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step depends on the previous step's real-time data. If an agent only has search, when the user says "book this one," it can't proceed. Walk through the chain and what breaking each link costs you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;① Search&lt;/strong&gt; (&lt;code&gt;search-hotels&lt;/code&gt;) — provides candidates. Broken: empty results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;② Detail&lt;/strong&gt; (&lt;code&gt;hotel-detail&lt;/code&gt;) — shows price &amp;amp; room types. Broken: user can't decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;③ Compare&lt;/strong&gt; (multi-channel aggregation) — finds the best price. Broken: user overpays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;④ Inventory&lt;/strong&gt; (real-time validation) — confirms bookable. Broken: phantom inventory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⑤ Lock&lt;/strong&gt; (&lt;code&gt;batch-lock-room&lt;/code&gt;) — gives a decision window. Broken: room taken by others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⑥ Order&lt;/strong&gt; (Booking API) — closes the loop. Broken: the chain ends here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⑦ Payment&lt;/strong&gt; (Payment API) — completes the transaction. Broken: can't transact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⑧ After-sales&lt;/strong&gt; (cancellation/modification API) — post-booking support. Broken: can't handle changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Required Capability&lt;/th&gt;
&lt;th&gt;Agent Value&lt;/th&gt;
&lt;th&gt;Chain Break Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① Search&lt;/td&gt;
&lt;td&gt;search-hotels&lt;/td&gt;
&lt;td&gt;Provide candidates&lt;/td&gt;
&lt;td&gt;Empty results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Detail&lt;/td&gt;
&lt;td&gt;hotel-detail&lt;/td&gt;
&lt;td&gt;Show price &amp;amp; room types&lt;/td&gt;
&lt;td&gt;User can't decide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ Compare&lt;/td&gt;
&lt;td&gt;Multi-channel aggregation&lt;/td&gt;
&lt;td&gt;Find best price&lt;/td&gt;
&lt;td&gt;User overpays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ Inventory&lt;/td&gt;
&lt;td&gt;Real-time validation&lt;/td&gt;
&lt;td&gt;Confirm bookable&lt;/td&gt;
&lt;td&gt;Phantom inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑤ Lock&lt;/td&gt;
&lt;td&gt;batch-lock-room&lt;/td&gt;
&lt;td&gt;Decision window&lt;/td&gt;
&lt;td&gt;Room taken by others&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑥ Order&lt;/td&gt;
&lt;td&gt;Booking API&lt;/td&gt;
&lt;td&gt;Close the loop&lt;/td&gt;
&lt;td&gt;Chain breaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑦ Payment&lt;/td&gt;
&lt;td&gt;Payment API&lt;/td&gt;
&lt;td&gt;Complete transaction&lt;/td&gt;
&lt;td&gt;Can't transact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑧ After-sales&lt;/td&gt;
&lt;td&gt;Cancellation/modification API&lt;/td&gt;
&lt;td&gt;Post-booking support&lt;/td&gt;
&lt;td&gt;Can't handle changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For travel agents, the core value lives in steps 1–5: help users find bookable hotels and advance to room lock. Steps 6–8 typically require B2B payment channels and enterprise credentials. But if any of steps 1–5 are missing, the agent's value drops significantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Agent Prompt Constraints
&lt;/h4&gt;

&lt;p&gt;Your agent's system prompt should explicitly define workflow constraints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent_workflow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hotel_search"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"step_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Call getHotelSearchTags to validate tag names"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"step_2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Call searchHotels for candidate hotels"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"step_3"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Call getHotelDetail for top 3 results"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"step_4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Validate nightly availability across stay range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"step_5"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"If needed, call lock-room to hold inventory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fallback"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"On API failure, respond 'Unable to query real-time data'. Never fabricate hotel names or prices."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical piece is the &lt;code&gt;fallback&lt;/code&gt; rule: &lt;strong&gt;if the API call fails, the agent must tell the user it can't get real-time data — not fabricate hotel names and prices from training data.&lt;/strong&gt; Users acting on fabricated data will find no such room or a completely different price, and trust goes to zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. The Solo Developer's Real Dilemma
&lt;/h3&gt;

&lt;p&gt;Here's what individual developers actually face when building a travel agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Can't get API access&lt;/strong&gt; — OTAs don't open up; suppliers require enterprise credentials. Root cause: commercial barriers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data is cached&lt;/strong&gt; — T+1 data is meaningless for hotel scenarios. Root cause: technical architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search but no lock&lt;/strong&gt; — the search API exists, the lock-room API doesn't. Root cause: supply-chain capability gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room types don't match&lt;/strong&gt; — different suppliers use different naming. Root cause: lack of unified standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High maintenance cost&lt;/strong&gt; — you must adapt when suppliers change their APIs. Root cause: external dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hotel matching&lt;/strong&gt; — can't tell if different suppliers return the same property. Root cause: an industry-level problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pain Point&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Root Cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can't get API access&lt;/td&gt;
&lt;td&gt;OTAs don't open up; suppliers require enterprise credentials&lt;/td&gt;
&lt;td&gt;Commercial barriers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data is cached&lt;/td&gt;
&lt;td&gt;T+1 data is meaningless for hotel scenarios&lt;/td&gt;
&lt;td&gt;Technical architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search but no lock&lt;/td&gt;
&lt;td&gt;Search API exists, lock-room API doesn't&lt;/td&gt;
&lt;td&gt;Supply chain capability gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Room types don't match&lt;/td&gt;
&lt;td&gt;Different suppliers use different naming&lt;/td&gt;
&lt;td&gt;Lack of unified standards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High maintenance cost&lt;/td&gt;
&lt;td&gt;Must adapt when suppliers change their APIs&lt;/td&gt;
&lt;td&gt;External dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No hotel matching&lt;/td&gt;
&lt;td&gt;Can't tell if different suppliers return the same property&lt;/td&gt;
&lt;td&gt;Industry-level problem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These 6 pain points aren't "pick one to solve." They &lt;strong&gt;all&lt;/strong&gt; must be solved to make a travel agent work. Any single gap stalls the entire project.&lt;/p&gt;

&lt;h3&gt;
  
  
  How RollingGo Hotel MCP Addresses This
&lt;/h3&gt;

&lt;p&gt;In my development process, I used &lt;strong&gt;RollingGo Hotel MCP&lt;/strong&gt; as the data access layer. RollingGo is an innovation project incubated. Here's how it maps to the challenges above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time inventory (3D matrix)&lt;/strong&gt; — live rates &amp;amp; bookable inventory, zero-latency price verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-supplier aggregation&lt;/strong&gt; — 500+ suppliers unified into one MCP interface, 2M+ properties across 100+ countries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct-contracted inventory&lt;/strong&gt; — 110K+ directly contracted hotels with real-time price sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock-room capability&lt;/strong&gt; — supported (OAuth 2.0 mode, 7 tools including price confirmation and booking).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access threshold&lt;/strong&gt; — self-service API key at rollinggo.store, no enterprise credentials required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — free tier with permanent call quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link&lt;/strong&gt; — &lt;a href="https://global.rollinggo.store/" rel="noopener noreferrer"&gt;https://global.rollinggo.store/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;RollingGo Hotel MCP Coverage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time inventory (3D matrix)&lt;/td&gt;
&lt;td&gt;Live rates &amp;amp; bookable inventory, zero-latency price verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-supplier aggregation&lt;/td&gt;
&lt;td&gt;500+ suppliers unified into one MCP interface, 2M+ properties across 100+ countries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct-contracted inventory&lt;/td&gt;
&lt;td&gt;110K+ directly contracted hotels with real-time price sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lock-room capability&lt;/td&gt;
&lt;td&gt;Supported (OAuth 2.0 mode, 7 tools including price confirmation and booking)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access threshold&lt;/td&gt;
&lt;td&gt;Self-service API key at rollinggo.store, no enterprise credentials required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free tier with permanent call quota&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link&lt;/td&gt;
&lt;td&gt;&lt;a href="https://global.rollinggo.store/" rel="noopener noreferrer"&gt;https://global.rollinggo.store/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The MCP server exposes 3 core tools (API Key mode): &lt;code&gt;searchHotels&lt;/code&gt;, &lt;code&gt;getHotelDetail&lt;/code&gt;, and &lt;code&gt;getHotelSearchTags&lt;/code&gt; — covering the first 5 steps of the transaction chain. The OAuth 2.0 mode adds price confirmation, booking, and order management for full transactional capability.&lt;/p&gt;

&lt;p&gt;For individual developers, RollingGo Hotel MCP solves 5 of the 6 pain points. The sixth (hotel matching) depends on supply-chain-level capability and isn't an API-layer problem.&lt;/p&gt;

&lt;p&gt;The purpose of this article isn't to promote a specific tool — it's to decompose the inherent complexity of hotel data. Regardless of what tool you use, these challenges are real. Understanding them is the prerequisite to building a travel agent that works.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>architecture</category>
      <category>data</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
