Skip to content

Commit 49d0a5e

Browse files
committed
Fixes #4756: Add Daft.ie MCP Server to marketplace
- Added Daft.ie MCP Server configuration to marketplace/mcps.yml - Created complementary Property Search Mode in marketplace/modes.yml - Added marketplace documentation and structure in marketplace/README.md - Created validation script for marketplace files - Added comprehensive tests for marketplace data validation - Supports both NPM installation and local development methods - Includes proper tagging for Irish property rental searches
1 parent 2e2f83b commit 49d0a5e

File tree

5 files changed

+388
-0
lines changed

5 files changed

+388
-0
lines changed

marketplace/README.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Roo Code Marketplace
2+
3+
This directory contains the marketplace configuration files for Roo Code extensions, including MCP servers and custom modes.
4+
5+
## Structure
6+
7+
- `mcps.yml` - Configuration for MCP (Model Context Protocol) servers
8+
- `modes.yml` - Configuration for custom modes
9+
10+
## Adding New MCP Servers
11+
12+
To add a new MCP server to the marketplace, add an entry to `mcps.yml` following this structure:
13+
14+
```yaml
15+
- id: "unique-server-id"
16+
name: "Display Name"
17+
description: "Detailed description of what the MCP server does"
18+
author: "Author Name"
19+
authorUrl: "https://github.com/author"
20+
url: "https://github.com/author/repo"
21+
tags: ["tag1", "tag2", "tag3"]
22+
prerequisites: ["Node.js 18+", "npm"]
23+
content:
24+
- name: "Installation Method Name"
25+
content: |
26+
{
27+
"mcpServers": {
28+
"server-name": {
29+
"command": "npx",
30+
"args": ["package-name"],
31+
"env": {}
32+
}
33+
}
34+
}
35+
parameters: []
36+
prerequisites: ["Node.js 18+"]
37+
```
38+
39+
## Adding New Modes
40+
41+
To add a new custom mode to the marketplace, add an entry to `modes.yml` following this structure:
42+
43+
```yaml
44+
- id: "unique-mode-id"
45+
name: "Mode Display Name"
46+
description: "Description of what the mode does"
47+
author: "Author Name"
48+
authorUrl: "https://github.com/author"
49+
tags: ["tag1", "tag2"]
50+
prerequisites: ["Required MCP Server"]
51+
content: |
52+
name: Mode Name
53+
slug: mode-slug
54+
description: Brief mode description
55+
56+
instructions: |
57+
Detailed instructions for the mode...
58+
```
59+
60+
## Daft.ie MCP Server
61+
62+
The Daft.ie MCP Server has been added to the marketplace as requested in GitHub issue #4756. This server provides:
63+
64+
- Property search functionality for Irish rental market
65+
- Integration with Daft.ie's property database
66+
- Filtering by location, price, property type, and amenities
67+
- Real-time property data and availability
68+
69+
### Installation
70+
71+
The Daft.ie MCP server can be installed via:
72+
73+
1. **NPM Installation** (Recommended)
74+
75+
```bash
76+
npx daft-ie-mcp
77+
```
78+
79+
2. **Local Development**
80+
- Clone the repository from https://github.com/amineremache/daft-ie-mcp
81+
- Build and run locally
82+
83+
### Related Mode
84+
85+
A complementary "Property Search Mode" has also been added to help users effectively utilize the Daft.ie MCP server for property searches and market analysis.
86+
87+
## Contributing
88+
89+
To contribute new marketplace items:
90+
91+
1. Fork the repository
92+
2. Add your item to the appropriate YAML file
93+
3. Test the configuration
94+
4. Submit a pull request
95+
96+
## Validation
97+
98+
All marketplace items should follow the schema defined in `packages/types/src/marketplace.ts` to ensure compatibility with the Roo Code extension.

