@hotscots/mcp 1.0.0 → 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
@@ -4,18 +4,38 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
4
4
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5
5
  import express from "express";
6
6
  import { z } from "zod";
7
- const API_BASE_URL = process.env.HOTSCOTS_API_URL ?? "https://api.hotscots.app/v1";
7
+ // ─── Config ──────────────────────────────────────────────────────────────────
8
+ const API_BASE_URL = process.env.HOTSCOTS_API_URL ?? "https://api.hotscots.app/functions/v1/api";
8
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;
13
+ var EndpointType;
14
+ (function (EndpointType) {
15
+ EndpointType["HOTS"] = "hots";
16
+ EndpointType["COTS"] = "cots";
17
+ EndpointType["OTHER"] = "other";
18
+ })(EndpointType || (EndpointType = {}));
9
19
  var ResponseFormat;
10
20
  (function (ResponseFormat) {
11
21
  ResponseFormat["MARKDOWN"] = "markdown";
12
22
  ResponseFormat["JSON"] = "json";
13
23
  })(ResponseFormat || (ResponseFormat = {}));
14
- // --- API client ---
15
- async function apiRequest(path, params) {
16
- const apiKey = process.env.HOTSCOTS_API_KEY;
17
- if (!apiKey)
18
- throw new Error("HOTSCOTS_API_KEY environment variable is not set");
24
+ // ─── API key validation ───────────────────────────────────────────────────────
25
+ function requireApiKey() {
26
+ const key = process.env.HOTSCOTS_API_KEY;
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
+ }
33
+ return key;
34
+ }
35
+ // Validate key once at startup — fail fast before Claude even connects.
36
+ const API_KEY = requireApiKey();
37
+ // ─── API client ───────────────────────────────────────────────────────────────
38
+ async function apiGet(path, params) {
19
39
  const url = new URL(`${API_BASE_URL}${path}`);
20
40
  if (params) {
21
41
  for (const [k, v] of Object.entries(params)) {
@@ -23,20 +43,27 @@ async function apiRequest(path, params) {
23
43
  url.searchParams.set(k, String(v));
24
44
  }
25
45
  }
26
- const res = await fetch(url.toString(), {
27
- headers: {
28
- Authorization: `Bearer ${apiKey}`,
29
- Accept: "application/json",
30
- },
31
- signal: AbortSignal.timeout(30_000),
32
- });
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
+ }
33
60
  if (!res.ok) {
61
+ // Map status codes to user-friendly messages; don't leak raw API internals.
34
62
  switch (res.status) {
35
- case 401: throw new Error("Unauthorized — check your HOTSCOTS_API_KEY.");
36
- case 403: throw new Error("Forbidden — you don't have access to this resource.");
37
- case 404: throw new Error("Not found — the requested resource does not exist.");
38
- case 429: throw new Error("Rate limit exceeded — please wait before retrying.");
39
- default: throw new Error(`API error ${res.status}: ${res.statusText}`);
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.`);
40
67
  }
41
68
  }
42
69
  return res.json();
@@ -47,293 +74,323 @@ function handleError(err) {
47
74
  function truncate(text) {
48
75
  if (text.length <= CHARACTER_LIMIT)
49
76
  return text;
50
- return text.slice(0, CHARACTER_LIMIT) + "\n\n[Response truncated. Use pagination to see more.]";
77
+ return (text.slice(0, CHARACTER_LIMIT) +
78
+ "\n\n[Response truncated — lower the limit or increase the offset to page through results.]");
51
79
  }
52
- // --- Zod schemas ---
53
- const PaginationSchema = z.object({
54
- limit: z.number().int().min(1).max(100).default(20).describe("Max results to return (1–100)"),
55
- offset: z.number().int().min(0).default(0).describe("Number of results to skip for pagination"),
56
- });
57
- const ResponseFormatSchema = z.nativeEnum(ResponseFormat)
80
+ // ─── Shared schemas ───────────────────────────────────────────────────────────
81
+ const PaginationSchema = {
82
+ limit: z
83
+ .number()
84
+ .int()
85
+ .min(1)
86
+ .max(100)
87
+ .default(20)
88
+ .describe("Records per page, 1–100 (default 20). Keep low to stay within your monthly quota."),
89
+ offset: z
90
+ .number()
91
+ .int()
92
+ .min(0)
93
+ .default(0)
94
+ .describe("Records to skip for pagination (default 0)."),
95
+ };
96
+ const ResponseFormatSchema = z
97
+ .nativeEnum(ResponseFormat)
58
98
  .default(ResponseFormat.MARKDOWN)
59
99
  .describe("Output format: 'markdown' for human-readable, 'json' for machine-readable");
60
- // --- MCP Server ---
100
+ // ─── Formatters ───────────────────────────────────────────────────────────────
101
+ function starsFor(rating) {
102
+ const r = Math.round(rating);
103
+ return "★".repeat(r) + "☆".repeat(Math.max(0, 5 - r));
104
+ }
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) {
111
+ const lines = [
112
+ `# Hots&Cots — ${endpointLabel} Reviews`,
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("");
124
+ for (const r of data) {
125
+ lines.push(`## ${starsFor(r.rating)} ${r.title}`);
126
+ lines.push(`**Installation**: ${r.installation}`);
127
+ if (r.branch)
128
+ lines.push(`**Branch**: ${r.branch}`);
129
+ lines.push(`**Date**: ${new Date(r.created_at).toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric" })}`);
130
+ if (r.tags?.length)
131
+ lines.push(`**Tags**: ${r.tags.join(", ")}`);
132
+ if (r.feedback) {
133
+ lines.push("");
134
+ lines.push(r.feedback);
135
+ }
136
+ lines.push("");
137
+ lines.push("---");
138
+ lines.push("");
139
+ }
140
+ if (!filtered && pagination.returned === pagination.limit) {
141
+ lines.push(`_More results available — use offset=${pagination.offset + pagination.limit} to continue._`);
142
+ }
143
+ return lines.join("\n");
144
+ }
145
+ function formatInstallations(data) {
146
+ const sorted = [...data].sort((a, b) => b.counts.total - a.counts.total);
147
+ const lines = [
148
+ `# Hots&Cots — Military Installations (${data.length} total)`,
149
+ "",
150
+ "| Installation | Barracks | Dining | Other | Total |",
151
+ "|---|---:|---:|---:|---:|",
152
+ ];
153
+ for (const inst of sorted) {
154
+ lines.push(`| ${inst.installation} | ${inst.counts.cots} | ${inst.counts.hots} | ${inst.counts.other} | **${inst.counts.total}** |`);
155
+ }
156
+ return lines.join("\n");
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
+ }
188
+ // ─── MCP Server ───────────────────────────────────────────────────────────────
61
189
  const server = new McpServer({
62
- name: "hotscots-mcp-server",
190
+ name: "Hots&Cots",
63
191
  version: "1.0.0",
64
192
  });
65
- // Tool: search installations
66
- server.registerTool("hotscots_search_installations", {
67
- title: "Search Military Installations",
68
- description: `Search for U.S. military installations (bases, posts, camps, forts, stations) in the Hots&Cots database.
193
+ // ── Tool: health check ────────────────────────────────────────────────────────
194
+ server.registerTool("hotscots_health", {
195
+ title: "API Health Check",
196
+ description: `Verify that the Hots&Cots API key is valid and the service is reachable.
69
197
 
70
- Args:
71
- - query (string): Name, abbreviation, or keyword (e.g., "Fort Liberty", "Bragg", "Camp Lejeune")
72
- - branch (string, optional): Filter by military branch — "Army", "Navy", "Air Force", "Marines", "Coast Guard", "Space Force"
73
- - state (string, optional): Two-letter US state abbreviation (e.g., "NC", "TX")
74
- - limit (number): Max results, 1–100 (default: 20)
75
- - offset (number): Pagination offset (default: 0)
76
- - response_format: 'markdown' or 'json'
77
-
78
- Returns:
79
- List of installations with id, name, branch, state, and city.
80
-
81
- Examples:
82
- - "Find Army bases in North Carolina" → query="", branch="Army", state="NC"
83
- - "Search for Camp Pendleton" → query="Camp Pendleton"`,
84
- inputSchema: z.object({
85
- query: z.string().max(200).default("").describe("Search keyword (name, abbreviation, or location)"),
86
- branch: z.string().optional().describe("Military branch filter"),
87
- state: z.string().length(2).optional().describe("US state abbreviation (e.g., NC)"),
88
- ...PaginationSchema.shape,
89
- response_format: ResponseFormatSchema,
90
- }),
198
+ Returns status and timestamp on success.
199
+ Use this to confirm connectivity before running other tools.`,
200
+ inputSchema: z.object({}),
91
201
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
92
- }, async (params) => {
202
+ }, async () => {
93
203
  try {
94
- const result = await apiRequest("/installations", {
95
- q: params.query || undefined,
96
- branch: params.branch,
97
- state: params.state,
98
- limit: params.limit,
99
- offset: params.offset,
100
- });
101
- if (!result.data.length) {
102
- return { content: [{ type: "text", text: "No installations found matching your search." }] };
103
- }
104
- let text;
105
- if (params.response_format === ResponseFormat.JSON) {
106
- text = JSON.stringify(result, null, 2);
107
- }
108
- else {
109
- const lines = [
110
- `# Military Installations (${result.total} total, showing ${result.data.length})`,
111
- "",
112
- ];
113
- for (const inst of result.data) {
114
- lines.push(`## ${inst.name} (\`${inst.id}\`)`);
115
- lines.push(`- **Branch**: ${inst.branch}`);
116
- lines.push(`- **Location**: ${[inst.city, inst.state, inst.country].filter(Boolean).join(", ")}`);
117
- lines.push("");
118
- }
119
- if (result.has_more)
120
- lines.push(`_Use offset=${result.next_offset} to see more._`);
121
- text = lines.join("\n");
122
- }
123
- return { content: [{ type: "text", text: truncate(text) }], structuredContent: result };
204
+ const result = await apiGet("/health");
205
+ return {
206
+ content: [{ type: "text", text: `✅ API is healthy\n- Status: ${result.status}\n- Time: ${result.timestamp}` }],
207
+ };
124
208
  }
125
209
  catch (err) {
126
210
  return { content: [{ type: "text", text: handleError(err) }] };
127
211
  }
128
212
  });
129
- // Tool: get installation
130
- server.registerTool("hotscots_get_installation", {
131
- title: "Get Installation Details",
132
- description: `Get detailed information about a specific military installation by its ID.
213
+ // ── Tool: list installations ──────────────────────────────────────────────────
214
+ server.registerTool("hotscots_list_installations", {
215
+ title: "List Military Installations",
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.
133
217
 
134
- Args:
135
- - installation_id (string): The installation ID from hotscots_search_installations
136
- - response_format: 'markdown' or 'json'
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
223
+ - counts.total: combined total
224
+
225
+ Use this first to get exact installation names before fetching reviews.
137
226
 
138
- Returns:
139
- Full installation record including name, branch, location, and review summary stats.`,
227
+ Args:
228
+ - filter (string, optional): Case-insensitive substring to narrow results (e.g. "Texas", "Fort", "Camp Lejeune")
229
+ - response_format: 'markdown' (default) or 'json'`,
140
230
  inputSchema: z.object({
141
- installation_id: z.string().min(1).describe("Installation ID (from search results)"),
231
+ filter: z
232
+ .string()
233
+ .optional()
234
+ .describe("Optional substring filter on installation name (case-insensitive)"),
142
235
  response_format: ResponseFormatSchema,
143
236
  }),
144
237
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
145
238
  }, async (params) => {
146
239
  try {
147
- const inst = await apiRequest(`/installations/${params.installation_id}`);
148
- let text;
149
- if (params.response_format === ResponseFormat.JSON) {
150
- text = JSON.stringify(inst, null, 2);
240
+ const result = await apiGet("/installations");
241
+ let data = result.data;
242
+ if (params.filter) {
243
+ const q = params.filter.toLowerCase();
244
+ data = data.filter((i) => i.installation.toLowerCase().includes(q));
151
245
  }
152
- else {
153
- text = [
154
- `# ${inst.name}`,
155
- `- **ID**: \`${inst.id}\``,
156
- `- **Branch**: ${inst.branch}`,
157
- `- **Location**: ${[inst.city, inst.state, inst.country].filter(Boolean).join(", ")}`,
158
- ].join("\n");
246
+ if (!data.length) {
247
+ return { content: [{ type: "text", text: `No installations found matching "${params.filter}".` }] };
159
248
  }
160
- return { content: [{ type: "text", text }], structuredContent: inst };
249
+ const text = params.response_format === ResponseFormat.JSON
250
+ ? JSON.stringify({ count: data.length, data }, null, 2)
251
+ : formatInstallations(data);
252
+ return {
253
+ content: [{ type: "text", text: truncate(text) }],
254
+ structuredContent: { count: data.length, data },
255
+ };
161
256
  }
162
257
  catch (err) {
163
258
  return { content: [{ type: "text", text: handleError(err) }] };
164
259
  }
165
260
  });
