mcp-grampsweb 1.0.2 → 1.2.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.
Files changed (55) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/client.js +4 -0
  3. package/dist/client.js.map +1 -1
  4. package/dist/constants.d.ts +7 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +8 -0
  7. package/dist/constants.js.map +1 -1
  8. package/dist/index.js +28 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/prompts/index.d.ts +26 -0
  11. package/dist/prompts/index.d.ts.map +1 -0
  12. package/dist/prompts/index.js +310 -0
  13. package/dist/prompts/index.js.map +1 -0
  14. package/dist/schemas/common.d.ts +67 -4
  15. package/dist/schemas/common.d.ts.map +1 -1
  16. package/dist/schemas/common.js +13 -2
  17. package/dist/schemas/common.js.map +1 -1
  18. package/dist/schemas/entities.d.ts +154 -36
  19. package/dist/schemas/entities.d.ts.map +1 -1
  20. package/dist/tools/analysis.d.ts.map +1 -1
  21. package/dist/tools/analysis.js +134 -56
  22. package/dist/tools/analysis.js.map +1 -1
  23. package/dist/tools/convenience.d.ts +59 -0
  24. package/dist/tools/convenience.d.ts.map +1 -0
  25. package/dist/tools/convenience.js +131 -0
  26. package/dist/tools/convenience.js.map +1 -0
  27. package/dist/tools/create.d.ts +35 -0
  28. package/dist/tools/create.d.ts.map +1 -1
  29. package/dist/tools/create.js +216 -44
  30. package/dist/tools/create.js.map +1 -1
  31. package/dist/tools/index.d.ts +253 -1
  32. package/dist/tools/index.d.ts.map +1 -1
  33. package/dist/tools/index.js +7 -1
  34. package/dist/tools/index.js.map +1 -1
  35. package/dist/tools/list.d.ts +88 -0
  36. package/dist/tools/list.d.ts.map +1 -0
  37. package/dist/tools/list.js +222 -0
  38. package/dist/tools/list.js.map +1 -0
  39. package/dist/tools/search.d.ts.map +1 -1
  40. package/dist/tools/search.js +67 -24
  41. package/dist/tools/search.js.map +1 -1
  42. package/dist/tools/update.d.ts +662 -0
  43. package/dist/tools/update.d.ts.map +1 -0
  44. package/dist/tools/update.js +383 -0
  45. package/dist/tools/update.js.map +1 -0
  46. package/dist/types.d.ts +11 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/utils/formatting.d.ts.map +1 -1
  49. package/dist/utils/formatting.js +23 -2
  50. package/dist/utils/formatting.js.map +1 -1
  51. package/dist/utils/response.d.ts +34 -0
  52. package/dist/utils/response.d.ts.map +1 -0
  53. package/dist/utils/response.js +71 -0
  54. package/dist/utils/response.js.map +1 -0
  55. package/package.json +1 -1
@@ -4,7 +4,224 @@
4
4
  import { searchTools } from "./search.js";
5
5
  import { createTools } from "./create.js";
6
6
  import { analysisTools } from "./analysis.js";
