Skip to content
v1.0.3MIT

Book hotels through trip1's MCP server and pay in USDC on Base over x402. 3M+ properties in 200+ countries, with a CoinGate fallback for browser checkout.

trip1 agent skills and MCP server

smithery badge

A plugin that lets agents book hotels on trip1 through the trip1 MCP server: about 3 million properties in 200+ countries, paid in USDC on Base over x402.

  • Endpoint: https://trip1.com/api/mcp (Streamable HTTP)
  • Auth: none, no account, API key or OAuth
  • Docs: https://trip1.com/agents
  • MCP Registry: com.trip1/mcp

Ships one skill, hotel-booking, which activates when the user wants to find, compare, or book a hotel.

What's in the box

  • .claude-plugin/plugin.json — Claude Code / Claude Desktop plugin manifest
  • .mcp.json — wires the trip1 remote MCP server so the plugin is self-contained
  • plugin.json and mcp.json — the same plugin in the Agent Plugins format, for Cursor and other compatible clients
  • skills/hotel-booking/SKILL.md — the skill that orchestrates the full booking flow
  • server.json — the official MCP Registry entry
  • llms-install.md — install instructions for agents such as Cline that set servers up themselves

Install

Claude Code

/plugin marketplace add trivial-corp/agents
/plugin install trip1@trivial-corp/agents

The MCP server and the skill come in together. Restart the session so Claude Code picks up the new MCP connection.

Claude Desktop

Two options.

As a local plugin. Download agents.zip from the latest release, then in Claude Desktop go to Customize → Personal plugins → Upload local plugin and drop the zip in.

As a connector. If you only want the MCP server without the skill, add the connector directly:

{
  "mcpServers": {
    "trip1": {
      "type": "http",
      "url": "https://trip1.com/api/mcp"
    }
  }
}

Cursor, Windsurf, Cline

Add the server to the client's MCP config (~/.cursor/mcp.json for Cursor; MCP Servers → Configure → Remote Servers in Cline):

{
  "mcpServers": {
    "trip1": {
      "type": "streamable-http",
      "url": "https://trip1.com/api/mcp"
    }
  }
}

Cursor also loads this repo as a plugin through plugin.json and mcp.json. Clients that only speak stdio can bridge with npx -y mcp-remote https://trip1.com/api/mcp.

VS Code

code --add-mcp '{"name":"trip1","type":"http","url":"https://trip1.com/api/mcp"}'

Codex CLI, Gemini CLI, any SKILL.md-compatible agent

npx skills add trivial-corp/agents

This installs the skill. Add the MCP server separately via your client's MCP config (same JSON as above).

ChatGPT

Search for trip1 in the ChatGPT apps directory. Or add it as a custom connector in Settings → Connectors → Add, pointing at:

https://trip1.com/api/mcp

The skill doesn't apply here; ChatGPT doesn't load SKILL.md files. The tool descriptions in the MCP server carry enough intent for ChatGPT to drive the flow on its own.

Cowork and other MCP-aware clients

Any client that speaks remote MCP (Streamable HTTP) can add trip1 as a connector. Paste the same mcpServers block above, or the bare URL https://trip1.com/api/mcp if the client accepts URLs directly.

Local development

git clone https://github.com/trivial-corp/agents
cd agents
claude --plugin-dir .

What the skill does

The skill is instructions, not code. It tells the agent:

  • when a hotel-booking intent is present and the skill should activate
  • which trip1 MCP tools to call, in what order, with which arguments
  • how to handle the x402 payment handshake and the CoinGate fallback
  • how to report results and recover from rate drops, payment failures, and polling timeouts

Paying on the agent's behalf

For fully hands-off agent payments, load an x402-capable wallet MCP alongside trip1. The simplest option:

npx @coinbase/payments-mcp

Paying from code with the x402 SDK

@x402/fetch refuses any payment above $1 by default, and a hotel booking always costs more, so raise the cap. Pin the recipient too, so the client only ever pays trip1:

import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";

const TRIP1_PAY_TO = "0x4eD818663D9040461Ee1f6E8f618Df1770dddDc1"; // see https://trip1.com/.well-known/x402.json

const fetchWithPayment = wrapFetchWithPaymentFromConfig(fetch, {
  schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(privateKeyToAccount(process.env.EVM_PRIVATE_KEY)) }],
  spendControls: { maxAmountPerPayment: "$2000" },
  policies: [(_version, reqs) => reqs.filter((r) => r.payTo.toLowerCase() === TRIP1_PAY_TO.toLowerCase())],
});

const response = await fetchWithPayment(paymentUrl); // payment_url from purchase_hotel

Then poll get_order_details until ready is true.

Without a wallet

Call purchase_hotel with payment_service: "coingate". It returns a CoinGate checkout URL that a human finishes in a browser. CoinGate takes 120+ cryptocurrencies, including USDC.

Publishing to the MCP Registry

Bump version in server.json, then run mcp-publisher publish after mcp-publisher login dns --domain trip1.com. The DNS key lives with the trip1 team.

Releasing

Bump version in .claude-plugin/plugin.json and merge to main. The release.yml workflow tags vX.Y.Z, packages agents.zip (full plugin bundle) plus one zip per skill under skills/, and publishes them to a GitHub release.

To cut a release from an existing commit instead, push a tag manually: git tag -a vX.Y.Z -m "..." && git push origin vX.Y.Z. The same workflow handles it.

Links

License

MIT