@ignfab/geocontext 0.9.0 → 0.9.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.
Files changed (62) hide show
  1. package/README.md +51 -22
  2. package/dist/gpf/adminexpress.d.ts +2 -1
  3. package/dist/gpf/adminexpress.js +7 -3
  4. package/dist/gpf/adminexpress.js.map +1 -1
  5. package/dist/gpf/altitude.d.ts +2 -1
  6. package/dist/gpf/altitude.js +13 -19
  7. package/dist/gpf/altitude.js.map +1 -1
  8. package/dist/gpf/geocode.d.ts +3 -1
  9. package/dist/gpf/geocode.js +19 -8
  10. package/dist/gpf/geocode.js.map +1 -1
  11. package/dist/gpf/parcellaire-express.d.ts +2 -1
  12. package/dist/gpf/parcellaire-express.js +8 -4
  13. package/dist/gpf/parcellaire-express.js.map +1 -1
  14. package/dist/gpf/urbanisme.d.ts +4 -2
  15. package/dist/gpf/urbanisme.js +32 -5
  16. package/dist/gpf/urbanisme.js.map +1 -1
  17. package/dist/gpf/wfs.d.ts +5 -3
  18. package/dist/gpf/wfs.js +59 -19
  19. package/dist/gpf/wfs.js.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/logger.js.map +1 -1
  23. package/dist/resources/WfsCqlFilterResource.d.ts +10 -0
  24. package/dist/resources/WfsCqlFilterResource.js +21 -0
  25. package/dist/resources/WfsCqlFilterResource.js.map +1 -0
  26. package/dist/resources/readMarkdownResource.d.ts +1 -0
  27. package/dist/resources/readMarkdownResource.js +21 -0
  28. package/dist/resources/readMarkdownResource.js.map +1 -0
  29. package/dist/tools/AdminexpressTool.d.ts +58 -15
  30. package/dist/tools/AdminexpressTool.js +33 -13
  31. package/dist/tools/AdminexpressTool.js.map +1 -1
  32. package/dist/tools/AltitudeTool.d.ts +64 -16
  33. package/dist/tools/AltitudeTool.js +30 -12
  34. package/dist/tools/AltitudeTool.js.map +1 -1
  35. package/dist/tools/AssietteSupTool.d.ts +64 -16
  36. package/dist/tools/AssietteSupTool.js +34 -13
  37. package/dist/tools/AssietteSupTool.js.map +1 -1
  38. package/dist/tools/CadastreTool.d.ts +68 -15
  39. package/dist/tools/CadastreTool.js +35 -13
  40. package/dist/tools/CadastreTool.js.map +1 -1
  41. package/dist/tools/GeocodeTool.d.ts +73 -10
  42. package/dist/tools/GeocodeTool.js +35 -9
  43. package/dist/tools/GeocodeTool.js.map +1 -1
  44. package/dist/tools/GpfWfsDescribeTypeTool.d.ts +115 -12
  45. package/dist/tools/GpfWfsDescribeTypeTool.js +39 -13
  46. package/dist/tools/GpfWfsDescribeTypeTool.js.map +1 -1
  47. package/dist/tools/GpfWfsGetFeaturesTool.d.ts +65 -28
  48. package/dist/tools/GpfWfsGetFeaturesTool.js +117 -47
  49. package/dist/tools/GpfWfsGetFeaturesTool.js.map +1 -1
  50. package/dist/tools/GpfWfsListTypesTool.d.ts +18 -6
  51. package/dist/tools/GpfWfsListTypesTool.js +16 -8
  52. package/dist/tools/GpfWfsListTypesTool.js.map +1 -1
  53. package/dist/tools/GpfWfsSearchTypesTool.d.ts +61 -14
  54. package/dist/tools/GpfWfsSearchTypesTool.js +38 -17
  55. package/dist/tools/GpfWfsSearchTypesTool.js.map +1 -1
  56. package/dist/tools/UrbanismeTool.d.ts +63 -15
  57. package/dist/tools/UrbanismeTool.js +42 -13
  58. package/dist/tools/UrbanismeTool.js.map +1 -1
  59. package/dist/tools/toolAnnotations.d.ts +6 -0
  60. package/dist/tools/toolAnnotations.js +7 -0
  61. package/dist/tools/toolAnnotations.js.map +1 -0
  62. package/package.json +5 -5