7
+ import { listTools } from "./list.js";
8
+ import { updateTools } from "./update.js";
9
+ import { convenienceTools } from "./convenience.js";
7
10
  export declare const allTools: {
11
+ gramps_add_child_to_family: {
12
+ name: string;
13
+ description: string;
14
+ inputSchema: {
15
+ type: "object";
16
+ properties: {
17
+ family_handle: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ child_handle: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ frel: {
26
+ type: string;
27
+ enum: string[];
28
+ description: string;
29
+ default: string;
30
+ };
31
+ mrel: {
32
+ type: string;
33
+ enum: string[];
34
+ description: string;
35
+ default: string;
36
+ };
37
+ };
38
+ required: string[];
39
+ };
40
+ handler: typeof import("./convenience.js").grampsAddChildToFamily;
41
+ };
42
+ gramps_update_person: {
43
+ name: string;
44
+ description: string;
45
+ inputSchema: {
46
+ type: "object";
47
+ properties: {
48
+ handle: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ primary_name: {
53
+ type: string;
54
+ description: string;
55
+ properties: {
56
+ first_name: {
57
+ type: string;
58
+ };
59
+ surname: {
60
+ type: string;
61
+ };
62
+ call_name: {
63
+ type: string;
64
+ description: string;
65
+ };
66
+ suffix: {
67
+ type: string;
68
+ };
69
+ title: {
70
+ type: string;
71
+ };
72
+ };
73
+ };
74
+ gender: {
75
+ type: string;
76
+ enum: string[];
77
+ description: string;
78
+ };
79
+ add_event_ref: {
80
+ type: string;
81
+ description: string;
82
+ properties: {
83
+ ref: {
84
+ type: string;
85
+ description: string;
86
+ };
87
+ role: {
88
+ type: string;
89
+ description: string;
90
+ };
91
+ };
92
+ required: string[];
93
+ };
94
+ add_note: {
95
+ type: string;
96
+ description: string;
97
+ };
98
+ private: {
99
+ type: string;
100
+ description: string;
101
+ };
102
+ };
103
+ required: string[];
104
+ };
105
+ handler: typeof import("./update.js").grampsUpdatePerson;
106
+ };
107
+ gramps_update_family: {
108
+ name: string;
109
+ description: string;
110
+ inputSchema: {
111
+ type: "object";
112
+ properties: {
113
+ handle: {
114
+ type: string;
115
+ description: string;
116
+ };
117
+ father_handle: {
118
+ type: string[];
119
+ description: string;
120
+ };
121
+ mother_handle: {
122
+ type: string[];
123
+ description: string;
124
+ };
125
+ add_child: {
126
+ type: string;
127
+ description: string;
128
+ properties: {
129
+ ref: {
130
+ type: string;
131
+ description: string;
132
+ };
133
+ frel: {
134
+ type: string;
135
+ description: string;
136
+ };
137
+ mrel: {
138
+ type: string;
139
+ description: string;
140
+ };
141
+ };
142
+ required: string[];
143
+ };
144
+ remove_child: {
145
+ type: string;
146
+ description: string;
147
+ };
148
+ type: {
149
+ type: string;
150
+ description: string;
151
+ };
152
+ add_event_ref: {
153
+ type: string;
154
+ description: string;
155
+ properties: {
156
+ ref: {
157
+ type: string;
158
+ description: string;
159
+ };
160
+ role: {
161
+ type: string;
162
+ description: string;
163
+ };
164
+ };
165
+ required: string[];
166
+ };
167
+ private: {
168
+ type: string;
169
+ description: string;
170
+ };
171
+ };
172
+ required: string[];
173
+ };
174
+ handler: typeof import("./update.js").grampsUpdateFamily;
175
+ };
176
+ gramps_list: {
177
+ name: string;
178
+ description: string;
179
+ inputSchema: {
180
+ type: "object";
181
+ properties: {
182
+ entity_type: {
183
+ type: string;
184
+ enum: string[];
185
+ description: string;
186
+ };
187
+ page: {
188
+ type: string;
189
+ description: string;
190
+ default: number;
191
+ };
192
+ pagesize: {
193
+ type: string;
194
+ description: string;
195
+ default: number;
196
+ };
197
+ };
198
+ required: string[];
199
+ };
200
+ handler: typeof import("./list.js").grampsList;
201
+ };
202
+ gramps_get_batch: {
203
+ name: string;
204
+ description: string;
205
+ inputSchema: {
206
+ type: "object";
207
+ properties: {
208
+ entity_type: {
209
+ type: string;
210
+ enum: string[];
211
+ description: string;
212
+ };
213
+ handles: {
214
+ type: string;
215
+ items: {
216
+ type: string;
217
+ };
218
+ description: string;
219
+ };
220
+ };
221
+ required: string[];
222
+ };
223
+ handler: typeof import("./list.js").grampsGetBatch;
224
+ };
8
225
  gramps_tree_stats: {
9
226
  name: string;
10
227
  description: string;
@@ -93,8 +310,39 @@ export declare const allTools: {
93
310
  first_name: {
94
311
  type: string;
95
312
  };
313
+ call_name: {
314
+ type: string;
315
+ description: string;
316
+ };
96
317
  surname: {
97
318
  type: string;
319
+ description: string;
320
+ };
321
+ surname_list: {
322
+ type: string;
323
+ description: string;
324
+ items: {
325
+ type: string;
326
+ properties: {
327
+ surname: {
328
+ type: string;
329
+ description: string;
330
+ };
331
+ prefix: {
332
+ type: string;
333
+ description: string;
334
+ };
335
+ primary: {
336
+ type: string;
337
+ description: string;
338
+ };
339
+ origintype: {
340
+ type: string;
341
+ description: string;
342
+ };
343
+ };
344
+ required: string[];
345
+ };
98
346
  };
99
347
  suffix: {
100
348
  type: string;
@@ -102,6 +350,10 @@ export declare const allTools: {
102
350
  title: {
103
351
  type: string;
104
352
  };
353
+ type: {
354
+ type: string;
355
+ description: string;
356
+ };
105
357
  };
106
358
  };
107
359
  gender: {
@@ -464,5 +716,5 @@ export declare const allTools: {
464
716
  };
465
717
  };
466
718
  export declare const toolNames: string[];
467
- export { searchTools, createTools, analysisTools };
719
+ export { searchTools, createTools, analysisTools, listTools, updateTools, convenienceTools };
468
720
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIpB,CAAC;AAGF,eAAO,MAAM,SAAS,UAAwB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpB,CAAC;AAGF,eAAO,MAAM,SAAS,UAAwB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC"}
@@ -4,14 +4,20 @@
4
4
  import { searchTools } from "./search.js";
5
5
  import { createTools } from "./create.js";
6
6
  import { analysisTools } from "./analysis.js";
7
+ import { listTools } from "./list.js";
8
+ import { updateTools } from "./update.js";
9
+ import { convenienceTools } from "./convenience.js";
7
10
  // Combine all tools
8
11
  export const allTools = {
9
12
  ...searchTools,
10
13
  ...createTools,
11
14
  ...analysisTools,
15
+ ...listTools,
16
+ ...updateTools,
17
+ ...convenienceTools,
12
18
  };
13
19
  // Export tool names for registration
14
20
  export const toolNames = Object.keys(allTools);
15
21
  // Export individual tool groups
16
- export { searchTools, createTools, analysisTools };
22
+ export { searchTools, createTools, analysisTools, listTools, updateTools, convenienceTools };
17
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,oBAAoB;AACpB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,aAAa;CACjB,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE/C,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,oBAAoB;AACpB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,aAAa;IAChB,GAAG,SAAS;IACZ,GAAG,WAAW;IACd,GAAG,gBAAgB;CACpB,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE/C,gCAAgC;AAChC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * List and batch retrieval tools
3
+ */
4
+ import { z } from "zod";
5
+ declare const listSchema: z.ZodObject<{
6
+ entity_type: z.ZodEnum<["people", "families", "events", "places", "sources", "citations", "repositories", "media", "notes"]>;
7
+ page: z.ZodDefault<z.ZodNumber>;
8
+ pagesize: z.ZodDefault<z.ZodNumber>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ page: number;
11
+ pagesize: number;
12
+ entity_type: "people" | "families" | "events" | "places" | "sources" | "citations" | "repositories" | "media" | "notes";
13
+ }, {
14
+ entity_type: "people" | "families" | "events" | "places" | "sources" | "citations" | "repositories" | "media" | "notes";
15
+ page?: number | undefined;
16
+ pagesize?: number | undefined;
17
+ }>;
18
+ declare const batchSchema: z.ZodObject<{
19
+ entity_type: z.ZodEnum<["people", "families", "events", "places", "sources", "citations", "repositories", "media", "notes"]>;
20
+ handles: z.ZodArray<z.ZodString, "many">;
21
+ }, "strip", z.ZodTypeAny, {
22
+ entity_type: "people" | "families" | "events" | "places" | "sources" | "citations" | "repositories" | "media" | "notes";
23
+ handles: string[];
24
+ }, {
25
+ entity_type: "people" | "families" | "events" | "places" | "sources" | "citations" | "repositories" | "media" | "notes";
26
+ handles: string[];
27
+ }>;
28
+ /**
29
+ * List all entities of a given type with pagination
30
+ */
31
+ export declare function grampsList(params: z.infer<typeof listSchema>): Promise<string>;
32
+ /**
33
+ * Get multiple entities by handles in a single call
34
+ */
35
+ export declare function grampsGetBatch(params: z.infer<typeof batchSchema>): Promise<string>;
36
+ export declare const listTools: {
37
+ gramps_list: {
38
+ name: string;
39
+ description: string;
40
+ inputSchema: {
41
+ type: "object";
42
+ properties: {
43
+ entity_type: {
44
+ type: string;
45
+ enum: string[];
46
+ description: string;
47
+ };
48
+ page: {
49
+ type: string;
50
+ description: string;
51
+ default: number;
52
+ };
53
+ pagesize: {
54
+ type: string;
55
+ description: string;
56
+ default: number;
57
+ };
58
+ };
59
+ required: string[];
60
+ };
61
+ handler: typeof grampsList;
62
+ };
63
+ gramps_get_batch: {
64
+ name: string;
65
+ description: string;
66
+ inputSchema: {
67
+ type: "object";
68
+ properties: {
69
+ entity_type: {
70
+ type: string;
71
+ enum: string[];
72
+ description: string;
73
+ };
74
+ handles: {
75
+ type: string;
76
+ items: {
77
+ type: string;
78
+ };
79
+ description: string;
80
+ };
81
+ };
82
+ required: string[];
83
+ };
84
+ handler: typeof grampsGetBatch;
85
+ };
86
+ };
87
+ export {};
88
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,QAAA,MAAM,UAAU;;;;;;;;;;;;EAcd,CAAC;AAGH,QAAA,MAAM,WAAW;;;;;;;;;EAaf,CAAC;AA4DH;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDzF;AAGD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDrB,CAAC"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * List and batch retrieval tools
3
+ */
4
+ import { z } from "zod";
5
+ import { grampsClient } from "../client.js";
6
+ import { ENTITY_ENDPOINT_MAP } from "../constants.js";
7
+ import { formatEntityList, formatToolResponse } from "../utils/response.js";
8
+ import { formatPersonName } from "../utils/formatting.js";
9
+ // Schema for list operation
10
+ const listSchema = z.object({
11
+ entity_type: z.enum([
12
+ "people",
13
+ "families",
14
+ "events",
15
+ "places",
16
+ "sources",
17
+ "citations",
18
+ "repositories",
19
+ "media",
20
+ "notes",
21
+ ]).describe("Type of entity to list"),
22
+ page: z.number().int().positive().default(1).describe("Page number (1-indexed)"),
23
+ pagesize: z.number().int().positive().max(100).default(20).describe("Results per page (max 100)"),
24
+ });
25
+ // Schema for batch retrieval
26
+ const batchSchema = z.object({
27
+ entity_type: z.enum([
28
+ "people",
29
+ "families",
30
+ "events",
31
+ "places",
32
+ "sources",
33
+ "citations",
34
+ "repositories",
35
+ "media",
36
+ "notes",
37
+ ]).describe("Type of entities to retrieve"),
38
+ handles: z.array(z.string()).min(1).max(50).describe("List of entity handles (max 50)"),
39
+ });
40
+ /**
41
+ * Extract summary information from an entity based on its type
42
+ */
43
+ function extractEntitySummary(entity, entityType) {
44
+ const base = {
45
+ handle: entity.handle,
46
+ gramps_id: entity.gramps_id,
47
+ };
48
+ switch (entityType) {
49
+ case "people": {
50
+ const person = entity;
51
+ return {
52
+ ...base,
53
+ name: formatPersonName(person.primary_name),
54
+ gender: person.gender === 1 ? "male" : person.gender === 0 ? "female" : "unknown",
55
+ };
56
+ }
57
+ case "families": {
58
+ const family = entity;
59
+ return {
60
+ ...base,
61
+ father_handle: family.father_handle || null,
62
+ mother_handle: family.mother_handle || null,
63
+ children_count: family.child_ref_list?.length || 0,
64
+ type: family.type || "Unknown",
65
+ };
66
+ }
67
+ case "events": {
68
+ const event = entity;
69
+ return {
70
+ ...base,
71
+ type: event.type || "Unknown",
72
+ date: event.date?.text || (event.date?.dateval ? event.date.dateval.join("-") : null),
73
+ place_handle: event.place || null,
74
+ };
75
+ }
76
+ case "places": {
77
+ const place = entity;
78
+ return {
79
+ ...base,
80
+ name: place.name?.value || place.title || "Unknown",
81
+ type: place.place_type || null,
82
+ };
83
+ }
84
+ case "sources": {
85
+ const source = entity;
86
+ return {
87
+ ...base,
88
+ title: source.title || "Untitled",
89
+ author: source.author || null,
90
+ };
91
+ }
92
+ default:
93
+ return base;
94
+ }
95
+ }
96
+ /**
97
+ * List all entities of a given type with pagination
98
+ */
99
+ export async function grampsList(params) {
100
+ const { entity_type, page, pagesize } = listSchema.parse(params);
101
+ const endpoint = ENTITY_ENDPOINT_MAP[entity_type];
102
+ if (!endpoint) {
103
+ throw new Error(`Unknown entity type: ${entity_type}`);
104
+ }
105
+ const response = await grampsClient.get(endpoint, {
106
+ page,
107
+ pagesize,
108
+ });
109
+ if (!response || (Array.isArray(response) && response.length === 0)) {
110
+ return formatToolResponse({
111
+ status: "empty",
112
+ summary: `No ${entity_type} found in the database`,
113
+ details: `Use gramps_create_${entity_type.replace(/s$/, "")} to add new records.`,
114
+ });
115
+ }
116
+ const entities = Array.isArray(response) ? response : [response];
117
+ const formattedEntities = entities.map((entity) => extractEntitySummary(entity, entity_type));
118
+ return formatEntityList(entity_type, formattedEntities);
119
+ }
120
+ /**
121
+ * Get multiple entities by handles in a single call
122
+ */
123
+ export async function grampsGetBatch(params) {
124
+ const { entity_type, handles } = batchSchema.parse(params);
125
+ const endpoint = ENTITY_ENDPOINT_MAP[entity_type];
126
+ if (!endpoint) {
127
+ throw new Error(`Unknown entity type: ${entity_type}`);
128
+ }
129
+ // Fetch all entities in parallel
130
+ const fetchPromises = handles.map(async (handle) => {
131
+ try {
132
+ const entity = await grampsClient.get(`${endpoint}${handle}`);
133
+ return { handle, success: true, entity };
134
+ }
135
+ catch (error) {
136
+ return { handle, success: false, error: error instanceof Error ? error.message : String(error) };
137
+ }
138
+ });
139
+ const results = await Promise.all(fetchPromises);
140
+ const successful = results.filter((r) => r.success && r.entity);
141
+ const failed = results.filter((r) => !r.success);
142
+ if (successful.length === 0) {
143
+ return formatToolResponse({
144
+ status: "empty",
145
+ summary: `None of the ${handles.length} requested ${entity_type} were found`,
146
+ data: { failed: failed.map((f) => ({ handle: f.handle, error: f.error })) },
147
+ details: "Verify handles using gramps_find or gramps_list first.",
148
+ });
149
+ }
150
+ const data = {
151
+ count: successful.length,
152
+ results: successful.map((r) => r.entity),
153
+ };
154
+ if (failed.length > 0) {
155
+ data.failed = failed.map((f) => ({ handle: f.handle, error: f.error }));
156
+ }
157
+ return formatToolResponse({
158
+ status: "success",
159
+ summary: `Retrieved ${successful.length} of ${handles.length} ${entity_type}`,
160
+ data,
161
+ details: failed.length > 0
162
+ ? `${failed.length} handle(s) could not be found. See failed array for details.`
163
+ : undefined,
164
+ });
165
+ }
166
+ // Tool definitions for MCP
167
+ export const listTools = {
168
+ gramps_list: {
169
+ name: "gramps_list",
170
+ description: "List all entities of a given type with pagination. " +
171
+ "USE FOR: Getting all people, events, families, etc. when you need an overview. " +
172
+ "RETURNS: Array of entity summaries (handle, gramps_id, key identifier). " +
173
+ "NEXT STEP: Use gramps_get with handles for full details.",
174
+ inputSchema: {
175
+ type: "object",
176
+ properties: {
177
+ entity_type: {
178
+ type: "string",
179
+ enum: ["people", "families", "events", "places", "sources", "citations", "repositories", "media", "notes"],
180
+ description: "Type of entity to list",
181
+ },
182
+ page: {
183
+ type: "number",
184
+ description: "Page number (1-indexed, default 1)",
185
+ default: 1,
186
+ },
187
+ pagesize: {
188
+ type: "number",
189
+ description: "Results per page (max 100, default 20)",
190
+ default: 20,
191
+ },
192
+ },
193
+ required: ["entity_type"],
194
+ },
195
+ handler: grampsList,
196
+ },
197
+ gramps_get_batch: {
198
+ name: "gramps_get_batch",
199
+ description: "Retrieve multiple entities by their handles in a single call. " +
200
+ "USE FOR: Getting full details of several people/events at once, reducing API calls. " +
201
+ "REQUIRED: entity_type, handles array (max 50). " +
202
+ "RETURNS: Array of complete entity objects with any failures noted.",
203
+ inputSchema: {
204
+ type: "object",
205
+ properties: {
206
+ entity_type: {
207
+ type: "string",
208
+ enum: ["people", "families", "events", "places", "sources", "citations", "repositories", "media", "notes"],
209
+ description: "Type of entities to retrieve",
210
+ },
211
+ handles: {
212
+ type: "array",
213
+ items: { type: "string" },
214
+ description: "List of entity handles to retrieve (max 50)",
215
+ },
216
+ },
217
+ required: ["entity_type", "handles"],
218
+ },
219
+ handler: grampsGetBatch,
220
+ },
221
+ };
222
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAYjF;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBxF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBpF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBxF;AAGD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFvB,CAAC"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAajF;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCxF;AASD;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBpF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA0CxF;AAGD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FvB,CAAC"}