@hotscots/mcp 1.0.1 → 1.0.2

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 CHANGED
@@ -1,6 +1,6 @@
1
- # @hotscots/mcp
1
+ # Hots&Cots MCP Server
2
2
 
3
- MCP server for the [Hots&Cots](https://hotscots.app) military quality-of-life API. Gives Claude Desktop, Cursor, and other MCP clients direct access to anonymized barracks and DFAC review data.
3
+ Give AI assistants like Claude direct access to the [Hots&Cots](https://hotscots.app) military quality-of-life database — barracks conditions, DFAC ratings, and on-base facility reviews from service members across the DoD.
4
4
 
5
5
  **Requires an H&CPro API key** (`hc_live_...`) — generate yours at [hotscots.app/subscription/dashboard](https://hotscots.app/subscription/dashboard).
6
6
 
@@ -8,7 +8,7 @@ MCP server for the [Hots&Cots](https://hotscots.app) military quality-of-life AP
8
8
 
9
9
  ## Setup — Claude Desktop
10
10
 
11
- Add this to your Claude Desktop config and you're done. No cloning, no building.
11
+ No cloning or building required. Add this to your Claude Desktop config file:
12
12
 
13
13
  **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
14
14
  **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
@@ -33,34 +33,30 @@ Restart Claude Desktop. The Hots&Cots tools will appear automatically.
33
33
 
34
34
  ## Setup — Cursor / Other MCP Clients
35
35
 
36
- Same config, different file location. Check your client's MCP documentation for the config path.
36
+ Same config block — check your client's documentation for the config file location.
37
37
 
38
38
  ---
39
39
 
40
- ## What You Can Ask Claude
40
+ ## What You Can Ask
41
41
 
42
- - *"Check that my Hots&Cots API key is working"*
43
- - *"List all installations on Hots&Cots — which have the most reviews?"*
44
- - *"Give me a full snapshot of Fort Hood — barracks and DFAC"*
45
- - *"Analyze the last 500 barracks reviews — what percentage report mold?"*
46
- - *"Analyze DFAC reviews — what's the inedible food report rate?"*
47
- - *"Show medical and CDC facility reviews"*
48
- - *"How many barracks reviews does Fort Stewart have?"*
42
+ - *"Is my Hots&Cots API key working?"*
43
+ - *"List all installations — which have the most reviews?"*
44
+ - *"Show me barracks reviews at Fort Liberty."*
45
+ - *"What percentage of barracks reviews at Fort Hood report mold?"*
46
+ - *"How do service members rate the DFACs at Camp Lejeune?"*
47
+ - *"Show medical and CDC facility reviews for Army bases in Texas."*
49
48
 
50
49
  ---
51
50
 
52
51
  ## Available Tools
53
52
 
54
53
  | Tool | Description |
55
- |------|-------------|
56
- | `hotscots_health` | Verify your API key |
57
- | `hotscots_get_barracks_reviews` | Paginated barracks (cots) reviews |
58
- | `hotscots_analyze_barracks` | Statistical analysis — mold rate, HVAC failures, DPW satisfaction, top tags |
59
- | `hotscots_get_dfac_reviews` | Paginated DFAC (hots) reviews |
60
- | `hotscots_analyze_dfac` | Statistical analysis — per-meal ratings, food quality flags, inedible rate |
61
- | `hotscots_get_other_reviews` | Medical, CDC, gym, PX/BX, lodging, moving reviews |
62
- | `hotscots_list_installations` | All installations with cots/hots/other/total counts |
63
- | `hotscots_installation_snapshot` | Unified barracks + DFAC snapshot for a named installation |
54
+ |---|---|
55
+ | `hotscots_health` | Verify your API key and confirm the service is reachable |
56
+ | `hotscots_list_installations` | All installations with barracks, dining, and other review counts |
57
+ | `hotscots_get_barracks_reviews` | Paginated barracks / housing (Cots) reviews |
58
+ | `hotscots_get_dfac_reviews` | Paginated dining facility / DFAC (Hots) reviews |
59
+ | `hotscots_get_other_reviews` | Reviews for medical, CDC, gym, PX/BX, lodging, and moving services |
64
60
 
65
61
  ---
66
62
 
@@ -69,26 +65,43 @@ Same config, different file location. Check your client's MCP documentation for
69
65
  ```
70
66
  Claude Desktop / Cursor / AI client
71
67
  ↓ MCP protocol (stdio)
72
- @hotscots/mcp ← runs locally on your machine via npx
68
+ @hotscots/mcp ← runs locally via npx
73
69
  ↓ HTTPS + Bearer token
74
70
  api.hotscots.app/functions/v1/api
75
- ↓ internal
76
- Supabase (anonymized review data)
71
+ ↓
72
+ Supabase (anonymized, OPSEC-scrubbed review data)
77
73
  ```
78
74
 
79
- The MCP server runs locally — your API key never leaves your machine.
75
+ The server runs locally on your machine — your API key never leaves your device.
80
76
 
81
77
  ---
82
78
 
83
79
  ## Environment Variables
84
80
 
85
- | Variable | Description |
86
- |----------|-------------|
87
- | `HOTSCOTS_API_KEY` | Your API key (`hc_live_...`) — required |
88
- | `HOTSCOTS_API_BASE_URL` | Override the API base URL (optional) |
89
- | `TRANSPORT` | `stdio` (default) or `http` for remote/multi-user mode |
90
- | `PORT` | HTTP port when `TRANSPORT=http` (default: `3000`) |
81
+ | Variable | Required | Description |
82
+ |---|---|---|
83
+ | `HOTSCOTS_API_KEY` | ✅ | Your API key (`hc_live_...`) |
84
+ | `HOTSCOTS_API_URL` | ❌ | Override the API base URL |
85
+ | `TRANSPORT` | ❌ | `stdio` (default) or `http` for remote/multi-user mode |
86
+ | `PORT` | ❌ | HTTP port when `TRANSPORT=http` (default: `3000`) |
91
87
 
92
88
  ---
93
89
 
94
- **Clean. Safe. Comfort.** — [hotscots.app](https://hotscots.app)
90
+ ## Troubleshooting
91
+
92
+ **"HOTSCOTS_API_KEY environment variable is not set"**
93
+ → Make sure the `env` block in your config includes your key and you've fully restarted the client.
94
+
95
+ **"API key not found" or "License inactive"**
96
+ → Double-check your key at [hotscots.app/subscription/dashboard](https://hotscots.app/subscription/dashboard). Keys must be on an active H&CPro plan.
97
+
98
+ **"Access denied to \<endpoint\>"**
99
+ → Your plan may not include that review type. Check your subscription tier.
100
+
101
+ **Tools aren't showing up**
102
+ → Confirm Node.js 18+ is installed (`node --version`) and try asking Claude to run a health check.
103
+
104
+ ---
105
+
106
+ **Clean. Safe. Comfort.** — [hotscots.app](https://hotscots.app)
107
+ Questions? [support@hotscots.app](mailto:support@hotscots.app)
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ import { z } from "zod";
7
7
  // ─── Config ──────────────────────────────────────────────────────────────────
8
8
  const API_BASE_URL = process.env.HOTSCOTS_API_URL ?? "https://api.hotscots.app/functions/v1/api";
9
9
  const CHARACTER_LIMIT = 25000;
10
+ // When filtering client-side we must over-fetch. Cap how many records we'll
11
+ // pull in a single request to avoid burning the user's monthly quota.
12
+ const FILTER_FETCH_CAP = 500;
10
13
  var EndpointType;
11
14
  (function (EndpointType) {
12
15
  EndpointType["HOTS"] = "hots";
@@ -18,13 +21,20 @@ var ResponseFormat;
18
21
  ResponseFormat["MARKDOWN"] = "markdown";
19
22
  ResponseFormat["JSON"] = "json";
20
23
  })(ResponseFormat || (ResponseFormat = {}));
21
- // ─── API client ───────────────────────────────────────────────────────────────
22
- function getApiKey() {
24
+ // ─── API key validation ───────────────────────────────────────────────────────
25
+ function requireApiKey() {
23
26
  const key = process.env.HOTSCOTS_API_KEY;
24
- if (!key)
25
- throw new Error("HOTSCOTS_API_KEY environment variable is not set.");
27
+ if (!key) {
28
+ console.error("\n❌ HOTSCOTS_API_KEY is not set.\n" +
29
+ " Add it to the env block in your MCP client config and restart.\n" +
30
+ " Get your key at: https://hotscots.app/subscription/dashboard\n");
31
+ process.exit(1);
32
+ }
26
33
  return key;
27
34
  }
35
+ // Validate key once at startup — fail fast before Claude even connects.
36
+ const API_KEY = requireApiKey();
37
+ // ─── API client ───────────────────────────────────────────────────────────────
28
38
  async function apiGet(path, params) {
29
39
  const url = new URL(`${API_BASE_URL}${path}`);
30
40
  if (params) {
@@ -33,22 +43,28 @@ async function apiGet(path, params) {
33
43
  url.searchParams.set(k, String(v));
34
44
  }
35
45
  }
36
- const res = await fetch(url.toString(), {
37
- headers: {
38
- Authorization: `Bearer ${getApiKey()}`,
39
- Accept: "application/json",
40
- },
41
- signal: AbortSignal.timeout(30_000),
42
- });
46
+ let res;
47
+ try {
48
+ res = await fetch(url.toString(), {
49
+ headers: {
50
+ Authorization: `Bearer ${API_KEY}`,
51
+ Accept: "application/json",
52
+ },
53
+ signal: AbortSignal.timeout(30_000),
54
+ });
55
+ }
56
+ catch (err) {
57
+ const msg = err instanceof Error ? err.message : String(err);
58
+ throw new Error(`Network error: ${msg}. Check your connection and try again.`);
59
+ }
43
60
  if (!res.ok) {
44
- let message = `API error ${res.status}`;
45
- try {
46
- const body = (await res.json());
47
- if (body.error)
48
- message = body.error;
61
+ // Map status codes to user-friendly messages; don't leak raw API internals.
62
+ switch (res.status) {
63
+ case 401: throw new Error("Invalid or expired API key. Check your HOTSCOTS_API_KEY.");
64
+ case 403: throw new Error("Your plan does not have access to this data. Check your subscription tier.");
65
+ case 429: throw new Error("Monthly request quota exceeded. Upgrade your plan or wait for the next billing cycle.");
66
+ default: throw new Error(`The Hots&Cots API returned an error (${res.status}). Please try again shortly.`);
49
67
  }
50
- catch { /* ignore */ }
51
- throw new Error(message);
52
68
  }
53
69
  return res.json();
54
70
  }
@@ -59,7 +75,7 @@ function truncate(text) {
59
75
  if (text.length <= CHARACTER_LIMIT)
60
76
  return text;
61
77
  return (text.slice(0, CHARACTER_LIMIT) +
62
- "\n\n[Response truncated — use a higher offset or tighter filters to page through results.]");
78
+ "\n\n[Response truncated — lower the limit or increase the offset to page through results.]");
63
79
  }
64
80
  // ─── Shared schemas ───────────────────────────────────────────────────────────
65
81
  const PaginationSchema = {
@@ -67,15 +83,15 @@ const PaginationSchema = {
67
83
  .number()
68
84
  .int()
69
85
  .min(1)
70
- .max(1000)
71
- .default(50)
72
- .describe("Records per page (1–1000, default 50)"),
86
+ .max(100)
87
+ .default(20)
88
+ .describe("Records per page, 1–100 (default 20). Keep low to stay within your monthly quota."),
73
89
  offset: z
74
90
  .number()
75
91
  .int()
76
92
  .min(0)
77
93
  .default(0)
78
- .describe("Records to skip for pagination (default 0)"),
94
+ .describe("Records to skip for pagination (default 0)."),
79
95
  };
80
96
  const ResponseFormatSchema = z
81
97
  .nativeEnum(ResponseFormat)
@@ -86,12 +102,25 @@ function starsFor(rating) {
86
102
  const r = Math.round(rating);
87
103
  return "★".repeat(r) + "☆".repeat(Math.max(0, 5 - r));
88
104
  }
89
- function formatReviews(data, endpointLabel, pagination) {
105
+ // Strip internal fields that should never appear in user-facing output.
106
+ function sanitizeReview(r) {
107
+ const { review_id: _omit, ...rest } = r;
108
+ return rest;
109
+ }
110
+ function formatReviews(data, endpointLabel, pagination, filtered) {
90
111
  const lines = [
91
112
  `# Hots&Cots — ${endpointLabel} Reviews`,
92
- `_Showing ${pagination.returned} records (offset ${pagination.offset}, limit ${pagination.limit})_`,
93
- "",
94
113
  ];
114
+ if (filtered) {
115
+ lines.push(`_Filtered to "${filtered.installation}" — found ${data.length} match(es) in the first ${filtered.fetchedTotal} records fetched._`);
116
+ if (filtered.fetchedTotal >= FILTER_FETCH_CAP && data.length === pagination.limit) {
117
+ lines.push(`_⚠️ Results are capped at ${FILTER_FETCH_CAP} fetched records. There may be more reviews not shown._`);
118
+ }
119
+ }
120
+ else {
121
+ lines.push(`_Showing ${pagination.returned} records (offset ${pagination.offset}, limit ${pagination.limit})_`);
122
+ }
123
+ lines.push("");
95
124
  for (const r of data) {
96
125
  lines.push(`## ${starsFor(r.rating)} ${r.title}`);
97
126
  lines.push(`**Installation**: ${r.installation}`);
@@ -108,7 +137,7 @@ function formatReviews(data, endpointLabel, pagination) {
108
137
  lines.push("---");
109
138
  lines.push("");
110
139
  }
111
- if (pagination.returned === pagination.limit) {
140
+ if (!filtered && pagination.returned === pagination.limit) {
112
141
  lines.push(`_More results available — use offset=${pagination.offset + pagination.limit} to continue._`);
113
142
  }
114
143
  return lines.join("\n");
@@ -126,6 +155,36 @@ function formatInstallations(data) {
126
155
  }
127
156
  return lines.join("\n");
128
157
  }
158
+ // ─── Shared review fetcher ────────────────────────────────────────────────────
159
+ async function fetchReviews(endpoint, params) {
160
+ if (params.installation) {
161
+ // No server-side installation filter exists — we must fetch and filter locally.
162
+ // Cap how many records we pull to protect the user's monthly quota.
163
+ const result = await apiGet("/reviews", {
164
+ endpoint,
165
+ limit: FILTER_FETCH_CAP,
166
+ offset: 0,
167
+ });
168
+ const q = params.installation.toLowerCase();
169
+ const matched = result.data.filter((r) => r.installation.toLowerCase().includes(q));
170
+ const page = matched.slice(params.offset, params.offset + params.limit);
171
+ return {
172
+ data: page,
173
+ pagination: { limit: params.limit, offset: params.offset, returned: page.length },
174
+ filtered: { installation: params.installation, fetchedTotal: result.data.length },
175
+ };
176
+ }
177
+ // No filter — use API pagination directly.
178
+ const result = await apiGet("/reviews", {
179
+ endpoint,
180
+ limit: params.limit,
181
+ offset: params.offset,
182
+ });
183
+ return {
184
+ data: result.data,
185
+ pagination: result.pagination,
186
+ };
187
+ }
129
188
  // ─── MCP Server ───────────────────────────────────────────────────────────────
130
189
  const server = new McpServer({
131
190
  name: "Hots&Cots",
@@ -134,10 +193,10 @@ const server = new McpServer({
134
193
  // ── Tool: health check ────────────────────────────────────────────────────────
135
194
  server.registerTool("hotscots_health", {
136
195
  title: "API Health Check",
137
- description: `Verify that your Hots&Cots API key is valid and the service is reachable.
196
+ description: `Verify that the Hots&Cots API key is valid and the service is reachable.
138
197
 
139
- Returns { success, status, timestamp } on success.
140
- Use this to diagnose connectivity or authentication problems before running other tools.`,
198
+ Returns status and timestamp on success.
199
+ Use this to confirm connectivity before running other tools.`,
141
200
  inputSchema: z.object({}),
142
201
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
143
202
  }, async () => {
@@ -154,19 +213,19 @@ Use this to diagnose connectivity or authentication problems before running othe
154
213
  // ── Tool: list installations ──────────────────────────────────────────────────
155
214
  server.registerTool("hotscots_list_installations", {
156
215
  title: "List Military Installations",
157
- description: `List every military installation that has at least one review in the Hots&Cots database, with a breakdown of review counts by type.
216
+ description: `List every military installation that has at least one review in the Hots&Cots database, with a count breakdown by review type. Costs 1 API request.
158
217
 
159
- Returns:
160
- - installation: name including state, e.g. "Fort Liberty, North Carolina"
161
- - counts.cots: number of barracks reviews
162
- - counts.hots: number of dining (DFAC) reviews
163
- - counts.other: number of other facility reviews
218
+ Returns per installation:
219
+ - installation: full name including state, e.g. "Fort Liberty, North Carolina"
220
+ - counts.cots: barracks review count
221
+ - counts.hots: dining (DFAC) review count
222
+ - counts.other: other facility review count
164
223
  - counts.total: combined total
165
224
 
166
- Use this to discover valid installation names before fetching reviews. Results are sorted by total review count (most-reviewed first).
225
+ Use this first to get exact installation names before fetching reviews.
167
226
 
168
227
  Args:
169
- - filter (string, optional): Case-insensitive substring to narrow by installation name (e.g. "Texas", "Fort", "Camp")
228
+ - filter (string, optional): Case-insensitive substring to narrow results (e.g. "Texas", "Fort", "Camp Lejeune")
170
229
  - response_format: 'markdown' (default) or 'json'`,
171
230
  inputSchema: z.object({
172
231
  filter: z
@@ -202,22 +261,22 @@ Args:
202
261
  // ── Tool: barracks (cots) reviews ─────────────────────────────────────────────
203
262
  server.registerTool("hotscots_get_barracks_reviews", {
204
263
  title: "Get Barracks Reviews",
205
- description: `Fetch paginated barracks / housing (Cots) reviews from the Hots&Cots database.
264
+ description: `Fetch barracks / housing (Cots) reviews from the Hots&Cots database. Costs 1 API request.
206
265
 
207
- Each review may include fields like: rating (1–5), feedback, tags, branch, mold_issues, pest_issues, working_air_heat, working_furniture, accessible_laundry, private_sleeping_area, lockable_doors, dpw_satisfaction_rating, is_privatized_barracks, and more.
266
+ ⚠️ Keep limit small (default 20). Users have a monthly request quota — avoid large or repeated fetches.
267
+ ⚠️ If installation is set, up to ${FILTER_FETCH_CAP} records are fetched and filtered locally. Pagination with an installation filter returns the first matching records from that pool.
208
268
 
209
- Args:
210
- - installation (string, optional): Filter to a specific installation name (partial match, case-insensitive). Use hotscots_list_installations to find exact names.
211
- - limit (integer): Records per page, 1–1000 (default 50)
212
- - offset (integer): Records to skip (default 0)
213
- - response_format: 'markdown' (default) or 'json'
269
+ Each review includes: rating (1–5), feedback, tags, branch, and barracks-specific fields such as mold_issues, pest_issues, working_air_heat, working_furniture, accessible_laundry, private_sleeping_area, lockable_doors, dpw_satisfaction_rating, is_privatized_barracks.
214
270
 
215
- Examples:
216
- - "Barracks reviews at Fort Liberty" → installation="Fort Liberty"
217
- - "Show mold complaints" → fetch reviews and look for mold_issues=true in the results`,
271
+ Args:
272
+ - installation (string, optional): Filter by installation name (partial match). Run hotscots_list_installations first to get exact names.
273
+ - limit (integer): Records per page, 1–100 (default 20)
274
+ - offset (integer): Records to skip (default 0). Only reliable without an installation filter.
275
+ - response_format: 'markdown' (default) or 'json'`,
218
276
  inputSchema: z.object({
219
277
  installation: z
220
278
  .string()
279
+ .max(100)
221
280
  .optional()
222
281
  .describe("Filter by installation name (partial, case-insensitive)"),
223
282
  ...PaginationSchema,
@@ -226,29 +285,17 @@ Examples:
226
285
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
227
286
  }, async (params) => {
228
287
  try {
229
- const result = await apiGet("/reviews", {
230
- endpoint: EndpointType.COTS,
231
- limit: params.installation ? 1000 : params.limit, // fetch more if we need to filter
232
- offset: params.installation ? 0 : params.offset,
233
- });
234
- let data = result.data;
235
- if (params.installation) {
236
- const q = params.installation.toLowerCase();
237
- data = data.filter((r) => r.installation.toLowerCase().includes(q));
238
- // apply limit/offset after filtering
239
- data = data.slice(params.offset, params.offset + params.limit);
240
- }
288
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.COTS, params);
241
289
  if (!data.length) {
242
290
  const where = params.installation ? ` for "${params.installation}"` : "";
243
291
  return { content: [{ type: "text", text: `No barracks reviews found${where}.` }] };
244
292
  }
245
- const pagination = { limit: params.limit, offset: params.offset, returned: data.length };
246
293
  const text = params.response_format === ResponseFormat.JSON
247
- ? JSON.stringify({ endpoint: "cots", data, pagination }, null, 2)
248
- : formatReviews(data, "Barracks (Cots)", pagination);
294
+ ? JSON.stringify({ endpoint: "cots", data: data.map(sanitizeReview), pagination }, null, 2)
295
+ : formatReviews(data, "Barracks (Cots)", pagination, filtered);
249
296
  return {
250
297
  content: [{ type: "text", text: truncate(text) }],
251
- structuredContent: { endpoint: "cots", data, pagination },
298
+ structuredContent: { endpoint: "cots", data: data.map(sanitizeReview), pagination },
252
299
  };
253
300
  }
254
301
  catch (err) {
@@ -258,22 +305,22 @@ Examples:
258
305
  // ── Tool: dining / DFAC (hots) reviews ───────────────────────────────────────
259
306
  server.registerTool("hotscots_get_dfac_reviews", {
260
307
  title: "Get DFAC / Dining Reviews",
261
- description: `Fetch paginated dining facility / DFAC (Hots) reviews from the Hots&Cots database.
308
+ description: `Fetch dining facility / DFAC (Hots) reviews from the Hots&Cots database. Costs 1 API request.
262
309
 
263
- Each review may include fields like: rating (1–5), feedback, tags, branch, dfac_name, breakfast_ranking, lunch_ranking, dinner_ranking, dfac_choices, dfac_healthy, dfac_filling, dfac_temp, dfac_police, has_shuttle, walking_distance, kiosk_level, inedible_food_issue, and more.
310
+ ⚠️ Keep limit small (default 20). Users have a monthly request quota — avoid large or repeated fetches.
311
+ ⚠️ If installation is set, up to ${FILTER_FETCH_CAP} records are fetched and filtered locally. Pagination with an installation filter returns the first matching records from that pool.
264
312
 
265
- Args:
266
- - installation (string, optional): Filter to a specific installation name (partial match, case-insensitive). Use hotscots_list_installations to find exact names.
267
- - limit (integer): Records per page, 1–1000 (default 50)
268
- - offset (integer): Records to skip (default 0)
269
- - response_format: 'markdown' (default) or 'json'
313
+ Each review includes: rating (1–5), feedback, tags, branch, dfac_name, and dining-specific fields such as breakfast_ranking, lunch_ranking, dinner_ranking, dfac_choices, dfac_healthy, dfac_filling, dfac_temp, dfac_police, has_shuttle, walking_distance, kiosk_level, inedible_food_issue.
270
314
 
271
- Examples:
272
- - "DFAC reviews at Camp Lejeune" → installation="Camp Lejeune"
273
- - "Which installations have the best chow?" → use hotscots_list_installations, then compare average ratings`,
315
+ Args:
316
+ - installation (string, optional): Filter by installation name (partial match). Run hotscots_list_installations first to get exact names.
317
+ - limit (integer): Records per page, 1–100 (default 20)
318
+ - offset (integer): Records to skip (default 0). Only reliable without an installation filter.
319
+ - response_format: 'markdown' (default) or 'json'`,
274
320
  inputSchema: z.object({
275
321
  installation: z
276
322
  .string()
323
+ .max(100)
277
324
  .optional()
278
325
  .describe("Filter by installation name (partial, case-insensitive)"),
279
326
  ...PaginationSchema,
@@ -282,28 +329,17 @@ Examples:
282
329
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
283
330
  }, async (params) => {
284
331
  try {
285
- const result = await apiGet("/reviews", {
286
- endpoint: EndpointType.HOTS,
287
- limit: params.installation ? 1000 : params.limit,
288
- offset: params.installation ? 0 : params.offset,
289
- });
290
- let data = result.data;
291
- if (params.installation) {
292
- const q = params.installation.toLowerCase();
293
- data = data.filter((r) => r.installation.toLowerCase().includes(q));
294
- data = data.slice(params.offset, params.offset + params.limit);
295
- }
332
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.HOTS, params);
296
333
  if (!data.length) {
297
334
  const where = params.installation ? ` for "${params.installation}"` : "";
298
335
  return { content: [{ type: "text", text: `No dining reviews found${where}.` }] };
299
336
  }
300
- const pagination = { limit: params.limit, offset: params.offset, returned: data.length };
301
337
  const text = params.response_format === ResponseFormat.JSON
302
- ? JSON.stringify({ endpoint: "hots", data, pagination }, null, 2)
303
- : formatReviews(data, "Dining / DFAC (Hots)", pagination);
338
+ ? JSON.stringify({ endpoint: "hots", data: data.map(sanitizeReview), pagination }, null, 2)
339
+ : formatReviews(data, "Dining / DFAC (Hots)", pagination, filtered);
304
340
  return {
305
341
  content: [{ type: "text", text: truncate(text) }],
306
- structuredContent: { endpoint: "hots", data, pagination },
342
+ structuredContent: { endpoint: "hots", data: data.map(sanitizeReview), pagination },
307
343
  };
308
344
  }
309
345
  catch (err) {
@@ -313,20 +349,22 @@ Examples:
313
349
  // ── Tool: other facilities ────────────────────────────────────────────────────
314
350
  server.registerTool("hotscots_get_other_reviews", {
315
351
  title: "Get Other Facility Reviews",
316
- description: `Fetch paginated reviews of other on-base facilities (not barracks or DFACs) from the Hots&Cots database.
352
+ description: `Fetch reviews of other on-base facilities from the Hots&Cots database. Costs 1 API request.
317
353
 
318
- Covers: Medical clinics, Child Development Centers (CDC), gyms, PX/BX, legal offices, lodging, and moving/transportation services. Use the facility_type field to distinguish between them.
354
+ ⚠️ Keep limit small (default 20). Users have a monthly request quota — avoid large or repeated fetches.
355
+ ⚠️ If installation is set, up to ${FILTER_FETCH_CAP} records are fetched and filtered locally.
319
356
 
320
- Each review may include: facility_type, rating, feedback, branch, recommend_facility, walking_distance, and facility-specific fields (e.g. doctor_wait_times for medical, curriculum_effect for CDC, mover_company for moving).
357
+ Covers: Medical clinics, Child Development Centers (CDC), gyms, PX/BX, legal offices, lodging, and moving/transportation services. Use the facility_type field to distinguish between them.
321
358
 
322
359
  Args:
323
- - installation (string, optional): Filter by installation name (partial, case-insensitive)
324
- - limit (integer): Records per page, 1–1000 (default 50)
325
- - offset (integer): Records to skip (default 0)
360
+ - installation (string, optional): Filter by installation name (partial match)
361
+ - limit (integer): Records per page, 1–100 (default 20)
362
+ - offset (integer): Records to skip (default 0). Only reliable without an installation filter.
326
363
  - response_format: 'markdown' (default) or 'json'`,
327
364
  inputSchema: z.object({
328
365
  installation: z
329
366
  .string()
367
+ .max(100)
330
368
  .optional()
331
369
  .describe("Filter by installation name (partial, case-insensitive)"),
332
370
  ...PaginationSchema,
@@ -335,28 +373,17 @@ Args:
335
373
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
336
374
  }, async (params) => {
337
375
  try {
338
- const result = await apiGet("/reviews", {
339
- endpoint: EndpointType.OTHER,
340
- limit: params.installation ? 1000 : params.limit,
341
- offset: params.installation ? 0 : params.offset,
342
- });
343
- let data = result.data;
344
- if (params.installation) {
345
- const q = params.installation.toLowerCase();
346
- data = data.filter((r) => r.installation.toLowerCase().includes(q));
347
- data = data.slice(params.offset, params.offset + params.limit);
348
- }
376
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.OTHER, params);
349
377
  if (!data.length) {
350
378
  const where = params.installation ? ` for "${params.installation}"` : "";
351
379
  return { content: [{ type: "text", text: `No other facility reviews found${where}.` }] };
352
380
  }
353
- const pagination = { limit: params.limit, offset: params.offset, returned: data.length };
354
381
  const text = params.response_format === ResponseFormat.JSON
355
- ? JSON.stringify({ endpoint: "other", data, pagination }, null, 2)
356
- : formatReviews(data, "Other Facilities", pagination);
382
+ ? JSON.stringify({ endpoint: "other", data: data.map(sanitizeReview), pagination }, null, 2)
383
+ : formatReviews(data, "Other Facilities", pagination, filtered);
357
384
  return {
358
385
  content: [{ type: "text", text: truncate(text) }],
359
- structuredContent: { endpoint: "other", data, pagination },
386
+ structuredContent: { endpoint: "other", data: data.map(sanitizeReview), pagination },
360
387
  };
361
388
  }
362
389
  catch (err) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotscots/mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Official Hots&Cots MCP server — barracks, DFAC, and facility reviews for U.S. military installations",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",