meguro-mcp 0.2.2 → 0.2.3

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/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to `meguro-mcp` are recorded here. Versions follow Semantic Versioning.
4
4
 
5
+ ## 0.2.3 — 2026-08-01
6
+
7
+ - Adds `templates_list`, a read-only closed-world projection of the ordered practice-store template
8
+ catalog, so customers can discover supported templates without duplicating registry data.
9
+ - Preserves only the documented public template fields and excludes profiles, scenario presets,
10
+ credentials, and private route payload from MCP responses.
11
+ - Pins Console connection guidance to the exact `meguro-mcp@0.2.3` artifact.
12
+
5
13
  ## 0.2.2 — 2026-08-01
6
14
 
7
15
  - Enforces each tool's declared top-level argument boundary before API transport, with bounded errors
package/README.md CHANGED
@@ -14,7 +14,7 @@ Dependency-free, no build step: the server is plain Node ≥ 20.
14
14
  Customer MCP clients run the exact public version directly from npm:
15
15
 
16
16
  ```bash
17
- npx -y meguro-mcp@0.2.2
17
+ npx -y meguro-mcp@0.2.3
18
18
  ```
19
19
 
20
20
  Pin the version in client configuration. A pinned quickstart stays reproducible and never changes its
@@ -32,11 +32,12 @@ Console provides fast trusted proof and evidence inspection; the agency agent no
32
32
 
33
33
  <!-- BEGIN GENERATED MCP TOOL TABLE -->
34
34
  <!-- Run `npm run docs:tools --workspace meguro-mcp` to refresh this section from `tools/list`. -->
35
- This table is generated from the server's live `tools/list` response (43 tools).
35
+ This table is generated from the server's live `tools/list` response (44 tools).
36
36
 
37
37
  | Tool | Title | Behavior annotations |
38
38
  |---|---|---|
39
39
  | `docs_read` | Read Meguro receipt and Gate documentation | read-only · non-destructive · idempotent · closed-world |
40
+ | `templates_list` | List practice-store templates | read-only · non-destructive · idempotent · closed-world |
40
41
  | `stores_list` | List practice stores | read-only · non-destructive · idempotent · closed-world |
41
42
  | `store_create` | Create a practice store | read-write · non-destructive · non-idempotent · closed-world |
42
43
  | `store_delete` | Delete a practice store | read-write · destructive · non-idempotent · closed-world |
@@ -161,7 +162,7 @@ claude mcp add meguro \
161
162
  -e MEGURO_API_BASE_URL=https://api-dev.meguro.io \
162
163
  -e MEGURO_API_TOKEN=meg_sk_... \
163
164
  -e MEGURO_DASHBOARD_URL=https://... \
164
- -- npx -y meguro-mcp@0.2.2
165
+ -- npx -y meguro-mcp@0.2.3
165
166
  ```
166
167
 
167
168
  ## Register — Cursor (`.cursor/mcp.json`)
@@ -171,7 +172,7 @@ claude mcp add meguro \
171
172
  "mcpServers": {
172
173
  "meguro": {
173
174
  "command": "npx",
174
- "args": ["-y", "meguro-mcp@0.2.2"],
175
+ "args": ["-y", "meguro-mcp@0.2.3"],
175
176
  "env": {
176
177
  "MEGURO_API_BASE_URL": "https://api-dev.meguro.io",
177
178
  "MEGURO_API_TOKEN": "meg_sk_...",
@@ -192,6 +193,6 @@ npm test --workspace meguro-mcp
192
193
  ```
193
194
 
194
195
  The test suite packs the public artifact, installs it into a temporary clean-room project, starts the
195
- installed binary, and requires `tools/list` to return exactly 43 tools without leaking supplied
196
+ installed binary, and requires `tools/list` to return exactly 44 tools without leaking supplied
196
197
  credentials to stdout or stderr. Maintainers should follow [RELEASING.md](./RELEASING.md) for every
