Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions documentation/docs/mcp/kiwi-flight-search.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
title: Kiwi Flight Search Extension
description: Add Kiwi Flight Search MCP Server as a Goose Extension
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import YouTubeShortEmbed from '@site/src/components/YouTubeShortEmbed';
import CLIExtensionInstructions from '@site/src/components/CLIExtensionInstructions';
import GooseDesktopInstaller from '@site/src/components/GooseDesktopInstaller';
import GooseBuiltinInstaller from '@site/src/components/GooseBuiltinInstaller';
import { PanelLeft } from 'lucide-react';


This tutorial covers how to add the [Kiwi Flight Search MCP Server](https://mcp.kiwi.com) as a Goose extension to enable flight search and price comparison.

:::tip TLDR
<Tabs groupId="interface">
<TabItem value="ui" label="Goose Desktop" default>
Use `Add custom extension` in Settings → Extensions to add a `Streamable HTTP` extension type with:
</TabItem>
<TabItem value="cli" label="Goose CLI">
Use `goose configure` to add a `Remote Extension (Streaming HTTP)` extension type with:
</TabItem>
</Tabs>

**Endpoint URL**
```
https://mcp.kiwi.com
```
:::

## Configuration

<Tabs groupId="interface">
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking into getting streamable http deeplinks working

<TabItem value="ui" label="Goose Desktop" default>
1. Click the <PanelLeft className="inline" size={16} /> button in the top-left to open the sidebar
2. Click `Extensions`
3. Click `Add custom extension`
4. On the `Add custom extension` modal, enter the following:
- **Extension Name**: Kiwi Flight Search
- **Type**: Streamable HTTP
- **Endpoint**: `https://mcp.kiwi.com`
5. Click `Add Extension` to save the extension
6. Navigate to the chat

</TabItem>
<TabItem value="cli" label="Goose CLI">
<CLIExtensionInstructions
name="kiwi-flight-search"
type="http"
url="https://mcp.kiwi.com"
timeout={300}
/>

</TabItem>
</Tabs>

## Example Usage

Let's search for flights between any two locations on specific dates. You can search by city names or airport codes, and the extension will find available flights with pricing, duration, and booking links.

### Goose Prompt

```
Can you help me search for a flight from Paris to Rome for August 9?
```

### Goose Output

```
I'd be happy to help you search for flights from Paris to Rome for August 9th! Let me search for available options for you.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does it actually book?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thought it did, but no it doesnt :( . removed the word book for any confusion.


## ✈️ Flight Options: Paris → Rome (August 9, 2025)

### 💰 **Best Prices** (Cheapest Options)

| Route | Departure → Arrival | Class | Price | Book |
|-------|-------------------|-------|-------|------|
| Paris ORY → Rome FCO | 09/08 22:10 → 00:10+1 (2h 0m) | Economy | €138 | [Book Now](https://on.kiwi.com/ZyIJ2r) |
| Paris ORY → Rome FCO | 09/08 09:05 → 11:10 (2h 5m) | Economy | €154 | [Book Now](https://on.kiwi.com/31IDMW) |
| Paris ORY → Rome FCO | 09/08 06:25 → 08:25 (2h 0m) | Economy | €157 | [Book Now](https://on.kiwi.com/2dNs3f) |

### ⚡ **Shortest Flights** (Fastest Duration)

| Route | Departure → Arrival | Class | Price | Book |
|-------|-------------------|-------|-------|------|
| Paris ORY → Rome FCO | 09/08 06:25 → 08:25 (2h 0m) | Economy | €157 | [Book Now](https://on.kiwi.com/2dNs3f) |
| Paris ORY → Rome FCO | 09/08 22:10 → 00:10+1 (2h 0m) | Economy | €138 | [Book Now](https://on.kiwi.com/ZyIJ2r) |
| Paris CDG → Rome FCO | 09/08 21:10 → 23:10 (2h 0m) | Economy | €187 | [Book Now](https://on.kiwi.com/62jyt7) |

### 🕐 **Other Good Options**

| Route | Departure → Arrival | Class | Price | Book |
|-------|-------------------|-------|-------|------|
| Paris ORY → Rome FCO | 09/08 12:00 → 14:05 (2h 5m) | Economy | €164 | [Book Now](https://on.kiwi.com/m55oIC) |
| Paris ORY → Rome FCO | 09/08 21:10 → 23:10 (2h 0m) | Economy | €165 | [Book Now](https://on.kiwi.com/tkAU0T) |

## 📋 **Summary & Recommendations**

**🏆 Best Overall Value:** The **€138 evening flight** (ORY 22:10 → FCO 00:10+1) offers the best price with the shortest flight time, though it arrives after midnight.

**🌅 Best Morning Option:** The **€157 early flight** (ORY 06:25 → FCO 08:25) gets you to Rome early in the day with a quick 2-hour flight.

**⏰ Best Daytime Flight:** The **€154 mid-morning flight** (ORY 09:05 → FCO 11:10) offers great value and convenient timing.

All direct flights are around 2 hours, departing from either Paris Orly (ORY) or Charles de Gaulle (CDG) to Rome Fiumicino (FCO).

Have a wonderful trip to Rome! 🇮🇹 Fun fact: Rome has more fountains than any other city in the world - over 2,000 of them! Don't forget to toss a coin into the Trevi Fountain to ensure your return to the Eternal City! ⛲✨

```
75 changes: 54 additions & 21 deletions documentation/src/pages/extensions/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,27 +95,60 @@ export default function HomePage() {
: "No servers available."}
</div>
) : (
<div className="cards-grid">
{servers
.sort((a, b) => {
// Sort built-in servers first
if (a.is_builtin && !b.is_builtin) return -1;
if (!a.is_builtin && b.is_builtin) return 1;
return 0;
})
.map((server) => (
<motion.div
key={server.id}
initial={{
opacity: 0,
}}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.6 }}
>
<ServerCard key={server.id} server={server} />
</motion.div>
))}
<div>
{/* Built-in Extensions */}
{servers.filter(server => server.is_builtin).length > 0 && (
<div className="mb-12">
<h2 className="text-2xl font-semibold text-textProminent mb-6">
Built-in Extensions
</h2>
<div className="cards-grid">
{servers
.filter(server => server.is_builtin)
.sort((a, b) => a.name.localeCompare(b.name))
.map((server) => (
<motion.div
key={server.id}
initial={{
opacity: 0,
}}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.6 }}
>
<ServerCard key={server.id} server={server} />
</motion.div>
))}
</div>
</div>
)}

{/* Community Extensions */}
{servers.filter(server => !server.is_builtin).length > 0 && (
<div>
<h2 className="text-2xl font-semibold text-textProminent mb-6">
Community Extensions
</h2>
<div className="cards-grid">
{servers
.filter(server => !server.is_builtin)
.sort((a, b) => a.name.localeCompare(b.name))
.map((server) => (
<motion.div
key={server.id}
initial={{
opacity: 0,
}}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.6 }}
>
<ServerCard key={server.id} server={server} />
</motion.div>
))}
</div>
</div>
)}
</div>
)}
</section>
Expand Down
Loading