@dayplayai/mcp-server 1.3.3 → 2.0.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/.cursor/mcp.json +1 -1
- package/README.md +37 -43
- package/bin/dayplay-mcp.js +23 -8
- package/bin/oauth.js +133 -0
- package/package.json +2 -2
- package/plugin.json +3 -3
- package/skills/vibe-scout/SKILL.md +2 -2
- package/smithery.yaml +19 -26
package/.cursor/mcp.json
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DayPlay MCP — SF Bay Area Events, Places & Itineraries for AI Agents
|
|
2
2
|
|
|
3
|
-
**`@dayplayai/mcp-server`** ·
|
|
3
|
+
**`@dayplayai/mcp-server`** · v2.0.0 · MIT
|
|
4
4
|
|
|
5
5
|
[](https://apify.com/dayplay/dayplay-local-intelligence)
|
|
6
6
|
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
|
|
9
9
|
[](https://glama.ai/mcp/servers/dayplayTeam/dayplay-mcp)
|
|
10
10
|
|
|
11
|
+
[](https://mcpservers.org/servers/dayplayteam/dayplay-mcp)
|
|
12
|
+
|
|
11
13
|
A zero-configuration MCP server that gives any AI agent a *locally grounded* concierge for the **San Francisco Bay Area only** — curated places, verified real-time events, and neighborhood binding that eliminates cross-bay drift.
|
|
12
14
|
|
|
13
15
|
> 🔒 **Scope: SF Bay Area only.** This server serves **strictly San Francisco, Oakland, and Berkeley — 35 neighborhood centroids**. It does **not** serve New York, Los Angeles, Chicago, Austin, Seattle, Miami, London, Tokyo, or any other city, region, or country. **Out-of-market locations are not served.** If a user asks about any location outside the SF Bay Area, the agent must state *"Dayplay is strictly San Francisco Bay Area only (San Francisco, Oakland, Berkeley); it does not cover \<location\>"* and must **not** call a tool or fabricate venues, events, dates, hours, or neighborhoods for that location. Zero results for a valid SF Bay Area query are reported honestly, never filled with invented places.
|
|
14
16
|
|
|
15
|
-
**Remote endpoint:** `https://
|
|
17
|
+
**Remote endpoint:** `https://api.dayplay.io/mcp` (Streamable HTTP / MCP)
|
|
16
18
|
|
|
17
19
|
---
|
|
18
20
|
|
|
@@ -26,7 +28,7 @@ A zero-configuration MCP server that gives any AI agent a *locally grounded* con
|
|
|
26
28
|
{
|
|
27
29
|
"mcpServers": {
|
|
28
30
|
"dayplay": {
|
|
29
|
-
"url": "https://
|
|
31
|
+
"url": "https://api.dayplay.io/mcp"
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
}
|
|
@@ -70,7 +72,7 @@ Restart Claude Desktop, then ask: *"What's happening in the Mission tonight?"*
|
|
|
70
72
|
Add the Dayplay remote connector:
|
|
71
73
|
|
|
72
74
|
```
|
|
73
|
-
https://
|
|
75
|
+
https://api.dayplay.io/mcp
|
|
74
76
|
```
|
|
75
77
|
|
|
76
78
|
Or bridge it over stdio in Grok's MCP config:
|
|
@@ -100,56 +102,48 @@ Prints the live endpoint and available tool names. Exits non-zero on failure.
|
|
|
100
102
|
|
|
101
103
|
## Tools
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
### `get_places`
|
|
105
|
+
The catalog covers the SF Bay Area (San Francisco, Oakland, Berkeley — 35 centroids). Out-of-market locations are declined, never fabricated.
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
**Open tools** run immediately — no account needed. **Gated tools** 🔒 return `401` on first call; your host opens Google sign-in and a free DayPlay account unlocks them. Through the npm stdio bridge, gated calls fail instead of opening sign-in — prefer the direct remote URL for gated tools.
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
### Discovery (open)
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
- `get_happening_today` — events + places happening today, by location and radius
|
|
112
|
+
- `get_live_now` — what is happening right now
|
|
113
|
+
- `get_weekend` — Saturday/Sunday feed (`weekend_day: "sat" | "sun"`)
|
|
114
|
+
- `get_decision_feed` — ranked decision feed (send `user_lat` / `user_lng`)
|
|
115
|
+
- `browse_places` — places inside a radius, sorted by distance
|
|
116
|
+
- `get_listing` — full detail for one place or venue by `id`
|
|
117
|
+
- `get_top_restaurants` / `get_top_venues` — ranked lists, optional city
|
|
118
|
+
- `get_local_gems` — curated local gems
|
|
119
|
+
- `get_locals_favorites` — locals' favorites
|
|
120
|
+
- `get_venue_events` — upcoming events at one venue (`id`)
|
|
121
|
+
- `get_subcategories` / `get_genres` / `get_event_bridge` — taxonomy feeds
|
|
118
122
|
|
|
119
|
-
|
|
123
|
+
### Marketing feeds (open, X-API-Key)
|
|
120
124
|
|
|
121
|
-
|
|
125
|
+
- `get_marketing_events` / `get_marketing_places` / `get_marketing_neighborhoods` — catalog feeds; forward an `X-API-Key` header. `get_marketing_neighborhoods` returns the **35 SF Bay Area neighborhood centroids with coordinates and radii**.
|
|
122
126
|
|
|
123
|
-
|
|
127
|
+
### Search 🔒 *free account*
|
|
124
128
|
|
|
125
|
-
|
|
129
|
+
- `search_smart`, `search_query_router`, `search_embed`, `search_parse_intent`, `search_rerank`, `search_web` — model-backed semantic search. Requires the user token via Google connect.
|
|
126
130
|
|
|
127
|
-
|
|
131
|
+
### Saves & Outings 🔒 *free account*
|
|
128
132
|
|
|
133
|
+
- `save_outing` — save a dated, neighborhood-bound outing plan to the signed-in user's Saved tab
|
|
134
|
+
- `get_my_itinerary` — retrieve the signed-in user's saved itineraries
|
|
135
|
+
- `list_saves`, `save_listing`, `unsave_listing`, `list_going`, `mark_going`, `unmark_going` — saved places and event RSVPs
|
|
136
|
+
- `upvote_listing`, `share_local_favorite`, `share_gem` — community signals
|
|
129
137
|
|
|
130
|
-
|
|
138
|
+
Requires the free-account connect. A host connected to the remote URL opens Google sign-in on the first gated call; the npm stdio package opens a browser for the same connect step. Saved plans appear on the DayPlay Saved tab across web and app.
|
|
131
139
|
|
|
132
|
-
|
|
140
|
+
Requires the free-account connect (`https://www.dayplay.io/link`). Saved plans appear on the DayPlay Saved tab across web and app.
|
|
133
141
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
| Parameter | Type | Description |
|
|
137
|
-
| --- | --- | --- |
|
|
138
|
-
| `date` | string (`YYYY-MM-DD`) | Target date |
|
|
139
|
-
| `neighborhood` | string | SF Bay Area neighborhood name (e.g. Mission, North Beach, Oakland, Berkeley) |
|
|
140
|
-
| `category` | string | Category filter (e.g. music, art, food) |
|
|
141
|
-
| `source` | string | Data source filter |
|
|
142
|
-
| `limit` | integer | Max events to return (default 20) |
|
|
142
|
+
Example prompts: *"What's happening in the Mission tonight?"* · *"Build me a Saturday itinerary that never leaves Bernal Heights."* · *"Save this outing to my DayPlay account."*
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
### Legacy compatibility
|
|
145
145
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
Returns the complete and exclusive list of **35 San Francisco Bay Area neighborhood centroids with coordinates and radii** (San Francisco, Oakland, Berkeley only). No other market is covered. Use to strictly bind itineraries to a specific neighborhood and to detect out-of-market queries.
|
|
149
|
-
|
|
150
|
-
Example prompt: *"Give me the neighborhood list, then build a Saturday itinerary that never leaves Bernal Heights."*
|
|
151
|
-
|
|
152
|
-
---
|
|
146
|
+
The five 1.x tool names (`get_neighborhoods`, `get_events`, `get_places`, `plan_outing`, `manage_saved_plans`) remain temporarily served for transition. They are deprecated — migrate to the catalog above; a future release removes them.
|
|
153
147
|
|
|
154
148
|
## The Anti-Drift Guarantee
|
|
155
149
|
|
|
@@ -174,7 +168,7 @@ That is the product: the answer stays where you are.
|
|
|
174
168
|
|
|
175
169
|
| Env var | Default | Purpose |
|
|
176
170
|
| --- | --- | --- |
|
|
177
|
-
| `DAYPLAY_MCP_URL` | `https://
|
|
171
|
+
| `DAYPLAY_MCP_URL` | `https://api.dayplay.io/mcp` | Override the remote endpoint (staging, self-hosted, local dev) |
|
|
178
172
|
|
|
179
173
|
No API key is required for the public endpoint. Optional auth tokens, if your deployment needs them, are passed through as standard `Authorization` headers by the MCP client — never commit them to config files.
|
|
180
174
|
|
|
@@ -183,7 +177,7 @@ No API key is required for the public endpoint. Optional auth tokens, if your de
|
|
|
183
177
|
## How the proxy works
|
|
184
178
|
|
|
185
179
|
```
|
|
186
|
-
MCP client (stdio) ⇄ bin/dayplay-mcp.js ⇄ https://
|
|
180
|
+
MCP client (stdio) ⇄ bin/dayplay-mcp.js ⇄ https://api.dayplay.io/mcp (Streamable HTTP)
|
|
187
181
|
```
|
|
188
182
|
|
|
189
183
|
The shim lists tools and forwards `tools/call` verbatim to the remote endpoint, so new Dayplay tools appear automatically without an npm update. It is a transport bridge, not a reimplementation — every schema, filter, and verification rule is served by Dayplay itself.
|
|
@@ -211,7 +205,7 @@ dayplay-mcp/
|
|
|
211
205
|
│ └── e2e.mjs
|
|
212
206
|
├── smithery.yaml # Smithery.ai registry manifest
|
|
213
207
|
├── plugin.json # Agent Plugins standard manifest
|
|
214
|
-
├── package.json # npm metadata (@dayplayai/mcp-server v1.3.
|
|
208
|
+
├── package.json # npm metadata (@dayplayai/mcp-server v1.3.4, MIT)
|
|
215
209
|
├── README.md # This file
|
|
216
210
|
└── LICENSE # MIT (Dayplay Team)
|
|
217
211
|
```
|
package/bin/dayplay-mcp.js
CHANGED
|
@@ -16,17 +16,19 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
16
16
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
17
17
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
18
18
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
19
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
19
20
|
import {
|
|
20
21
|
CallToolRequestSchema,
|
|
21
22
|
ListToolsRequestSchema,
|
|
22
23
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
24
|
+
import { createAuthProvider } from "./oauth.js";
|
|
23
25
|
|
|
24
|
-
const DEFAULT_ENDPOINT = "https://
|
|
26
|
+
const DEFAULT_ENDPOINT = "https://api.dayplay.io/mcp";
|
|
25
27
|
const ENDPOINT = process.env.DAYPLAY_MCP_URL || DEFAULT_ENDPOINT;
|
|
26
28
|
|
|
27
29
|
const SERVER_INFO = {
|
|
28
30
|
name: "dayplay",
|
|
29
|
-
version: "
|
|
31
|
+
version: "2.0.0",
|
|
30
32
|
};
|
|
31
33
|
|
|
32
34
|
const log = (...args) => console.error("[dayplay-mcp]", ...args);
|
|
@@ -34,14 +36,30 @@ const log = (...args) => console.error("[dayplay-mcp]", ...args);
|
|
|
34
36
|
/** Build a connected remote client. */
|
|
35
37
|
async function connectRemote() {
|
|
36
38
|
const client = new Client(
|
|
37
|
-
{ name: "dayplay-mcp-proxy", version: "
|
|
39
|
+
{ name: "dayplay-mcp-proxy", version: "2.0.0" },
|
|
38
40
|
{ capabilities: {} },
|
|
39
41
|
);
|
|
40
|
-
const
|
|
42
|
+
const authProvider = await createAuthProvider(ENDPOINT, log);
|
|
43
|
+
const transport = new StreamableHTTPClientTransport(new URL(ENDPOINT), { authProvider });
|
|
41
44
|
await client.connect(transport);
|
|
42
45
|
return client;
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
async function callRemote(remote, request) {
|
|
49
|
+
const params = {
|
|
50
|
+
name: request.params.name,
|
|
51
|
+
arguments: request.params.arguments ?? {},
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
return await remote.callTool(params);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if (error instanceof UnauthorizedError || error?.name === "UnauthorizedError") {
|
|
57
|
+
return remote.callTool(params);
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
45
63
|
/** `--smoke`: verify the remote endpoint and exit non-zero on failure. */
|
|
46
64
|
async function smoke() {
|
|
47
65
|
const client = await connectRemote();
|
|
@@ -75,10 +93,7 @@ async function main() {
|
|
|
75
93
|
});
|
|
76
94
|
|
|
77
95
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
78
|
-
return remote
|
|
79
|
-
name: request.params.name,
|
|
80
|
-
arguments: request.params.arguments ?? {},
|
|
81
|
-
});
|
|
96
|
+
return callRemote(remote, request);
|
|
82
97
|
});
|
|
83
98
|
|
|
84
99
|
const shutdown = async () => {
|
package/bin/oauth.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
const AUTH_PATH = path.join(os.homedir(), ".dayplay", "mcp-auth.json");
|
|
8
|
+
|
|
9
|
+
function readState() {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(fs.readFileSync(AUTH_PATH, "utf8"));
|
|
12
|
+
} catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function writeState(state) {
|
|
18
|
+
fs.mkdirSync(path.dirname(AUTH_PATH), { recursive: true });
|
|
19
|
+
fs.writeFileSync(AUTH_PATH, JSON.stringify(state), { mode: 0o600 });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function openBrowser(target) {
|
|
23
|
+
const url = String(target);
|
|
24
|
+
if (process.platform === "win32") {
|
|
25
|
+
spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const command = process.platform === "darwin" ? "open" : "xdg-open";
|
|
29
|
+
spawn(command, [url], { detached: true, stdio: "ignore" }).unref();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function createAuthProvider(endpoint, log) {
|
|
33
|
+
const origin = new URL(endpoint).origin;
|
|
34
|
+
let state = readState();
|
|
35
|
+
let waitForCode = () => Promise.reject(new Error("Dayplay connect is not waiting"));
|
|
36
|
+
|
|
37
|
+
const callback = http.createServer((req, res) => {
|
|
38
|
+
const url = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
39
|
+
if (url.pathname !== "/callback") {
|
|
40
|
+
res.writeHead(404);
|
|
41
|
+
res.end();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
45
|
+
res.end("<p>Dayplay is connected. You can close this tab.</p>");
|
|
46
|
+
const code = url.searchParams.get("code");
|
|
47
|
+
const error = url.searchParams.get("error");
|
|
48
|
+
waitForCode(code, error);
|
|
49
|
+
});
|
|
50
|
+
await new Promise((resolve, reject) => {
|
|
51
|
+
callback.once("error", reject);
|
|
52
|
+
callback.listen(0, "127.0.0.1", resolve);
|
|
53
|
+
});
|
|
54
|
+
const { port } = callback.address();
|
|
55
|
+
const redirectUrl = `http://127.0.0.1:${port}/callback`;
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
get redirectUrl() {
|
|
59
|
+
return redirectUrl;
|
|
60
|
+
},
|
|
61
|
+
get clientMetadata() {
|
|
62
|
+
return {
|
|
63
|
+
client_name: "Dayplay MCP",
|
|
64
|
+
redirect_uris: [redirectUrl],
|
|
65
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
66
|
+
response_types: ["code"],
|
|
67
|
+
token_endpoint_auth_method: "none",
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
clientInformation() {
|
|
71
|
+
return state.client;
|
|
72
|
+
},
|
|
73
|
+
saveClientInformation(client) {
|
|
74
|
+
state = { ...state, client };
|
|
75
|
+
writeState(state);
|
|
76
|
+
},
|
|
77
|
+
tokens() {
|
|
78
|
+
return state.tokens;
|
|
79
|
+
},
|
|
80
|
+
saveTokens(tokens) {
|
|
81
|
+
state = { ...state, tokens };
|
|
82
|
+
writeState(state);
|
|
83
|
+
},
|
|
84
|
+
saveCodeVerifier(verifier) {
|
|
85
|
+
state = { ...state, verifier };
|
|
86
|
+
writeState(state);
|
|
87
|
+
},
|
|
88
|
+
codeVerifier() {
|
|
89
|
+
if (!state.verifier) {
|
|
90
|
+
throw new Error("Dayplay connect is missing its PKCE verifier");
|
|
91
|
+
}
|
|
92
|
+
return state.verifier;
|
|
93
|
+
},
|
|
94
|
+
async redirectToAuthorization(authorizationUrl) {
|
|
95
|
+
log("Opening a browser to connect Dayplay. Sign in with Google, then retry the tool if it does not finish.");
|
|
96
|
+
const code = await new Promise((resolve, reject) => {
|
|
97
|
+
const timer = setTimeout(() => {
|
|
98
|
+
reject(new Error("Dayplay connect timed out. Sign in with Google and call the tool again."));
|
|
99
|
+
}, 3 * 60 * 1000);
|
|
100
|
+
waitForCode = (nextCode, error) => {
|
|
101
|
+
clearTimeout(timer);
|
|
102
|
+
if (error || !nextCode) {
|
|
103
|
+
reject(new Error(error || "Dayplay connect did not return a code"));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
resolve(nextCode);
|
|
107
|
+
};
|
|
108
|
+
openBrowser(authorizationUrl);
|
|
109
|
+
});
|
|
110
|
+
const clientId = state.client?.client_id;
|
|
111
|
+
if (!clientId) {
|
|
112
|
+
throw new Error("Dayplay connect is missing its client id");
|
|
113
|
+
}
|
|
114
|
+
const body = new URLSearchParams({
|
|
115
|
+
grant_type: "authorization_code",
|
|
116
|
+
code,
|
|
117
|
+
code_verifier: state.verifier,
|
|
118
|
+
redirect_uri: redirectUrl,
|
|
119
|
+
client_id: clientId,
|
|
120
|
+
});
|
|
121
|
+
const response = await fetch(`${origin}/oauth/token`, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
124
|
+
body,
|
|
125
|
+
});
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
throw new Error("Dayplay connect could not finish sign-in");
|
|
128
|
+
}
|
|
129
|
+
state = { ...state, tokens: await response.json() };
|
|
130
|
+
writeState(state);
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dayplayai/mcp-server",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "DayPlay MCP
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "DayPlay MCP \u2014 verified real-time SF Bay Area places, events & itineraries for AI agents. 35-tool catalog: feeds, search, saves & outing planning (gated tools need a free account via Google connect). Remote endpoint: https://api.dayplay.io/mcp",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
7
7
|
"model-context-protocol",
|
package/plugin.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "dayplay-local-concierge",
|
|
4
|
-
"description": "Verified real-time SF Bay Area places, events &
|
|
5
|
-
"version": "
|
|
4
|
+
"description": "Verified real-time SF Bay Area places, events & itineraries for AI agents. 40-tool catalog: open feeds (today/weekend/live-now, browse, venues, gems) + gated search, saves & outing planning via free Google connect. Strictly San Francisco, Oakland, Berkeley (Anti-Drift Guarantee).",
|
|
5
|
+
"version": "2.0.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Dayplay Team",
|
|
8
8
|
"email": "hello@dayplay.io",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"mcp": {
|
|
33
33
|
"servers": {
|
|
34
34
|
"dayplay": {
|
|
35
|
-
"url": "https://
|
|
35
|
+
"url": "https://api.dayplay.io/mcp"
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
},
|
|
@@ -27,8 +27,8 @@ Dayplay serves **strictly the San Francisco Bay Area: San Francisco, Oakland, an
|
|
|
27
27
|
|
|
28
28
|
## Instructions
|
|
29
29
|
|
|
30
|
-
1. If the user names a neighborhood,
|
|
31
|
-
2.
|
|
30
|
+
1. If the user names a neighborhood, bind spatially: use `get_marketing_neighborhoods` (35 centroids) or pass lat/lng + radius to the feed tools.
|
|
31
|
+
2. For places/events use `get_happening_today`, `get_weekend`, or `get_live_now` (open tools) and `browse_places`; use `search_smart` for semantic queries (gated — a 401 means the host opens Google connect).
|
|
32
32
|
3. **Enforce boundaries:** East Bay stays in the East Bay. Never cross-bridge drift. Never drift outside San Francisco, Oakland, or Berkeley.
|
|
33
33
|
4. Verify open status — never send someone to a closed door.
|
|
34
34
|
5. Return 2–3 sequenced stops, why each is the move, and hours/walk time.
|
package/smithery.yaml
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
name: dayplay
|
|
2
2
|
displayName: DayPlay — SF Bay Area Local Intelligence for AI Agents
|
|
3
3
|
description: >-
|
|
4
|
-
Verified real-time places, events &
|
|
4
|
+
Verified real-time SF Bay Area places, events & itineraries for AI agents.
|
|
5
5
|
Geo-locked to San Francisco, Oakland & Berkeley (35 neighborhood centroids).
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
40-tool catalog: open feeds (today/weekend/live-now, browse, venues, gems)
|
|
7
|
+
plus gated search, saves & outing planning via free Google connect (browser
|
|
8
|
+
open now supported through the stdio bridge). Honest zero-results protocol:
|
|
9
9
|
agents never fabricate venues, events, dates, or hours (Anti-Drift Guarantee).
|
|
10
|
-
One remote URL
|
|
11
|
-
|
|
12
|
-
version: 1.3.3
|
|
10
|
+
One remote URL.
|
|
11
|
+
version: 2.0.0
|
|
13
12
|
license: MIT
|
|
14
13
|
homepage: https://www.dayplay.io
|
|
15
14
|
repository: https://github.com/dayplayTeam/dayplay-mcp
|
|
@@ -36,27 +35,21 @@ examples:
|
|
|
36
35
|
- "What's on in Austin tonight? (out of market - Dayplay is strictly SF Bay Area only, so no results are returned)"
|
|
37
36
|
startCommand:
|
|
38
37
|
type: http
|
|
39
|
-
url: https://
|
|
38
|
+
url: https://api.dayplay.io/mcp
|
|
40
39
|
configSchema:
|
|
41
40
|
type: object
|
|
42
41
|
properties: {}
|
|
43
42
|
required: []
|
|
44
43
|
tools:
|
|
45
|
-
- name:
|
|
46
|
-
description:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- name:
|
|
52
|
-
description:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- name: get_neighborhoods
|
|
58
|
-
description: >-
|
|
59
|
-
Returns the complete and exclusive list of 35 San Francisco Bay Area
|
|
60
|
-
neighborhood centroids (San Francisco, Oakland, Berkeley only) with
|
|
61
|
-
coordinates and radii. No other market is covered. Use to strictly bind
|
|
62
|
-
itineraries to a specific neighborhood and to detect out-of-market queries.
|
|
44
|
+
- name: get_happening_today
|
|
45
|
+
description: Events and places happening today (lat/lng/radius).
|
|
46
|
+
- name: get_weekend
|
|
47
|
+
description: Saturday or Sunday feed.
|
|
48
|
+
- name: get_live_now
|
|
49
|
+
description: What is happening right now.
|
|
50
|
+
- name: search_smart
|
|
51
|
+
description: Smart search (gated - requires free DayPlay account via Google connect).
|
|
52
|
+
- name: save_outing
|
|
53
|
+
description: Save a multi-stop outing plan (gated - free account).
|
|
54
|
+
- name: get_my_itinerary
|
|
55
|
+
description: Retrieve saved itineraries (gated - free account).
|