marketplace/mcps.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Marketplace MCP Servers Configuration
2+
# This file contains the configuration for MCP servers available in the marketplace
3+
4+
items:
5+
- id: "daft-ie-mcp"
6+
name: "Daft.ie MCP Server"
7+
description: "An MCP server for searching rental properties on Daft.ie, Ireland's largest property website. Search for apartments, houses, and other rental properties with filters for location, price, property type, and more."
8+
author: "amineremache"
9+
authorUrl: "https://github.com/amineremache"
10+
url: "https://github.com/amineremache/daft-ie-mcp"
11+
tags: ["property", "rental", "ireland", "search", "real-estate"]
12+
prerequisites: ["Node.js 18+", "npm or yarn"]
13+
content:
14+
- name: "NPM Installation"
15+
content: |
16+
{
17+
"mcpServers": {
18+
"daft-ie": {
19+
"command": "npx",
20+
"args": ["daft-ie-mcp"],
21+
"env": {}
22+
}
23+
}
24+
}
25+
parameters: []
26+
prerequisites: ["Node.js 18+", "npm"]
27+
- name: "Local Development"
28+
content: |
29+
{
30+
"mcpServers": {
31+
"daft-ie": {
32+
"command": "node",
33+
"args": ["path/to/daft-ie-mcp/dist/index.js"],
34+
"env": {}
35+
}
36+
}
37+
}
38+
parameters:
39+
- name: "Installation Path"
40+
key: "path"
41+
placeholder: "/path/to/daft-ie-mcp"
42+
optional: false
43+
prerequisites: ["Node.js 18+", "Git", "Local clone of the repository"]

marketplace/modes.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Marketplace Modes Configuration
2+
# This file contains the configuration for custom modes available in the marketplace
3+
4+
items:
5+
- id: "property-search-mode"
6+
name: "Property Search Mode"
7+
description: "A specialized mode for searching and analyzing rental properties using the Daft.ie MCP server. Optimized for property research, market analysis, and rental searches in Ireland."
8+
author: "RooCode Team"
9+
authorUrl: "https://github.com/RooCodeInc"
10+
tags: ["property", "rental", "ireland", "search", "real-estate", "analysis"]
11+
prerequisites: ["Daft.ie MCP Server"]
12+
content: |
13+
name: Property Search Specialist
14+
slug: property-search
15+
description: I am a property search specialist focused on helping you find rental properties in Ireland using Daft.ie. I can search for apartments, houses, and other rental properties with various filters, analyze market trends, and provide detailed property information.
16+
17+
instructions: |
18+
You are a property search specialist with access to the Daft.ie MCP server. Your role is to help users find rental properties in Ireland by:
19+
20+
1. **Property Search**: Use the Daft.ie MCP tools to search for rental properties based on user criteria such as:
21+
- Location (county, city, area)
22+
- Price range
23+
- Property type (apartment, house, studio, etc.)
24+
- Number of bedrooms/bathrooms
25+
- Amenities and features
26+
27+
2. **Market Analysis**: Provide insights on:
28+
- Average rental prices in specific areas
29+
- Property availability trends
30+
- Comparison between different locations
31+
- Market recommendations
32+
33+
3. **Property Details**: When users are interested in specific properties, provide:
34+
- Detailed property descriptions
35+
- Photos and virtual tours (if available)
36+
- Contact information for landlords/agents
37+
- Nearby amenities and transport links
38+
39+
4. **Search Optimization**: Help users refine their search criteria to find the best matches for their needs and budget.
40+
41+
Always be helpful, informative, and provide accurate property information. If you cannot find properties matching specific criteria, suggest alternative options or broader search parameters.
42+
43+
Remember to use the Daft.ie MCP server tools effectively to provide real-time property data and search results.