166
- // Tool: get barracks reviews
261
+ // ── Tool: barracks (cots) reviews ─────────────────────────────────────────────
167
262
  server.registerTool("hotscots_get_barracks_reviews", {
168
263
  title: "Get Barracks Reviews",
169
- description: `Fetch barracks (housing) reviews for a military installation.
264
+ description: `Fetch barracks / housing (Cots) reviews from the Hots&Cots database. Costs 1 API request.
170
265
 
171
- Args:
172
- - installation_id (string): Installation ID from hotscots_search_installations
173
- - building (string, optional): Filter by specific building or barracks name/number
174
- - min_rating (number, optional): Minimum star rating 1–5
175
- - limit (number): Max results, 1–100 (default: 20)
176
- - offset (number): Pagination offset (default: 0)
177
- - response_format: 'markdown' or 'json'
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.
178
268
 
179
- Returns:
180
- Paginated list of barracks reviews with ratings, descriptions, and dates.
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.
181
270
 
182
- Examples:
183
- - "Show me barracks reviews for Fort Liberty" → first get installation ID, then call with that ID
184
- - "Find highly rated barracks at Bragg" → min_rating=4`,
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'`,
185
276
  inputSchema: z.object({
186
- installation_id: z.string().min(1).describe("Installation ID"),
187
- building: z.string().optional().describe("Filter by building name or number"),
188
- min_rating: z.number().int().min(1).max(5).optional().describe("Minimum star rating (1–5)"),
189
- ...PaginationSchema.shape,
277
+ installation: z
278
+ .string()
279
+ .max(100)
280
+ .optional()
281
+ .describe("Filter by installation name (partial, case-insensitive)"),
282
+ ...PaginationSchema,
190
283
  response_format: ResponseFormatSchema,
191
284
  }),
192
285
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
193
286
  }, async (params) => {
194
287
  try {
195
- const result = await apiRequest(`/installations/${params.installation_id}/reviews`, {
196
- category: "barracks",
197
- building: params.building,
198
- min_rating: params.min_rating,
199
- limit: params.limit,
200
- offset: params.offset,
201
- });
202
- if (!result.data.length) {
203
- return { content: [{ type: "text", text: "No barracks reviews found for this installation." }] };
288
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.COTS, params);
289
+ if (!data.length) {
290
+ const where = params.installation ? ` for "${params.installation}"` : "";
291
+ return { content: [{ type: "text", text: `No barracks reviews found${where}.` }] };
204
292
  }
205
293
  const text = params.response_format === ResponseFormat.JSON
206
- ? JSON.stringify(result, null, 2)
207
- : formatReviews(result, "Barracks");
208
- return { content: [{ type: "text", text: truncate(text) }], structuredContent: result };
294
+ ? JSON.stringify({ endpoint: "cots", data: data.map(sanitizeReview), pagination }, null, 2)
295
+ : formatReviews(data, "Barracks (Cots)", pagination, filtered);
296
+ return {
297
+ content: [{ type: "text", text: truncate(text) }],
298
+ structuredContent: { endpoint: "cots", data: data.map(sanitizeReview), pagination },
299
+ };
209
300
  }
210
301
  catch (err) {
211
302
  return { content: [{ type: "text", text: handleError(err) }] };
212
303
  }
213
304
  });