197
198
  version; release notes are in [CHANGELOG.md](./CHANGELOG.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meguro-mcp",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Meguro control-plane MCP server: drive worlds, runs, and verdicts from your own AI tools.",
package/src/server.mjs CHANGED
@@ -7,7 +7,7 @@ import { createInterface } from 'node:readline';
7
7
  import { documentationResource, documentationResources } from './docs.mjs';
8
8
  import { createTools, redactSecrets } from './tools.mjs';
9
9
 
10
- const SERVER_INFO = { name: 'meguro', version: '0.2.2' };
10
+ const SERVER_INFO = { name: 'meguro', version: '0.2.3' };
11
11
  const PROTOCOL_VERSION = '2025-03-26';
12
12
 
13
13
  const tools = createTools({
package/src/tools.mjs CHANGED
@@ -17,13 +17,14 @@ const AUTH_TEACHING = Object.freeze({
17
17
  'workspace-api-key-revoked': 'This workspace API key is revoked. Create or replace it in Connection settings.',
18
18
  });
19
19
  const FLEET_TOOL_NAMES = new Set([
20
- 'stores_list', 'store_create', 'store_delete', 'store_passport',
20
+ 'templates_list', 'stores_list', 'store_create', 'store_delete', 'store_passport',
21
21
  'workspaces_list', 'workspace_create', 'workspace_archive', 'workspace_unarchive',
22
22
  'share_create', 'shares_list', 'share_status', 'share_publish', 'share_revoke',
23
23
  'catalog_slice_read', 'catalog_slice_snapshot', 'catalog_slices_saved',
24
24
  'store_claim_by_code', 'store_claim',
25
25
  ]);
26
26
  const TOOL_PRESENTATION = Object.freeze({
27
+ templates_list: { title: 'List practice-store templates', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
27
28
  stores_list: { title: 'List practice stores', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
28
29
  store_create: { title: 'Create a practice store', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
29
30
  store_delete: { title: 'Delete a practice store', readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
@@ -153,6 +154,47 @@ function catalogSnapshotProjection(value) {
153
154
  : safe;
154
155
  }
155
156
 
157
+ const STORE_TEMPLATE_FIELDS = Object.freeze([
158
+ 'key',
159
+ 'label',
160
+ 'category',
161
+ 'recommended',
162
+ 'bestFor',
163
+ 'agentTypes',
164
+ 'agentSees',
165
+ 'recommendedRunDays',
166
+ 'recommendedPaceMinutes',
167
+ 'recommendedStepDays',
168
+ 'eventWindowReason',
169
+ 'shortDebugDays',
170
+ 'extendedRunDays',
171
+ 'whatAgentGets',
172
+ 'supportedReads',
173
+ 'liveRun',
174
+ 'goodFirstAgents',
175
+ 'supportedWrites',
176
+ 'knownUnsupported',
177
+ 'goodAgentShould',
178
+ 'avoid',
179
+ 'reportGrades',
180
+ ]);
181
+
182
+ function storeTemplatesProjection(value) {
183
+ if (!Array.isArray(value?.storeTemplates)) {
184
+ throw new Error('Meguro template catalog response did not contain storeTemplates');
185
+ }
186
+ return {
187
+ storeTemplates: value.storeTemplates.map((template) => {
188
+ if (!template || typeof template !== 'object' || Array.isArray(template)) {
189
+ throw new Error('Meguro template catalog contained an invalid template entry');
190
+ }
191
+ return Object.fromEntries(STORE_TEMPLATE_FIELDS
192
+ .filter((field) => Object.hasOwn(template, field))
193
+ .map((field) => [field, secretSafe(template[field], 1)]));
194
+ }),
195
+ };
196
+ }
197
+
156
198
  function practiceErrorResult(status, value, retryAfterSeconds) {
157
199
  const authenticationError = authenticationErrorResult(status, value);
158
200
  if (authenticationError) return authenticationError;
@@ -1014,6 +1056,18 @@ export function createTools(config) {
1014
1056
  required: ['topic', 'version'],
1015
1057
  },
1016
1058
  },
1059
+ {
1060
+ name: 'templates_list',
1061
+ description: 'List the ordered, public-safe practice-store template catalog available for creating a store. The response is a bounded projection of storeTemplates only: it excludes customer profiles, scenario presets, credentials, and private route payload. An OAuth grant may select an owned non-default workspace; an API key remains bound to its own workspace.',
1062
+ inputSchema: {
1063
+ type: 'object',
1064
+ additionalProperties: false,
1065
+ properties: {
1066
+ workspaceId: { type: 'string', minLength: 1, description: 'Optional OAuth selector for an account-owned non-default workspace. A workspace API key may omit it or repeat only its own binding.' },
1067
+ },
1068
+ required: [],
1069
+ },
1070
+ },
1017
1071
  {
1018
1072
  name: 'stores_list',
1019
1073
  description: 'List one workspace\'s practice-store fleet with ids, names, templates, generated-history span, readiness, active-run state, and deletion context. An OAuth grant is account-bound: omit workspaceId for the default workspace or provide an owned non-default workspace id. An API key remains bound to its own workspace.',
@@ -1574,6 +1628,11 @@ export function createTools(config) {
1574
1628
  }
1575
1629
  return textResult(documentationByTopic(topic, args.version));
1576
1630
  }
1631
+ case 'templates_list': {
1632
+ const workspaceId = optionalWorkspaceId(args);
1633
+ const response = await fleetRequest(name, 'GET', '/practice/profiles', undefined, { workspaceId });
1634
+ return 'error' in response ? response.error : textResult(storeTemplatesProjection(response.value));
1635
+ }
1577
1636
  case 'stores_list': {
1578
1637
  const workspaceId = optionalWorkspaceId(args);
1579
1638
  const response = await fleetRequest(name, 'GET', '/practice/stores', undefined, { workspaceId });