@@ -1,28 +1,54 @@
1
1
  import { MCPTool } from "mcp-framework";
2
2
  import { z } from "zod";
3
3
  import { wfsClient } from "../gpf/wfs.js";
4
+ import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from "./toolAnnotations.js";
5
+ const gpfWfsDescribeTypeInputSchema = z.object({
6
+ typename: z
7
+ .string()
8
+ .trim()
9
+ .min(1, "le nom du type ne doit pas être vide")
10
+ .describe("Le nom du type (ex : BDTOPO_V3:batiment)"),
11
+ });
12
+ const gpfWfsPropertySchema = z.object({
13
+ name: z.string().describe("Le nom de la propriété."),
14
+ type: z.string().describe("Le type de la propriété."),
15
+ title: z.string().describe("Le titre lisible de la propriété.").optional(),
16
+ description: z.string().describe("La description de la propriété.").optional(),
17
+ enum: z.array(z.string()).describe("Les valeurs possibles de la propriété.").optional(),
18
+ defaultCrs: z.string().describe("Le système de coordonnées par défaut si la propriété est géométrique.").optional(),
19
+ });
20
+ const gpfWfsDescribeTypeOutputSchema = z.object({
21
+ result: z.object({
22
+ id: z.string().describe("L'identifiant complet du type WFS."),
23
+ namespace: z.string().describe("L'espace de nommage du type WFS."),
24
+ name: z.string().describe("Le nom court du type WFS."),
25
+ title: z.string().describe("Le titre lisible du type WFS."),
26
+ description: z.string().describe("La description du type WFS."),
27
+ properties: z.array(gpfWfsPropertySchema).describe("La liste des propriétés du type WFS."),
28
+ }).describe("La description détaillée du type WFS."),
29
+ });
4
30
  class GpfWfsDescribeTypeTool extends MCPTool {
5
31
  name = "gpf_wfs_describe_type";
32
+ title = "Description d’un type WFS";
33
+ annotations = READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS;
6
34
  description = [
7
- "Renvoie la description détaillée d'un type WFS donné par son nom fourni par gpf_wfs_search_types.",
35
+ "Renvoie le schéma détaillé d'un type WFS à partir de son identifiant (`typename`) : identifiants, description et liste des propriétés.",
36
+ "Utiliser ce tool après `gpf_wfs_search_types` pour inspecter les propriétés disponibles avant d'appeler `gpf_wfs_get_features`.",
37
+ "La sortie inclut notamment le type des propriétés, leur description, et leurs valeurs possibles (`enum`) lorsqu'elles existent.",
8
38
  ].join("\r\n");
9
- schema = {
10
- typename: {
11
- type: z.string(),
12
- description: "Le nom du type (ex : BDTOPO_V3:batiment)",
13
- },
14
- };
39
+ outputSchemaShape = gpfWfsDescribeTypeOutputSchema;
40
+ schema = gpfWfsDescribeTypeInputSchema;
15
41
  async execute(input) {
16
42
  try {
17
- return await wfsClient.getFeatureType(input.typename);
18
- }
19
- catch (e) {
43
+ const featureType = await wfsClient.getFeatureType(input.typename);
20
44
  return {
21
- type: "error",
22
- message: e.message,
23
- help: `Utiliser gpf_get_feature_types pour trouver les types disponibles`
45
+ result: featureType,
24
46
  };
25
47
  }
48
+ catch (e) {
49
+ const message = e instanceof Error ? e.message : String(e);
50
+ throw new Error(`${message}. Utiliser gpf_wfs_search_types pour trouver un type valide.`);
51
+ }
26
52
  }
27
53
  }
28
54
  export default GpfWfsDescribeTypeTool;