214
- // Tool: get DFAC reviews
305
+ // ── Tool: dining / DFAC (hots) reviews ───────────────────────────────────────
215
306
  server.registerTool("hotscots_get_dfac_reviews", {
216
- title: "Get DFAC Reviews",
217
- description: `Fetch DFAC (dining facility) reviews for a military installation.
307
+ title: "Get DFAC / Dining Reviews",
308
+ description: `Fetch dining facility / DFAC (Hots) reviews from the Hots&Cots database. Costs 1 API request.
218
309
 
219
- Args:
220
- - installation_id (string): Installation ID from hotscots_search_installations
221
- - building (string, optional): Filter by specific DFAC name or building
222
- - min_rating (number, optional): Minimum star rating 1–5
223
- - limit (number): Max results, 1–100 (default: 20)
224
- - offset (number): Pagination offset (default: 0)
225
- - response_format: 'markdown' or 'json'
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.
226
312
 
227
- Returns:
228
- Paginated list of DFAC reviews with ratings, descriptions, and dates.
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.
229
314
 
230
- Examples:
231
- - "What do soldiers think of the chow hall at Camp Lejeune?" → get installation ID, then call this tool
232
- - "Find DFACs rated above 3 stars at Fort Campbell" → min_rating=4`,
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'`,
233
320
  inputSchema: z.object({
234
- installation_id: z.string().min(1).describe("Installation ID"),
235
- building: z.string().optional().describe("Filter by DFAC name or building"),
236
- min_rating: z.number().int().min(1).max(5).optional().describe("Minimum star rating (1–5)"),
237
- ...PaginationSchema.shape,
321
+ installation: z
322
+ .string()
323
+ .max(100)
324
+ .optional()
325
+ .describe("Filter by installation name (partial, case-insensitive)"),
326
+ ...PaginationSchema,
238
327
  response_format: ResponseFormatSchema,
239
328
  }),
240
329
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
241
330
  }, async (params) => {
242
331
  try {
243
- const result = await apiRequest(`/installations/${params.installation_id}/reviews`, {
244
- category: "dfac",
245
- building: params.building,
246
- min_rating: params.min_rating,
247
- limit: params.limit,
248
- offset: params.offset,
249
- });
250
- if (!result.data.length) {
251
- return { content: [{ type: "text", text: "No DFAC reviews found for this installation." }] };
332
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.HOTS, params);
333
+ if (!data.length) {
334
+ const where = params.installation ? ` for "${params.installation}"` : "";
335
+ return { content: [{ type: "text", text: `No dining reviews found${where}.` }] };
252
336
  }
253
337
  const text = params.response_format === ResponseFormat.JSON
254
- ? JSON.stringify(result, null, 2)
255
- : formatReviews(result, "DFAC");
256
- return { content: [{ type: "text", text: truncate(text) }], structuredContent: result };
338
+ ? JSON.stringify({ endpoint: "hots", data: data.map(sanitizeReview), pagination }, null, 2)
339
+ : formatReviews(data, "Dining / DFAC (Hots)", pagination, filtered);
340
+ return {
341
+ content: [{ type: "text", text: truncate(text) }],
342
+ structuredContent: { endpoint: "hots", data: data.map(sanitizeReview), pagination },
343
+ };
257
344
  }
258
345
  catch (err) {
259
346
  return { content: [{ type: "text", text: handleError(err) }] };
260
347
  }
261
348
  });