scripts/validate-marketplace.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/usr/bin/env node
2+
3+
const fs = require("fs")
4+
const path = require("path")
5+
const yaml = require("yaml")
6+
7+
// Simple validation script for marketplace files
8+
function validateMarketplaceFiles() {
9+
const marketplaceDir = path.join(__dirname, "..", "marketplace")
10+
11+
console.log("🔍 Validating marketplace files...\n")
12+
13+
// Check mcps.yml
14+
try {
15+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
16+
const mcpsContent = fs.readFileSync(mcpsPath, "utf-8")
17+
const mcpsData = yaml.parse(mcpsContent)
18+
19+
console.log("✅ mcps.yml is valid YAML")
20+
console.log(` Found ${mcpsData.items.length} MCP server(s)`)
21+
22+
// Check for Daft.ie MCP
23+
const daftieServer = mcpsData.items.find((item) => item.id === "daft-ie-mcp")
24+
if (daftieServer) {
25+
console.log("✅ Daft.ie MCP Server found")
26+
console.log(` Name: ${daftieServer.name}`)
27+
console.log(` Author: ${daftieServer.author}`)
28+
console.log(` URL: ${daftieServer.url}`)
29+
console.log(` Tags: ${daftieServer.tags.join(", ")}`)
30+
console.log(` Installation methods: ${daftieServer.content.length}`)
31+
} else {
32+
console.log("❌ Daft.ie MCP Server not found")
33+
}
34+
} catch (error) {
35+
console.log("❌ Error validating mcps.yml:", error.message)
36+
}
37+
38+
console.log("")
39+
40+
// Check modes.yml
41+
try {
42+
const modesPath = path.join(marketplaceDir, "modes.yml")
43+
const modesContent = fs.readFileSync(modesPath, "utf-8")
44+
const modesData = yaml.parse(modesContent)
45+
46+
console.log("✅ modes.yml is valid YAML")
47+
console.log(` Found ${modesData.items.length} mode(s)`)
48+
49+
// Check for Property Search mode
50+
const propertyMode = modesData.items.find((item) => item.id === "property-search-mode")
51+
if (propertyMode) {
52+
console.log("✅ Property Search Mode found")
53+
console.log(` Name: ${propertyMode.name}`)
54+
console.log(` Author: ${propertyMode.author}`)
55+
console.log(` Tags: ${propertyMode.tags.join(", ")}`)
56+
} else {
57+
console.log("❌ Property Search Mode not found")
58+
}
59+
} catch (error) {
60+
console.log("❌ Error validating modes.yml:", error.message)
61+
}
62+
63+
console.log("\n🎉 Marketplace validation complete!")
64+
}
65+
66+
validateMarketplaceFiles()
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import * as fs from "fs/promises"
2+
import * as path from "path"
3+
import * as yaml from "yaml"
4+
import { modeMarketplaceItemSchema, mcpMarketplaceItemSchema } from "@roo-code/types"
5+
6+
describe("Marketplace Data Validation", () => {
7+
const marketplaceDir = path.join(__dirname, "../../../../marketplace")
8+
9+
describe("MCP Servers Configuration", () => {
10+
it("should have valid mcps.yml file", async () => {
11+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
12+
const content = await fs.readFile(mcpsPath, "utf-8")
13+
const data = yaml.parse(content)
14+
15+
expect(data).toHaveProperty("items")
16+
expect(Array.isArray(data.items)).toBe(true)
17+
})
18+
19+
it("should validate all MCP items against schema", async () => {
20+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
21+
const content = await fs.readFile(mcpsPath, "utf-8")
22+
const data = yaml.parse(content)
23+
24+
for (const item of data.items) {
25+
expect(() => mcpMarketplaceItemSchema.parse(item)).not.toThrow()
26+
}
27+
})
28+
29+
it("should contain Daft.ie MCP server", async () => {
30+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
31+
const content = await fs.readFile(mcpsPath, "utf-8")
32+
const data = yaml.parse(content)
33+
34+
const daftieServer = data.items.find((item: any) => item.id === "daft-ie-mcp")
35+
expect(daftieServer).toBeDefined()
36+
expect(daftieServer.name).toBe("Daft.ie MCP Server")
37+
expect(daftieServer.author).toBe("amineremache")
38+
expect(daftieServer.url).toBe("https://github.com/amineremache/daft-ie-mcp")
39+
expect(daftieServer.tags).toContain("ireland")
40+
expect(daftieServer.tags).toContain("rental")
41+
expect(daftieServer.tags).toContain("property")
42+
})
43+
44+
it("should have valid installation methods for Daft.ie MCP", async () => {
45+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
46+
const content = await fs.readFile(mcpsPath, "utf-8")
47+
const data = yaml.parse(content)
48+
49+
const daftieServer = data.items.find((item: any) => item.id === "daft-ie-mcp")
50+
expect(daftieServer.content).toBeDefined()
51+
expect(Array.isArray(daftieServer.content)).toBe(true)
52+
expect(daftieServer.content.length).toBeGreaterThan(0)
53+
54+
// Check NPM installation method
55+
const npmMethod = daftieServer.content.find((method: any) => method.name === "NPM Installation")
56+
expect(npmMethod).toBeDefined()
57+
expect(npmMethod.content).toContain("daft-ie")
58+
expect(npmMethod.content).toContain("npx")
59+
60+
// Check local development method
61+
const localMethod = daftieServer.content.find((method: any) => method.name === "Local Development")
62+
expect(localMethod).toBeDefined()
63+
expect(localMethod.parameters).toBeDefined()
64+
expect(localMethod.parameters.length).toBeGreaterThan(0)
65+
})
66+
})
67+
68+
describe("Modes Configuration", () => {
69+
it("should have valid modes.yml file", async () => {
70+
const modesPath = path.join(marketplaceDir, "modes.yml")
71+
const content = await fs.readFile(modesPath, "utf-8")
72+
const data = yaml.parse(content)
73+
74+
expect(data).toHaveProperty("items")
75+
expect(Array.isArray(data.items)).toBe(true)
76+
})
77+
78+
it("should validate all mode items against schema", async () => {
79+
const modesPath = path.join(marketplaceDir, "modes.yml")
80+
const content = await fs.readFile(modesPath, "utf-8")
81+
const data = yaml.parse(content)
82+
83+
for (const item of data.items) {
84+
expect(() => modeMarketplaceItemSchema.parse(item)).not.toThrow()
85+
}
86+
})
87+
88+
it("should contain Property Search mode", async () => {
89+
const modesPath = path.join(marketplaceDir, "modes.yml")
90+
const content = await fs.readFile(modesPath, "utf-8")
91+
const data = yaml.parse(content)
92+
93+
const propertyMode = data.items.find((item: any) => item.id === "property-search-mode")
94+
expect(propertyMode).toBeDefined()
95+
expect(propertyMode.name).toBe("Property Search Mode")
96+
expect(propertyMode.tags).toContain("property")
97+
expect(propertyMode.tags).toContain("rental")
98+
expect(propertyMode.tags).toContain("ireland")
99+
expect(propertyMode.prerequisites).toContain("Daft.ie MCP Server")
100+
})
101+
102+
it("should have valid mode content structure", async () => {
103+
const modesPath = path.join(marketplaceDir, "modes.yml")
104+
const content = await fs.readFile(modesPath, "utf-8")
105+
const data = yaml.parse(content)
106+
107+
const propertyMode = data.items.find((item: any) => item.id === "property-search-mode")
108+
expect(propertyMode.content).toBeDefined()
109+
expect(propertyMode.content).toContain("name:")
110+
expect(propertyMode.content).toContain("slug:")
111+
expect(propertyMode.content).toContain("description:")
112+
expect(propertyMode.content).toContain("instructions:")
113+
})
114+
})
115+
116+
describe("Cross-references", () => {
117+
it("should have matching tags between related MCP and mode", async () => {
118+
const mcpsPath = path.join(marketplaceDir, "mcps.yml")
119+
const modesPath = path.join(marketplaceDir, "modes.yml")
120+
121+
const mcpsContent = await fs.readFile(mcpsPath, "utf-8")
122+
const modesContent = await fs.readFile(modesPath, "utf-8")
123+
124+
const mcpsData = yaml.parse(mcpsContent)
125+
const modesData = yaml.parse(modesContent)
126+
127+
const daftieServer = mcpsData.items.find((item: any) => item.id === "daft-ie-mcp")
128+
const propertyMode = modesData.items.find((item: any) => item.id === "property-search-mode")
129+
130+
// Check that they share common tags
131+
const commonTags = ["property", "rental", "ireland"]
132+
for (const tag of commonTags) {
133+
expect(daftieServer.tags).toContain(tag)
134+
expect(propertyMode.tags).toContain(tag)
135+
}
136+
})
137+
})
138+
})

0 commit comments

Comments
 (0)