@@ -1 +1 @@
1
- {"version":3,"file":"GpfWfsDescribeTypeTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsDescribeTypeTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM1C,MAAM,sBAAuB,SAAQ,OAAgC;IACnE,IAAI,GAAG,uBAAuB,CAAC;IAC/B,WAAW,GAAG;QACZ,mGAAmG;KACpG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,MAAM,GAAG;QACP,QAAQ,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,0CAA0C;SACxD;KACF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAA8B;QAC1C,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QAAA,OAAM,CAAC,EAAC,CAAC;YACR,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,mEAAmE;aAC1E,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"GpfWfsDescribeTypeTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsDescribeTypeTool.ts"],"names":[],"mappings":"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"}
@@ -1,40 +1,77 @@
1
1
  import { MCPTool } from "mcp-framework";
2
2
  import { z } from "zod";
3
- interface GpfWfsGetFeaturesInput {
4
- typename: string;
3
+ declare const gpfWfsGetFeaturesInputSchema: z.ZodObject<{
4
+ typename: z.ZodString;
5
+ property_names: z.ZodOptional<z.ZodString>;
6
+ sort_by: z.ZodOptional<z.ZodString>;
7
+ count: z.ZodOptional<z.ZodNumber>;
8
+ cql_filter: z.ZodOptional<z.ZodString>;
9
+ result_type: z.ZodOptional<z.ZodEnum<["results", "hits", "url"]>>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ cql_filter?: string;
12
+ typename?: string;
5
13
  property_names?: string;
6
- count?: number;
7
14
  sort_by?: string;
15
+ count?: number;
16
+ result_type?: "results" | "hits" | "url";
17
+ }, {
8
18
  cql_filter?: string;
9
- result_type?: 'results' | 'hits' | 'url';
10
- }
19
+ typename?: string;
20
+ property_names?: string;
21
+ sort_by?: string;
22
+ count?: number;
23
+ result_type?: "results" | "hits" | "url";
24
+ }>;
25
+ type GpfWfsGetFeaturesInput = z.infer<typeof gpfWfsGetFeaturesInputSchema>;
11
26
  declare class GpfWfsGetFeaturesTool extends MCPTool<GpfWfsGetFeaturesInput> {
12
27
  name: string;
28
+ title: string;
29
+ annotations: {
30
+ readonly readOnlyHint: true;
31
+ readonly destructiveHint: false;
32
+ readonly idempotentHint: true;
33
+ readonly openWorldHint: true;
34
+ };
13
35
  description: string;
14
- schema: {
15
- typename: {
16
- type: z.ZodString;
17
- description: string;
18
- };
19
- property_names: {
20
- type: z.ZodOptional<z.ZodString>;
21
- description: string;
22
- };
23
- sort_by: {
24
- type: z.ZodOptional<z.ZodString>;
25
- description: string;
26
- };
27
- count: {
28
- type: z.ZodOptional<z.ZodNumber>;
29
- description: string;
30
- };
31
- cql_filter: {
32
- type: z.ZodOptional<z.ZodString>;
33
- description: string;
36
+ schema: z.ZodObject<{
37
+ typename: z.ZodString;
38
+ property_names: z.ZodOptional<z.ZodString>;
39
+ sort_by: z.ZodOptional<z.ZodString>;
40
+ count: z.ZodOptional<z.ZodNumber>;
41
+ cql_filter: z.ZodOptional<z.ZodString>;
42
+ result_type: z.ZodOptional<z.ZodEnum<["results", "hits", "url"]>>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ cql_filter?: string;
45
+ typename?: string;
46
+ property_names?: string;
47
+ sort_by?: string;
48
+ count?: number;
49
+ result_type?: "results" | "hits" | "url";
50
+ }, {
51
+ cql_filter?: string;
52
+ typename?: string;
53
+ property_names?: string;
54
+ sort_by?: string;
55
+ count?: number;
56
+ result_type?: "results" | "hits" | "url";
57
+ }>;
58
+ protected createSuccessResponse(data: unknown): import("mcp-framework").ToolResponse | {
59
+ content: {
60
+ type: "text";
61
+ text: string;
62
+ }[];
63
+ structuredContent: {
64
+ result_type?: "hits";
65
+ totalFeatures?: number;
34
66
  };
35
- result_type: {
36
- type: z.ZodOptional<z.ZodEnum<["results", "hits", "url"]>>;
37
- description: string;
67
+ } | {
68
+ content: {
69
+ type: "text";
70
+ text: string;
71
+ }[];
72
+ structuredContent: {
73
+ url?: string;
74
+ result_type?: "url";
38
75
  };
39
76
  };
40
77
  execute(input: GpfWfsGetFeaturesInput): Promise<any>;
@@ -1,41 +1,111 @@
1
- import { logger, MCPTool } from "mcp-framework";
1
+ import { MCPTool } from "mcp-framework";
2
2
  import { z } from "zod";
3
3
  import { GPF_WFS_URL } from "../gpf/wfs.js";
4
4
  import { fetchJSON } from "../helpers/http.js";
5
+ import logger from "../logger.js";
6
+ import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from "./toolAnnotations.js";
7
+ // This tool intentionally does not expose a single outputSchemaShape.
8
+ // - `result_type="results"` can return a large FeatureCollection, and we
9
+ // avoid duplicating that payload into structuredContent.
10
+ // - Compact modes (`hits`, `url`) are handled explicitly in createSuccessResponse().
11
+ const gpfWfsGetFeaturesInputSchema = z.object({
12
+ typename: z
13
+ .string()
14
+ .trim()
15
+ .min(1, "le nom du type ne doit pas être vide")
16
+ .describe("L'identifiant exact du type WFS à interroger (ex : `BDTOPO_V3:batiment`). Ce paramètre détermine la collection interrogée et doit correspondre à un type valide. Utiliser `gpf_wfs_search_types` pour trouver un `typename` pertinent, puis `gpf_wfs_describe_type` pour inspecter ses propriétés avant la requête."),
17
+ property_names: z
18
+ .string()
19
+ .optional()
20
+ .describe("La liste des propriétés à inclure dans chaque objet renvoyé, séparées par des virgules (ex : \"code_insee,nom_officiel,geometrie\"). Ce paramètre limite les champs présents dans la réponse, sans filtrer les objets eux-mêmes. Les noms doivent correspondre exactement aux propriétés du type WFS ; utiliser `gpf_wfs_describe_type` pour les connaître."),
21
+ sort_by: z
22
+ .string()
23
+ .optional()
24
+ .describe("Les propriétés à utiliser pour trier les objets renvoyés, avec la syntaxe `field [A|D]` où `A` signifie tri ascendant et `D` tri descendant. Plusieurs critères peuvent être séparés par des virgules (ex : `nom_officiel A, population D`). Les noms doivent correspondre exactement aux propriétés du type WFS ; utiliser `gpf_wfs_describe_type` pour les connaître."),
25
+ count: z
26
+ .number()
27
+ .int()
28
+ .min(1)
29
+ .max(1000)
30
+ .optional()
31
+ .describe("Le nombre maximum d'objets à retourner dans la réponse (entre 1 et 1000). Ce paramètre limite les résultats renvoyés, sans modifier le nombre total d'objets correspondant à la requête. Il est surtout utile avec `result_type=\"results\"`."),
32
+ cql_filter: z
33
+ .string()
34
+ .optional()
35
+ .describe([
36
+ "Un filtre `cql_filter` GeoServer pour restreindre les objets renvoyés par la requête.",
37
+ "Il faut utiliser les noms exacts des propriétés du type WFS ; utiliser `gpf_wfs_describe_type` pour les connaître.",
38
+ "Attention : en `EPSG:4326`, les coordonnées des géométries doivent être exprimées en `lat lon` (y x), y compris pour les points, lignes et polygones.",
39
+ "Exemples :",
40
+ "- filtre attributaire : `code_insee = '75056'`",
41
+ "- filtre spatial point : `DWITHIN(geom,Point(48.8566 2.3522),100,meters)`",
42
+ "- filtre spatial polygone : `INTERSECTS(geom,POLYGON((48.85 2.34,48.86 2.34,48.86 2.36,48.85 2.36,48.85 2.34)))`",
43
+ ].join("\r\n")),
44
+ result_type: z
45
+ .enum(["results", "hits", "url"])
46
+ .optional()
47
+ .describe([
48
+ "Choisit le type de résultat renvoyé par le tool :",
49
+ "- `results` : retourne les objets trouvés sous forme de `FeatureCollection` GeoJSON complète (défaut)",
50
+ "- `hits` : retourne uniquement le nombre total d'objets correspondant à la requête",
51
+ "- `url` : retourne uniquement l'URL WFS construite pour la requête, utile pour inspection, débogage ou réutilisation côté client",
52
+ ].join("\r\n"))
53
+ });
54
+ const gpfWfsGetFeaturesHitsOutputSchema = z.object({
55
+ result_type: z.literal("hits").describe("Indique que la réponse contient uniquement un comptage."),
56
+ totalFeatures: z.number().describe("Le nombre total d'objets correspondant à la requête."),
57
+ });
58
+ const gpfWfsGetFeaturesUrlOutputSchema = z.object({
59
+ result_type: z.literal("url").describe("Indique que la réponse contient uniquement l'URL de la requête."),
60
+ url: z.string().describe("L'URL WFS générée pour la requête."),
61
+ });
5
62
  class GpfWfsGetFeaturesTool extends MCPTool {
6
63
  name = "gpf_wfs_get_features";
7
- description = "Permet de récupérer les objets pour un type WFS.";
8
- schema = {
9
- typename: {
10
- type: z.string(),
11
- description: "Le nom du type (ex : BDTOPO_V3:batiment). Important : Utiliser gpf_wfs_search_types pour trouver les types disponibles."
12
- },
13
- property_names: {
14
- type: z.string().optional(),
15
- description: 'La liste des propriétés séparées par des virgules (ex : "code_insee,nom_officiel,geometrie"). NB : adapter geometrie avec geometryName au niveau du type WFS. '
16
- },
17
- sort_by: {
18
- type: z.string().optional(),
19
- description: 'Trier selon une propriété (syntaxe : field1 [A|D], field2 [A|D], ... , fieldN [A|D])'
20
- },
21
- count: {
22
- type: z.number().optional(),
23
- description: "Le nombre d'objets à récupérer (ex : 10)"
24
- },
25
- cql_filter: {
26
- type: z.string().optional(),
27
- description: "Le filtre au format cql_filter de GeoServer. ATTENTION : il faut permuter les coordonnées pour EPSG:4326 (ex : 'DWITHIN(geom,Point(${lat} ${lon}),10,meters)')"
28
- },
29
- result_type: {
30
- type: z.enum(['results', 'hits', 'url']).optional(),
31
- description: [
32
- "Type de résultat : ",
33
- "- 'results' pour les données complètes (défaut)",
34
- "- 'hits' pour le comptage uniquement",
35
- "- 'url' pour récupérer l'URL de la requête (ex : affichage des données côté client dans une carte)"
36
- ].join("\r\n")
64
+ title = "Lecture d’objets WFS";
65
+ annotations = READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS;
66
+ description = [
67
+ "Récupère les objets d'un type WFS à partir d'un `typename` valide, avec filtres, tri et sélection de propriétés optionnels.",
68
+ "Exécute une requête WFS sur un type connu (`typename`) et renvoie soit les objets trouvés, soit leur nombre total, soit l'URL WFS correspondante.",
69
+ "Utiliser `gpf_wfs_search_types` puis `gpf_wfs_describe_type` avant ce tool lorsque le type ou ses propriétés ne sont pas connus.",
70
+ "Le paramètre `result_type` permet de récupérer soit les données complètes (`results`), soit uniquement le comptage (`hits`), soit l'URL WFS générée (`url`).",
71
+ "Les paramètres optionnels permettent de filtrer, trier ou restreindre les champs et le nombre d'objets renvoyés.",
72
+ ].join("\r\n");
73
+ schema = gpfWfsGetFeaturesInputSchema;
74
+ createSuccessResponse(data) {
75
+ if (typeof data === "object" &&
76
+ data !== null &&
77
+ "result_type" in data &&
78
+ data.result_type === "hits" &&
79
+ "totalFeatures" in data &&
80
+ typeof data.totalFeatures === "number") {
81
+ return {
82
+ content: [
83
+ {
84
+ type: "text",
85
+ text: JSON.stringify(data.totalFeatures),
86
+ },
87
+ ],
88
+ structuredContent: gpfWfsGetFeaturesHitsOutputSchema.parse(data),
89
+ };
90
+ }
91
+ if (typeof data === "object" &&
92
+ data !== null &&
93
+ "result_type" in data &&
94
+ data.result_type === "url" &&
95
+ "url" in data &&
96
+ typeof data.url === "string") {
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: data.url,
102
+ },
103
+ ],
104
+ structuredContent: gpfWfsGetFeaturesUrlOutputSchema.parse(data),
105
+ };
37
106
  }
38
- };
107
+ return super.createSuccessResponse(data);
108
+ }
39
109
  async execute(input) {
40
110
  const params = {
41
111
  service: 'WFS',
@@ -48,7 +118,7 @@ class GpfWfsGetFeaturesTool extends MCPTool {
48
118
  params.cql_filter = input.cql_filter;
49
119
  }
50
120
  if (input.count) {
51
- params.count = input.count;
121
+ params.count = String(input.count);
52
122
  }
53
123
  if (input.sort_by) {
54
124
  params.sortBy = input.sort_by;
@@ -57,32 +127,32 @@ class GpfWfsGetFeaturesTool extends MCPTool {
57
127
  params.propertyName = input.property_names;
58
128
  }
59
129
  // Si result_type est 'hits', on utilise count=1 pour récupérer juste le totalFeatures
130
+ // On fait cela parce que Geoserver ne renvoie pas de json avec resultType=hits
131
+ // On est obligé de faire une requete getfeature pour récupérer le totalFeatures...
60
132
  if (input.result_type === 'hits') {
61
- params.count = 1;
133
+ params.count = "1";
62
134
  // On n'a pas besoin des propriétés détaillées pour un comptage
63
135
  delete params.propertyName;
64
136
  }
65
137
  const url = `${GPF_WFS_URL}?` + new URLSearchParams(params).toString();
66
138
  logger.info(`[gpf_wfs_get_features] ${url}`);
67
139
  if (input.result_type === 'url') {
68
- return url;
140
+ return {
141
+ result_type: "url",
142
+ url,
143
+ };
69
144
  }
70
- try {
71
- const featureCollection = await fetchJSON(url);
72
- // Si result_type est 'hits', on retourne juste le comptage
73
- if (input.result_type === 'hits') {
74
- return featureCollection.totalFeatures;
145
+ const featureCollection = await fetchJSON(url);
146
+ if (input.result_type === 'hits') {
147
+ if (typeof featureCollection?.totalFeatures !== "number") {
148
+ throw new Error("Le service WFS n'a pas retourné de comptage exploitable");
75
149
  }
76
- return featureCollection;
77
- }
78
- catch (e) {
79
- logger.error(`[gpf_wfs_get_features] ${e}`);
80
150
  return {
81
- type: "error",
82
- message: "Une erreur est survenue lors de la récupération des objets (utiliser gpf_wfs_describe_type pour lister les types disponibles avant d'appeler gpf_wfs_get_features)",
83
- details: `${e}`
151
+ result_type: "hits",
152
+ totalFeatures: featureCollection.totalFeatures,
84
153
  };
85
154
  }
155
+ return featureCollection;
86
156
  }
87
157
  }
88
158
  export default GpfWfsGetFeaturesTool;
@@ -1 +1 @@
1
- {"version":3,"file":"GpfWfsGetFeaturesTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsGetFeaturesTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GpfWfsGetFeaturesTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsGetFeaturesTool.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,22 @@
1
1
  import { MCPTool } from "mcp-framework";
2
- interface WfsTypesInput {
3
- }
4
- declare class GpfWfsListTypesTools extends MCPTool<WfsTypesInput> {
2
+ import { z } from "zod";
3
+ declare const gpfWfsListTypesInputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
+ type GpfWfsListTypesInput = z.infer<typeof gpfWfsListTypesInputSchema>;
5
+ declare class GpfWfsListTypesTool extends MCPTool<GpfWfsListTypesInput> {
5
6
  name: string;
7
+ title: string;
8
+ annotations: {
9
+ readonly readOnlyHint: true;
10
+ readonly destructiveHint: false;
11
+ readonly idempotentHint: true;
12
+ readonly openWorldHint: true;
13
+ };
6
14
  description: string;
7
- schema: {};
8
- execute(input: WfsTypesInput): Promise<string[]>;
15
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
16
+ execute(input: GpfWfsListTypesInput): Promise<{
17
+ id: string;
18
+ title: string;
19
+ description: string;
20
+ }[]>;
9
21
  }
10
- export default GpfWfsListTypesTools;
22
+ export default GpfWfsListTypesTool;
@@ -1,18 +1,26 @@
1
1
  import { MCPTool } from "mcp-framework";
2
+ import { z } from "zod";
3
+ import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from "./toolAnnotations.js";
2
4
  import { wfsClient } from "../gpf/wfs.js";
3
- class GpfWfsListTypesTools extends MCPTool {
5
+ const gpfWfsListTypesInputSchema = z.object({});
6
+ class GpfWfsListTypesTool extends MCPTool {
4
7
  name = "gpf_wfs_list_types";
8
+ title = "Liste complète des types WFS";
9
+ annotations = READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS;
5
10
  description = [
6
- "Renvoie la liste des types WFS de la Géoplateforme (GPF). ATTENTION :",
7
- "- Il y a plus de 700 résultats possibles",
8
- "- Il est conseillé d'utiliser de préférence gpf_wfs_search_types pour filtrer les résultats.",
11
+ "Renvoie la liste complète des types WFS de la Géoplateforme (GPF).",
12
+ "Utiliser ce tool pour un inventaire exhaustif ou une exploration globale du catalogue.",
13
+ "Pour trouver rapidement un type pertinent à partir de mots-clés, utiliser de préférence gpf_wfs_search_types.",
9
14
  ].join("\r\n");
10
- schema = {};
15
+ schema = gpfWfsListTypesInputSchema;
11
16
  async execute(input) {
12
17
  const featureTypes = await wfsClient.getFeatureTypes();
13
- const featureTypeNames = featureTypes.map((featureType) => featureType.id);
14
- return featureTypeNames;
18
+ return featureTypes.map((featureType) => ({
19
+ id: featureType.id,
20
+ title: featureType.title,
21
+ description: featureType.description,
22
+ }));
15
23
  }
16
24
  }
17
- export default GpfWfsListTypesTools;
25
+ export default GpfWfsListTypesTool;
18
26
  //# sourceMappingURL=GpfWfsListTypesTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GpfWfsListTypesTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsListTypesTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK1C,MAAM,oBAAqB,SAAQ,OAAsB;IACvD,IAAI,GAAG,oBAAoB,CAAC;IAC5B,WAAW,GAAG;QACZ,uEAAuE;QACvE,0CAA0C;QAC1C,8FAA8F;KAC/F,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,MAAM,GAAG,EAER,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAAoB;QAChC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;QACvD,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"GpfWfsListTypesTool.js","sourceRoot":"","sources":["../../src/tools/GpfWfsListTypesTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qCAAqC,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAIhD,MAAM,mBAAoB,SAAQ,OAA6B;IAC7D,IAAI,GAAG,oBAAoB,CAAC;IAC5B,KAAK,GAAG,8BAA8B,CAAC;IACvC,WAAW,GAAG,qCAAqC,CAAC;IACpD,WAAW,GAAG;QACZ,oEAAoE;QACpE,wFAAwF;QACxF,+GAA+G;KAChH,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,GAAG,0BAA0B,CAAC;IAEpC,KAAK,CAAC,OAAO,CAAC,KAA2B;QACvC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;QACvD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACxC,EAAE,EAAE,WAAW,CAAC,EAAE;YAClB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,eAAe,mBAAmB,CAAC"}
@@ -1,22 +1,69 @@
1
1
  import { MCPTool } from "mcp-framework";
2
2
  import { z } from "zod";
3
- interface GpfWfsSearchTypesInput {
4
- query: string;
5
- max_results: number;
6
- }
3
+ declare const gpfWfsSearchTypesInputSchema: z.ZodObject<{
4
+ query: z.ZodString;
5
+ max_results: z.ZodOptional<z.ZodNumber>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ query?: string;
8
+ max_results?: number;
9
+ }, {
10
+ query?: string;
11
+ max_results?: number;
12
+ }>;
13
+ type GpfWfsSearchTypesInput = z.infer<typeof gpfWfsSearchTypesInputSchema>;
7
14
  declare class GpfWfsSearchTypesTool extends MCPTool<GpfWfsSearchTypesInput> {
8
15
  name: string;
16
+ title: string;
17
+ annotations: {
18
+ readonly readOnlyHint: true;
19
+ readonly destructiveHint: false;
20
+ readonly idempotentHint: true;
21
+ readonly openWorldHint: true;
22
+ };
9
23
  description: string;
10
- schema: {
11
- query: {
12
- type: z.ZodString;
24
+ protected outputSchemaShape: z.ZodObject<{
25
+ results: z.ZodArray<z.ZodObject<{
26
+ id: z.ZodString;
27
+ title: z.ZodString;
28
+ description: z.ZodString;
29
+ }, "strip", z.ZodTypeAny, {
30
+ id?: string;
31
+ title?: string;
32
+ description?: string;
33
+ }, {
34
+ id?: string;
35
+ title?: string;
36
+ description?: string;
37
+ }>, "many">;
38
+ }, "strip", z.ZodTypeAny, {
39
+ results?: {
40
+ id?: string;
41
+ title?: string;
42
+ description?: string;
43
+ }[];
44
+ }, {
45
+ results?: {
46
+ id?: string;
47
+ title?: string;
48
+ description?: string;
49
+ }[];
50
+ }>;
51
+ schema: z.ZodObject<{
52
+ query: z.ZodString;
53
+ max_results: z.ZodOptional<z.ZodNumber>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ query?: string;
56
+ max_results?: number;
57
+ }, {
58
+ query?: string;
59
+ max_results?: number;
60
+ }>;
61
+ execute(input: GpfWfsSearchTypesInput): Promise<{
62
+ results: {
63
+ id: string;
64
+ title: string;
13
65
  description: string;
14
- };
15
- max_results: {
16
- type: z.ZodOptional<z.ZodNumber>;
17
- description: string;
18
- };
19
- };
20
- execute(input: GpfWfsSearchTypesInput): Promise<string[]>;
66
+ }[];
67
+ }>;
21
68
  }
22
69
  export default GpfWfsSearchTypesTool;
@@ -1,30 +1,51 @@
1
1
  import { MCPTool } from "mcp-framework";
2
2
  import { z } from "zod";
3
+ import { READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS } from "./toolAnnotations.js";
3
4
  import { wfsClient } from "../gpf/wfs.js";
5
+ const gpfWfsSearchTypesInputSchema = z.object({
6
+ query: z
7
+ .string()
8
+ .trim()
9
+ .min(1, "la requête de recherche ne doit pas être vide")
10
+ .describe("La requête de recherche"),
11
+ max_results: z
12
+ .number()
13
+ .int()
14
+ .min(1)
15
+ .max(50)
16
+ .optional()
17
+ .describe("Le nombre maximum de résultats à retourner (entre 1 et 50). Défaut : 10."),
18
+ });
19
+ const gpfWfsSearchTypeResultSchema = z.object({
20
+ id: z.string().describe("L'identifiant complet du type WFS."),
21
+ title: z.string().describe("Le titre lisible du type WFS."),
22
+ description: z.string().describe("La description du type WFS."),
23
+ });
24
+ const gpfWfsSearchTypesOutputSchema = z.object({
25
+ results: z.array(gpfWfsSearchTypeResultSchema).describe("La liste ordonnée des types WFS trouvés."),
26
+ });
4
27
  class GpfWfsSearchTypesTool extends MCPTool {
5
28
  name = "gpf_wfs_search_types";
29
+ title = "Recherche de types WFS";
30
+ annotations = READ_ONLY_OPEN_WORLD_TOOL_ANNOTATIONS;
6
31
  description = [
7
- "Recherche par mot clé dans la liste des types WFS de la Géoplateforme (GPF). Remarques :",
8
- "- La recherche est une recherche textuelle simple (mini-search).",
9
- "- Un LLM peut enrichir la recherche avec des mots clés supplémentaires.",
10
- "- La recherche est limitée par défaut à 10 résultats",
11
- "- Le paramètre max_results permet de changer le nombre de résultats (par exemple pour trouver toutes les tables BDTOPO ou toutes les tables communes)",
32
+ "Recherche des types WFS de la Géoplateforme (GPF) à partir de mots-clés afin de trouver un identifiant de type (`typename`) valide.",
33
+ "Utiliser ce tool avant `gpf_wfs_describe_type` ou `gpf_wfs_get_features` lorsque le nom exact du type n'est pas connu.",
34
+ "La recherche est textuelle (mini-search) et retourne une liste ordonnée de candidats avec leur identifiant, leur titre et leur description.",
35
+ "Le paramètre `max_results` permet d'élargir le nombre de candidats retournés (10 par défaut).",
12
36
  ].join("\r\n");
13
- schema = {
14
- query: {
15
- type: z.string(),
16
- description: "La requête de recherche",
17
- },
18
- max_results: {
19
- type: z.number().optional(),
20
- description: "Le nombre de résultats (10 par défaut)",
21
- },
22
- };
37
+ outputSchemaShape = gpfWfsSearchTypesOutputSchema;
38
+ schema = gpfWfsSearchTypesInputSchema;
23
39
  async execute(input) {
24
40
  const maxResults = input.max_results || 10;
25
41
  const featureTypes = await wfsClient.searchFeatureTypes(input.query, maxResults);
26
- const featureTypeNames = featureTypes.map((featureType) => featureType.id);
27
- return featureTypeNames;
42
+ return {
43
+ results: featureTypes.map((featureType) => ({
44
+ id: featureType.id,
45
+ title: featureType.title,
46
+ description: featureType.description,
47
+ })),
48
+ };
28
49
  }
29
50
  }
30
51
  export default GpfWfsSearchTypesTool;