262
- // Tool: search reviews across installations
263
- server.registerTool("hotscots_search_reviews", {
264
- title: "Search Reviews",
265
- description: `Full-text search across all Hots&Cots reviews (barracks and DFAC) by keyword.
349
+ // ── Tool: other facilities ────────────────────────────────────────────────────
350
+ server.registerTool("hotscots_get_other_reviews", {
351
+ title: "Get Other Facility Reviews",
352
+ description: `Fetch reviews of other on-base facilities from the Hots&Cots database. Costs 1 API request.
266
353
 
267
- Args:
268
- - query (string): Keyword or phrase to search in review titles and body text
269
- - category (string, optional): Filter to 'barracks' or 'dfac' reviews only
270
- - installation_id (string, optional): Scope search to a specific installation
271
- - min_rating (number, optional): Minimum star rating 1–5
272
- - limit (number): Max results, 1–100 (default: 20)
273
- - offset (number): Pagination offset (default: 0)
274
- - response_format: 'markdown' or 'json'
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.
275
356
 
276
- Returns:
277
- Paginated list of matching reviews with installation context.
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.
278
358
 
279
- Examples:
280
- - "Find reviews mentioning mold" → query="mold"
281
- - "Search for DFAC reviews about pizza" → query="pizza", category="dfac"`,
359
+ Args:
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.
363
+ - response_format: 'markdown' (default) or 'json'`,
282
364
  inputSchema: z.object({
283
- query: z.string().min(2).max(200).describe("Search keyword or phrase"),
284
- category: z.enum(["barracks", "dfac"]).optional().describe("Limit to barracks or dfac reviews"),
285
- installation_id: z.string().optional().describe("Scope to a specific installation"),
286
- min_rating: z.number().int().min(1).max(5).optional().describe("Minimum star rating (1–5)"),
287
- ...PaginationSchema.shape,
365
+ installation: z
366
+ .string()
367
+ .max(100)
368
+ .optional()
369
+ .describe("Filter by installation name (partial, case-insensitive)"),
370
+ ...PaginationSchema,
288
371
  response_format: ResponseFormatSchema,
289
372
  }),
290
373
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
291
374
  }, async (params) => {
292
375
  try {
293
- const result = await apiRequest("/reviews/search", {
294
- q: params.query,
295
- category: params.category,
296
- installation_id: params.installation_id,
297
- min_rating: params.min_rating,
298
- limit: params.limit,
299
- offset: params.offset,
300
- });
301
- if (!result.data.length) {
302
- return { content: [{ type: "text", text: `No reviews found for "${params.query}".` }] };
376
+ const { data, pagination, filtered } = await fetchReviews(EndpointType.OTHER, params);
377
+ if (!data.length) {
378
+ const where = params.installation ? ` for "${params.installation}"` : "";
379
+ return { content: [{ type: "text", text: `No other facility reviews found${where}.` }] };
303
380
  }
304
381
  const text = params.response_format === ResponseFormat.JSON
305
- ? JSON.stringify(result, null, 2)
306
- : formatReviews(result, "Search Results");
307
- return { content: [{ type: "text", text: truncate(text) }], structuredContent: result };
382
+ ? JSON.stringify({ endpoint: "other", data: data.map(sanitizeReview), pagination }, null, 2)
383
+ : formatReviews(data, "Other Facilities", pagination, filtered);
384
+ return {
385
+ content: [{ type: "text", text: truncate(text) }],
386
+ structuredContent: { endpoint: "other", data: data.map(sanitizeReview), pagination },
387
+ };
308
388
  }
309
389
  catch (err) {
310
390
  return { content: [{ type: "text", text: handleError(err) }] };
311
391
  }
312
392
  });
313
- // --- Shared formatters ---
314
- function formatReviews(result, label) {
315
- const lines = [
316
- `# ${label} Reviews (${result.total} total, showing ${result.data.length})`,
317
- "",
318
- ];
319
- for (const r of result.data) {
320
- lines.push(`## ${"★".repeat(r.rating)}${"☆".repeat(5 - r.rating)} ${r.title ?? "(no title)"}`);
321
- if (r.building)
322
- lines.push(`**Building**: ${r.building}`);
323
- if (r.author_rank)
324
- lines.push(`**Reviewer rank**: ${r.author_rank}`);
325
- lines.push(`**Date**: ${new Date(r.created_at).toLocaleDateString()}`);
326
- lines.push("");
327
- lines.push(r.body);
328
- lines.push("");
329
- lines.push("---");
330
- lines.push("");
331
- }
332
- if (result.has_more)
333
- lines.push(`_Use offset=${result.next_offset} to see more._`);
334
- return lines.join("\n");
335
- }
336
- // --- Transport ---
393
+ // ─── Transport ────────────────────────────────────────────────────────────────
337
394
  async function runStdio() {
338
395
  const transport = new StdioServerTransport();
339
396
  await server.connect(transport);
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,7 +1,7 @@
1
1
  {
2
2
  "name": "@hotscots/mcp",
3
- "version": "1.0.0",
4
- "description": "MCP server for the Hots&Cots military QoL API — barracks and DFAC reviews for Claude Desktop, Cursor, and other MCP clients",
3
+ "version": "1.0.2",
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",
7
7
  "bin": {
@@ -50,4 +50,4 @@
50
50
  "@types/node": "^20.14.0",
51
51
  "typescript": "^5.4.5"
52
52
  }
53
- }
53
+ }