fless-mcp 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/index.mjs +74 -0
- package/package.json +17 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# fless-mcp
|
|
2
|
+
|
|
3
|
+
[Fless](https://fless.io) apartment-hunting tools for any MCP-capable AI agent — a zero-dependency stdio proxy to the hosted Fless MCP server at `https://mcp.fless.io/mcp`.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
Your agent researches apartments with live Fless data and hands you a pre-filled hunt link:
|
|
8
|
+
|
|
9
|
+
- **search_cities** — live + coming-soon cities
|
|
10
|
+
- **get_city_overview** — neighborhoods with median rents + WalkRating™ scores
|
|
11
|
+
- **get_neighborhood** — full detail (rents, scores, POI counts)
|
|
12
|
+
- **get_hunt_requirements** — every hunt field, enum, binary restriction (55+, pets, smoking), transparent pricing
|
|
13
|
+
- **build_hunt_link** — validate a brief → URL that pre-fills the entire hunt form
|
|
14
|
+
- **check_hunt_link** — created → opened → started lifecycle
|
|
15
|
+
- **search / fetch** — ChatGPT deep-research compatibility pair
|
|
16
|
+
|
|
17
|
+
All tools are read-only, no auth needed. Your human creates the account, verifies email, and pays — agents never do.
|
|
18
|
+
|
|
19
|
+
## Where we operate
|
|
20
|
+
|
|
21
|
+
Fless currently runs apartment hunts in **Washington, DC / Maryland / Virginia** only.
|
|
22
|
+
|
|
23
|
+
| ✅ Live now | 🚧 Coming soon |
|
|
24
|
+
|---|---|
|
|
25
|
+
| Alexandria, VA | Arlington, VA |
|
|
26
|
+
| Annapolis, MD | Baltimore, MD |
|
|
27
|
+
| Frederick, MD | Rockville, MD |
|
|
28
|
+
| Leesburg, VA | Silver Spring, MD |
|
|
29
|
+
| | Washington, DC |
|
|
30
|
+
| | Richmond, VA + more |
|
|
31
|
+
|
|
32
|
+
**Your city not listed?** We're expanding — check back, or join the waitlist at
|
|
33
|
+
[fless.io](https://fless.io). Agents: always call `search_cities` first.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
### Claude Desktop / any stdio MCP client
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"fless": {
|
|
43
|
+
"command": "uvx",
|
|
44
|
+
"args": ["fless-mcp"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Or with pip:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install fless-mcp
|
|
54
|
+
fless-mcp # speaks JSON-RPC on stdio
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Remote (no install needed)
|
|
58
|
+
|
|
59
|
+
Most clients connect to the hosted server directly:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
https://mcp.fless.io/mcp
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
See per-assistant setup guides (Claude, ChatGPT, Perplexity, Grok, Mistral Vibe, Codex, OpenClaw, Hermes): **https://fless.io/ai-agents**
|
|
66
|
+
|
|
67
|
+
## Environment
|
|
68
|
+
|
|
69
|
+
| Variable | Default | Purpose |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `FLESS_MCP_URL` | `https://mcp.fless.io/mcp` | Remote server (fallback: `https://www.fless.io/mcp`) |
|
|
72
|
+
| `FLESS_MCP_UA` | `fless-mcp/1.0.0 (+https://fless.io/ai-agents)` | User-Agent |
|
|
73
|
+
|
|
74
|
+
## The skill (recommended companion)
|
|
75
|
+
|
|
76
|
+
`fless-apartment-hunt` — an [Agent Skills](https://agentskills.io)-standard skill that teaches your agent the full workflow:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
hermes skills install well-known:https://fless.io
|
|
80
|
+
# or from GitHub:
|
|
81
|
+
npx skills add fless-io/skills
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
MIT
|
package/index.mjs
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* fless-mcp — stdio proxy for the Fless remote MCP server.
|
|
4
|
+
* Bridges local stdio MCP clients (Claude Desktop, etc.) to
|
|
5
|
+
* https://mcp.fless.io/mcp with zero configuration.
|
|
6
|
+
*/
|
|
7
|
+
import { createInterface } from 'node:readline';
|
|
8
|
+
import { request } from 'node:https';
|
|
9
|
+
import { request as httpRequest } from 'node:http';
|
|
10
|
+
|
|
11
|
+
const REMOTE = process.env.FLESS_MCP_URL || 'https://mcp.fless.io/mcp';
|
|
12
|
+
const UA = process.env.FLESS_MCP_UA || 'fless-mcp-npm/1.0.0 (+https://fless.io/ai-agents)';
|
|
13
|
+
|
|
14
|
+
const rl = createInterface({ input: process.stdin });
|
|
15
|
+
|
|
16
|
+
rl.on('line', (line) => {
|
|
17
|
+
line = line.trim();
|
|
18
|
+
if (!line) return;
|
|
19
|
+
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(line);
|
|
23
|
+
} catch {
|
|
24
|
+
process.stderr.write(`fless-mcp: dropping non-JSON: ${line.slice(0, 80)}\n`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const url = new URL(REMOTE);
|
|
29
|
+
const mod = url.protocol === 'https:' ? request : httpRequest;
|
|
30
|
+
const req = mod(url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Accept': 'application/json, text/event-stream',
|
|
35
|
+
'User-Agent': UA,
|
|
36
|
+
},
|
|
37
|
+
timeout: 120000,
|
|
38
|
+
}, (res) => {
|
|
39
|
+
let body = '';
|
|
40
|
+
res.on('data', (c) => { body += c; });
|
|
41
|
+
res.on('end', () => {
|
|
42
|
+
const ct = res.headers['content-type'] || '';
|
|
43
|
+
if (ct.includes('text/event-stream')) {
|
|
44
|
+
for (const sse of body.split('\n')) {
|
|
45
|
+
if (sse.startsWith('data:')) {
|
|
46
|
+
const payload = sse.slice(5).trim();
|
|
47
|
+
if (payload) process.stdout.write(payload + '\n');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} else if (body) {
|
|
51
|
+
process.stdout.write(body.replace(/\n$/, '') + '\n');
|
|
52
|
+
}
|
|
53
|
+
process.stdout.write('');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
req.on('error', (e) => {
|
|
58
|
+
const err = { jsonrpc: '2.0', id: parsed.id ?? null,
|
|
59
|
+
error: { code: -32000, message: `fless-mcp proxy error: ${e.message}` } };
|
|
60
|
+
process.stdout.write(JSON.stringify(err) + '\n');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
req.on('timeout', () => {
|
|
64
|
+
req.destroy();
|
|
65
|
+
const err = { jsonrpc: '2.0', id: parsed.id ?? null,
|
|
66
|
+
error: { code: -32000, message: 'fless-mcp proxy timeout (120s)' } };
|
|
67
|
+
process.stdout.write(JSON.stringify(err) + '\n');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
req.write(line);
|
|
71
|
+
req.end();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
rl.on('close', () => process.exit(0));
|
package/package.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fless-mcp",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Fless apartment-hunting MCP server — research cities, neighborhoods, rents, and build pre-filled hunt links. Stdio proxy to https://mcp.fless.io/mcp.",
|
|
5
|
+
"main": "index.mjs",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"fless-mcp": "./index.mjs"
|
|
9
|
+
},
|
|
10
|
+
"keywords": ["mcp", "apartment", "hunting", "rental", "ai", "agent", "llm"],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"homepage": "https://fless.io/ai-agents",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/fless-io/skills"
|
|
16
|
+
}
|
|
17
|
+
}
|