mcp-grampsweb 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +133 -0
- package/dist/auth.d.ts +37 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +119 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +44 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +153 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +24 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +50 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +308 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +120 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/entities.d.ts +1165 -0
- package/dist/schemas/entities.d.ts.map +1 -0
- package/dist/schemas/entities.js +125 -0
- package/dist/schemas/entities.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/search.d.ts +47 -0
- package/dist/schemas/search.d.ts.map +1 -0
- package/dist/schemas/search.js +24 -0
- package/dist/schemas/search.js.map +1 -0
- package/dist/tools/analysis.d.ts +115 -0
- package/dist/tools/analysis.d.ts.map +1 -0
- package/dist/tools/analysis.js +387 -0
- package/dist/tools/analysis.js.map +1 -0
- package/dist/tools/create.d.ts +355 -0
- package/dist/tools/create.d.ts.map +1 -0
- package/dist/tools/create.js +547 -0
- package/dist/tools/create.js.map +1 -0
- package/dist/tools/index.d.ts +468 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +95 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +161 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/types.d.ts +210 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +19 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +60 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +256 -0
- package/dist/utils/formatting.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis tools for genealogy tree exploration
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { grampsClient } from "../client.js";
|
|
6
|
+
import { API_ENDPOINTS } from "../constants.js";
|
|
7
|
+
import { formatPersonName } from "../utils/formatting.js";
|
|
8
|
+
// Schema for ancestor/descendant queries
|
|
9
|
+
const lineageSchema = z.object({
|
|
10
|
+
handle: z.string().describe("Person handle to start from"),
|
|
11
|
+
generations: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.max(10)
|
|
16
|
+
.default(3)
|
|
17
|
+
.describe("Number of generations to retrieve (max 10)"),
|
|
18
|
+
});
|
|
19
|
+
// Schema for recent changes
|
|
20
|
+
const recentChangesSchema = z.object({
|
|
21
|
+
page: z.number().int().positive().default(1).describe("Page number"),
|
|
22
|
+
pagesize: z.number().int().positive().max(100).default(20).describe("Results per page"),
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Get tree statistics
|
|
26
|
+
*/
|
|
27
|
+
export async function grampsTreeStats() {
|
|
28
|
+
// Fetch counts for each entity type
|
|
29
|
+
const entityTypes = [
|
|
30
|
+
"people",
|
|
31
|
+
"families",
|
|
32
|
+
"events",
|
|
33
|
+
"places",
|
|
34
|
+
"sources",
|
|
35
|
+
"citations",
|
|
36
|
+
"repositories",
|
|
37
|
+
"media",
|
|
38
|
+
"notes",
|
|
39
|
+
];
|
|
40
|
+
const stats = {
|
|
41
|
+
people: 0,
|
|
42
|
+
families: 0,
|
|
43
|
+
events: 0,
|
|
44
|
+
places: 0,
|
|
45
|
+
sources: 0,
|
|
46
|
+
citations: 0,
|
|
47
|
+
repositories: 0,
|
|
48
|
+
media: 0,
|
|
49
|
+
notes: 0,
|
|
50
|
+
};
|
|
51
|
+
// Fetch metadata which includes counts
|
|
52
|
+
try {
|
|
53
|
+
const metadata = await grampsClient.get(API_ENDPOINTS.METADATA);
|
|
54
|
+
// Try to extract counts from metadata
|
|
55
|
+
for (const type of entityTypes) {
|
|
56
|
+
const countKey = `${type}_count`;
|
|
57
|
+
if (typeof metadata[countKey] === "number") {
|
|
58
|
+
stats[type] = metadata[countKey];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Fallback: fetch each entity type with pagesize=1 to get total count
|
|
64
|
+
for (const type of entityTypes) {
|
|
65
|
+
try {
|
|
66
|
+
const response = await grampsClient.get(API_ENDPOINTS[type.toUpperCase()] || `/${type}/`, { pagesize: 1 });
|
|
67
|
+
// The response might include total_count header or we count the array
|
|
68
|
+
if (Array.isArray(response)) {
|
|
69
|
+
// This is a rough estimate - actual count would need pagination
|
|
70
|
+
stats[type] = response.length;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Ignore errors for individual entity types
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const lines = [
|
|
79
|
+
"Family Tree Statistics:",
|
|
80
|
+
"",
|
|
81
|
+
` People: ${stats.people.toLocaleString()}`,
|
|
82
|
+
` Families: ${stats.families.toLocaleString()}`,
|
|
83
|
+
` Events: ${stats.events.toLocaleString()}`,
|
|
84
|
+
` Places: ${stats.places.toLocaleString()}`,
|
|
85
|
+
` Sources: ${stats.sources.toLocaleString()}`,
|
|
86
|
+
` Citations: ${stats.citations.toLocaleString()}`,
|
|
87
|
+
` Repositories: ${stats.repositories.toLocaleString()}`,
|
|
88
|
+
` Media: ${stats.media.toLocaleString()}`,
|
|
89
|
+
` Notes: ${stats.notes.toLocaleString()}`,
|
|
90
|
+
];
|
|
91
|
+
return lines.join("\n");
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get ancestors of a person
|
|
95
|
+
*/
|
|
96
|
+
export async function grampsGetAncestors(params) {
|
|
97
|
+
const { handle, generations } = lineageSchema.parse(params);
|
|
98
|
+
const ancestors = [];
|
|
99
|
+
// Queue for BFS traversal: [personHandle, generation, relationship]
|
|
100
|
+
const queue = [[handle, 0, "Self"]];
|
|
101
|
+
const visited = new Set();
|
|
102
|
+
while (queue.length > 0) {
|
|
103
|
+
const [currentHandle, gen, rel] = queue.shift();
|
|
104
|
+
if (visited.has(currentHandle) || gen > generations) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
visited.add(currentHandle);
|
|
108
|
+
try {
|
|
109
|
+
// Get person
|
|
110
|
+
const person = await grampsClient.get(`${API_ENDPOINTS.PEOPLE}${currentHandle}`);
|
|
111
|
+
ancestors.push({
|
|
112
|
+
generation: gen,
|
|
113
|
+
person,
|
|
114
|
+
relationship: rel,
|
|
115
|
+
});
|
|
116
|
+
// Get parent families
|
|
117
|
+
if (person.parent_family_list && gen < generations) {
|
|
118
|
+
for (const familyHandle of person.parent_family_list) {
|
|
119
|
+
try {
|
|
120
|
+
const family = await grampsClient.get(`${API_ENDPOINTS.FAMILIES}${familyHandle}`);
|
|
121
|
+
if (family.father_handle && !visited.has(family.father_handle)) {
|
|
122
|
+
const fatherRel = gen === 0
|
|
123
|
+
? "Father"
|
|
124
|
+
: gen === 1
|
|
125
|
+
? "Grandfather"
|
|
126
|
+
: `${gen + 1}x Great-Grandfather`;
|
|
127
|
+
queue.push([family.father_handle, gen + 1, fatherRel]);
|
|
128
|
+
}
|
|
129
|
+
if (family.mother_handle && !visited.has(family.mother_handle)) {
|
|
130
|
+
const motherRel = gen === 0
|
|
131
|
+
? "Mother"
|
|
132
|
+
: gen === 1
|
|
133
|
+
? "Grandmother"
|
|
134
|
+
: `${gen + 1}x Great-Grandmother`;
|
|
135
|
+
queue.push([family.mother_handle, gen + 1, motherRel]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Family not found, skip
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Person not found, skip
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Format output
|
|
149
|
+
if (ancestors.length === 0) {
|
|
150
|
+
return "No ancestors found.";
|
|
151
|
+
}
|
|
152
|
+
const lines = [`Found ${ancestors.length} ancestor(s) up to ${generations} generation(s):`, ""];
|
|
153
|
+
// Group by generation
|
|
154
|
+
const byGen = new Map();
|
|
155
|
+
for (const a of ancestors) {
|
|
156
|
+
if (!byGen.has(a.generation)) {
|
|
157
|
+
byGen.set(a.generation, []);
|
|
158
|
+
}
|
|
159
|
+
byGen.get(a.generation).push(a);
|
|
160
|
+
}
|
|
161
|
+
for (let g = 0; g <= generations; g++) {
|
|
162
|
+
const genAncestors = byGen.get(g);
|
|
163
|
+
if (genAncestors && genAncestors.length > 0) {
|
|
164
|
+
lines.push(`Generation ${g}:`);
|
|
165
|
+
for (const a of genAncestors) {
|
|
166
|
+
lines.push(` ${a.relationship}: ${formatPersonName(a.person.primary_name)} (${a.person.gramps_id})`);
|
|
167
|
+
}
|
|
168
|
+
lines.push("");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return lines.join("\n");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get descendants of a person
|
|
175
|
+
*/
|
|
176
|
+
export async function grampsGetDescendants(params) {
|
|
177
|
+
const { handle, generations } = lineageSchema.parse(params);
|
|
178
|
+
const descendants = [];
|
|
179
|
+
// Queue for BFS traversal
|
|
180
|
+
const queue = [[handle, 0, "Self"]];
|
|
181
|
+
const visited = new Set();
|
|
182
|
+
while (queue.length > 0) {
|
|
183
|
+
const [currentHandle, gen, rel] = queue.shift();
|
|
184
|
+
if (visited.has(currentHandle) || gen > generations) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
visited.add(currentHandle);
|
|
188
|
+
try {
|
|
189
|
+
// Get person
|
|
190
|
+
const person = await grampsClient.get(`${API_ENDPOINTS.PEOPLE}${currentHandle}`);
|
|
191
|
+
descendants.push({
|
|
192
|
+
generation: gen,
|
|
193
|
+
person,
|
|
194
|
+
relationship: rel,
|
|
195
|
+
});
|
|
196
|
+
// Get families where this person is a parent
|
|
197
|
+
if (person.family_list && gen < generations) {
|
|
198
|
+
for (const familyHandle of person.family_list) {
|
|
199
|
+
try {
|
|
200
|
+
const family = await grampsClient.get(`${API_ENDPOINTS.FAMILIES}${familyHandle}`);
|
|
201
|
+
if (family.child_ref_list) {
|
|
202
|
+
for (const childRef of family.child_ref_list) {
|
|
203
|
+
if (childRef.ref && !visited.has(childRef.ref)) {
|
|
204
|
+
const childRel = gen === 0
|
|
205
|
+
? "Child"
|
|
206
|
+
: gen === 1
|
|
207
|
+
? "Grandchild"
|
|
208
|
+
: `${gen + 1}x Great-Grandchild`;
|
|
209
|
+
queue.push([childRef.ref, gen + 1, childRel]);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Family not found, skip
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Person not found, skip
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Format output
|
|
225
|
+
if (descendants.length === 0) {
|
|
226
|
+
return "No descendants found.";
|
|
227
|
+
}
|
|
228
|
+
const lines = [
|
|
229
|
+
`Found ${descendants.length} descendant(s) up to ${generations} generation(s):`,
|
|
230
|
+
"",
|
|
231
|
+
];
|
|
232
|
+
// Group by generation
|
|
233
|
+
const byGen = new Map();
|
|
234
|
+
for (const d of descendants) {
|
|
235
|
+
if (!byGen.has(d.generation)) {
|
|
236
|
+
byGen.set(d.generation, []);
|
|
237
|
+
}
|
|
238
|
+
byGen.get(d.generation).push(d);
|
|
239
|
+
}
|
|
240
|
+
for (let g = 0; g <= generations; g++) {
|
|
241
|
+
const genDescendants = byGen.get(g);
|
|
242
|
+
if (genDescendants && genDescendants.length > 0) {
|
|
243
|
+
lines.push(`Generation ${g}:`);
|
|
244
|
+
for (const d of genDescendants) {
|
|
245
|
+
lines.push(` ${d.relationship}: ${formatPersonName(d.person.primary_name)} (${d.person.gramps_id})`);
|
|
246
|
+
}
|
|
247
|
+
lines.push("");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return lines.join("\n");
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get recent changes
|
|
254
|
+
*/
|
|
255
|
+
export async function grampsRecentChanges(params) {
|
|
256
|
+
const { page, pagesize } = recentChangesSchema.parse(params);
|
|
257
|
+
try {
|
|
258
|
+
const response = await grampsClient.get(API_ENDPOINTS.RECENT, {
|
|
259
|
+
page,
|
|
260
|
+
pagesize,
|
|
261
|
+
});
|
|
262
|
+
if (!response || response.length === 0) {
|
|
263
|
+
return "No recent changes found.";
|
|
264
|
+
}
|
|
265
|
+
const lines = [`Recent Changes (page ${page}):`, ""];
|
|
266
|
+
for (const change of response) {
|
|
267
|
+
const date = new Date(change.change * 1000);
|
|
268
|
+
const dateStr = date.toISOString().replace("T", " ").substring(0, 19);
|
|
269
|
+
lines.push(`[${dateStr}] ${change.object_type}: ${change.gramps_id}`);
|
|
270
|
+
}
|
|
271
|
+
return lines.join("\n");
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Fallback: try fetching from each entity type and sorting by change time
|
|
275
|
+
const allEntities = [];
|
|
276
|
+
const entityTypes = ["people", "families", "events", "places", "sources"];
|
|
277
|
+
for (const type of entityTypes) {
|
|
278
|
+
try {
|
|
279
|
+
const entities = await grampsClient.get(API_ENDPOINTS[type.toUpperCase()] || `/${type}/`, { pagesize: 10 });
|
|
280
|
+
for (const entity of entities) {
|
|
281
|
+
if (entity.change) {
|
|
282
|
+
allEntities.push({
|
|
283
|
+
type,
|
|
284
|
+
entity,
|
|
285
|
+
change: entity.change,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Ignore errors
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Sort by change time descending
|
|
295
|
+
allEntities.sort((a, b) => b.change - a.change);
|
|
296
|
+
const topEntities = allEntities.slice(0, pagesize);
|
|
297
|
+
if (topEntities.length === 0) {
|
|
298
|
+
return "No recent changes found.";
|
|
299
|
+
}
|
|
300
|
+
const lines = [`Recent Changes (page ${page}):`, ""];
|
|
301
|
+
for (const item of topEntities) {
|
|
302
|
+
const date = new Date(item.change * 1000);
|
|
303
|
+
const dateStr = date.toISOString().replace("T", " ").substring(0, 19);
|
|
304
|
+
lines.push(`[${dateStr}] ${item.type}: ${item.entity.gramps_id}`);
|
|
305
|
+
}
|
|
306
|
+
return lines.join("\n");
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Tool definitions for MCP
|
|
310
|
+
export const analysisTools = {
|
|
311
|
+
gramps_tree_stats: {
|
|
312
|
+
name: "gramps_tree_stats",
|
|
313
|
+
description: "Get statistics about the family tree including counts of people, " +
|
|
314
|
+
"families, events, places, sources, and other record types.",
|
|
315
|
+
inputSchema: {
|
|
316
|
+
type: "object",
|
|
317
|
+
properties: {},
|
|
318
|
+
required: [],
|
|
319
|
+
},
|
|
320
|
+
handler: grampsTreeStats,
|
|
321
|
+
},
|
|
322
|
+
gramps_get_ancestors: {
|
|
323
|
+
name: "gramps_get_ancestors",
|
|
324
|
+
description: "Find ancestors of a person going back a specified number of generations. " +
|
|
325
|
+
"Returns parents, grandparents, great-grandparents, etc.",
|
|
326
|
+
inputSchema: {
|
|
327
|
+
type: "object",
|
|
328
|
+
properties: {
|
|
329
|
+
handle: {
|
|
330
|
+
type: "string",
|
|
331
|
+
description: "Person handle to start from",
|
|
332
|
+
},
|
|
333
|
+
generations: {
|
|
334
|
+
type: "number",
|
|
335
|
+
description: "Number of generations to retrieve (max 10)",
|
|
336
|
+
default: 3,
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
required: ["handle"],
|
|
340
|
+
},
|
|
341
|
+
handler: grampsGetAncestors,
|
|
342
|
+
},
|
|
343
|
+
gramps_get_descendants: {
|
|
344
|
+
name: "gramps_get_descendants",
|
|
345
|
+
description: "Find descendants of a person going forward a specified number of generations. " +
|
|
346
|
+
"Returns children, grandchildren, great-grandchildren, etc.",
|
|
347
|
+
inputSchema: {
|
|
348
|
+
type: "object",
|
|
349
|
+
properties: {
|
|
350
|
+
handle: {
|
|
351
|
+
type: "string",
|
|
352
|
+
description: "Person handle to start from",
|
|
353
|
+
},
|
|
354
|
+
generations: {
|
|
355
|
+
type: "number",
|
|
356
|
+
description: "Number of generations to retrieve (max 10)",
|
|
357
|
+
default: 3,
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
required: ["handle"],
|
|
361
|
+
},
|
|
362
|
+
handler: grampsGetDescendants,
|
|
363
|
+
},
|
|
364
|
+
gramps_recent_changes: {
|
|
365
|
+
name: "gramps_recent_changes",
|
|
366
|
+
description: "Get recently modified records in the family tree. " +
|
|
367
|
+
"Useful for seeing what has been updated or added recently.",
|
|
368
|
+
inputSchema: {
|
|
369
|
+
type: "object",
|
|
370
|
+
properties: {
|
|
371
|
+
page: {
|
|
372
|
+
type: "number",
|
|
373
|
+
description: "Page number",
|
|
374
|
+
default: 1,
|
|
375
|
+
},
|
|
376
|
+
pagesize: {
|
|
377
|
+
type: "number",
|
|
378
|
+
description: "Results per page (max 100)",
|
|
379
|
+
default: 20,
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
required: [],
|
|
383
|
+
},
|
|
384
|
+
handler: grampsRecentChanges,
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"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"}
|