trip1
by trivial-corp
README.md
<p align="center"><img src="logo.png" width="96" alt="trip1 logo"></p>
# trip1 agent skills and MCP server
[](https://smithery.ai/servers/trip1/trip1)
A plugin that lets agents book hotels on [trip1](https://trip1.com) through the trip1 MCP server: about 3 million properties in 200+ countries, paid in USDC on Base over [x402](https://x402.org).
- **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](https://open-plugins.com) 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](https://registry.modelcontextprotocol.io) entry
- `llms-install.md` — install instructions for agents such as Cline that set servers up themselves
## Install
### Claude Code
```bash
/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](https://github.com/trivial-corp/agents/releases/latest), 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:
```json
{
"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):
```json
{
"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
```bash
code --add-mcp '{"name":"trip1","type":"http","url":"https://trip1.com/api/mcp"}'
```
### Codex CLI, Gemini CLI, any SKILL.md-compatible agent
```bash
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
```bash
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:
```bash
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:
```ts
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
- Landing page: https://trip1.com/agents
- Server card: https://trip1.com/.well-known/mcp.json
- x402 metadata: https://trip1.com/.well-known/x402.json
- MCP Registry entry: [`com.trip1/mcp`](https://registry.modelcontextprotocol.io/?q=com.trip1)
- x402 protocol: https://x402.org
- Agent Skills spec: https://agentskills.io/specification
## License
[MIT](LICENSE)
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues