@cyanheads/reliefweb-mcp-server 0.1.1

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 (77) hide show
  1. package/CLAUDE.md +391 -0
  2. package/Dockerfile +98 -0
  3. package/LICENSE +201 -0
  4. package/README.md +320 -0
  5. package/changelog/0.1.x/0.1.0.md +24 -0
  6. package/changelog/0.1.x/0.1.1.md +29 -0
  7. package/changelog/template.md +119 -0
  8. package/dist/config/server-config.d.ts +14 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +19 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +42 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/prompts/definitions/crisis-briefing.prompt.d.ts +14 -0
  17. package/dist/mcp-server/prompts/definitions/crisis-briefing.prompt.d.ts.map +1 -0
  18. package/dist/mcp-server/prompts/definitions/crisis-briefing.prompt.js +62 -0
  19. package/dist/mcp-server/prompts/definitions/crisis-briefing.prompt.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/country.resource.d.ts +9 -0
  21. package/dist/mcp-server/resources/definitions/country.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/country.resource.js +30 -0
  23. package/dist/mcp-server/resources/definitions/country.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/disaster.resource.d.ts +9 -0
  25. package/dist/mcp-server/resources/definitions/disaster.resource.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/disaster.resource.js +30 -0
  27. package/dist/mcp-server/resources/definitions/disaster.resource.js.map +1 -0
  28. package/dist/mcp-server/resources/definitions/report.resource.d.ts +9 -0
  29. package/dist/mcp-server/resources/definitions/report.resource.d.ts.map +1 -0
  30. package/dist/mcp-server/resources/definitions/report.resource.js +30 -0
  31. package/dist/mcp-server/resources/definitions/report.resource.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/get-country.tool.d.ts +35 -0
  33. package/dist/mcp-server/tools/definitions/get-country.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/get-country.tool.js +106 -0
  35. package/dist/mcp-server/tools/definitions/get-country.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/get-disaster.tool.d.ts +42 -0
  37. package/dist/mcp-server/tools/definitions/get-disaster.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/get-disaster.tool.js +127 -0
  39. package/dist/mcp-server/tools/definitions/get-disaster.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/get-report.tool.d.ts +30 -0
  41. package/dist/mcp-server/tools/definitions/get-report.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/get-report.tool.js +92 -0
  43. package/dist/mcp-server/tools/definitions/get-report.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/list-countries.tool.d.ts +20 -0
  45. package/dist/mcp-server/tools/definitions/list-countries.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/list-countries.tool.js +83 -0
  47. package/dist/mcp-server/tools/definitions/list-countries.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/list-sources.tool.d.ts +22 -0
  49. package/dist/mcp-server/tools/definitions/list-sources.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/list-sources.tool.js +82 -0
  51. package/dist/mcp-server/tools/definitions/list-sources.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/search-disasters.tool.d.ts +35 -0
  53. package/dist/mcp-server/tools/definitions/search-disasters.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/search-disasters.tool.js +163 -0
  55. package/dist/mcp-server/tools/definitions/search-disasters.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/search-jobs.tool.d.ts +32 -0
  57. package/dist/mcp-server/tools/definitions/search-jobs.tool.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/search-jobs.tool.js +148 -0
  59. package/dist/mcp-server/tools/definitions/search-jobs.tool.js.map +1 -0
  60. package/dist/mcp-server/tools/definitions/search-reports.tool.d.ts +40 -0
  61. package/dist/mcp-server/tools/definitions/search-reports.tool.d.ts.map +1 -0
  62. package/dist/mcp-server/tools/definitions/search-reports.tool.js +191 -0
  63. package/dist/mcp-server/tools/definitions/search-reports.tool.js.map +1 -0
  64. package/dist/mcp-server/tools/definitions/search-training.tool.d.ts +35 -0
  65. package/dist/mcp-server/tools/definitions/search-training.tool.d.ts.map +1 -0
  66. package/dist/mcp-server/tools/definitions/search-training.tool.js +166 -0
  67. package/dist/mcp-server/tools/definitions/search-training.tool.js.map +1 -0
  68. package/dist/services/reliefweb/reliefweb-service.d.ts +103 -0
  69. package/dist/services/reliefweb/reliefweb-service.d.ts.map +1 -0
  70. package/dist/services/reliefweb/reliefweb-service.js +546 -0
  71. package/dist/services/reliefweb/reliefweb-service.js.map +1 -0
  72. package/dist/services/reliefweb/types.d.ts +345 -0
  73. package/dist/services/reliefweb/types.d.ts.map +1 -0
  74. package/dist/services/reliefweb/types.js +7 -0
  75. package/dist/services/reliefweb/types.js.map +1 -0
  76. package/package.json +78 -0
  77. package/server.json +111 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @fileoverview Search ReliefWeb disasters by type, country, status, and GLIDE number.
3
+ * @module mcp-server/tools/definitions/search-disasters
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getReliefWebService } from '../../../services/reliefweb/reliefweb-service.js';
7
+ export const reliefwebSearchDisasters = tool('reliefweb_search_disasters', {
8
+ title: 'Search ReliefWeb Disasters',
9
+ description: 'Search active and historical disasters on ReliefWeb by type, country, status, date range, and GLIDE number. ' +
10
+ 'Default preset covers alert, current, and past disasters. ' +
11
+ 'Use include_archived=true to include alert-archive and archive entries for historical research. ' +
12
+ 'Returns IDs suitable for use with reliefweb_get_disaster and as disaster_id filter in reliefweb_search_reports.',
13
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
14
+ input: z.object({
15
+ text: z
16
+ .string()
17
+ .optional()
18
+ .describe('Full-text search query. Matches against disaster name and description.'),
19
+ country: z
20
+ .string()
21
+ .optional()
22
+ .describe('ISO 3166-1 alpha-3 country code (e.g., SYR, AFG, UKR). Filters to disasters tagged with this primary country.'),
23
+ disaster_type: z
24
+ .string()
25
+ .optional()
26
+ .describe('Disaster type name (e.g., Earthquake, Flood, Drought, Cyclone). Filters on type.name.'),
27
+ status: z
28
+ .string()
29
+ .optional()
30
+ .describe('Disaster status filter. Values: alert (newly declared), current (ongoing), past (resolved), alert-archive, archive. Separate multiple values with commas. Default preset includes alert, current, past.'),
31
+ glide: z
32
+ .string()
33
+ .optional()
34
+ .describe('GLIDE number (global disaster identifier, e.g., EQ-2023-000053-TUR). Use for cross-system disaster correlation.'),
35
+ date_from: z
36
+ .string()
37
+ .optional()
38
+ .describe('Earliest disaster creation date (ISO 8601). Filters on date.created.'),
39
+ date_to: z
40
+ .string()
41
+ .optional()
42
+ .describe('Latest disaster creation date (ISO 8601). Pair with date_from for a date range.'),
43
+ sort: z
44
+ .string()
45
+ .optional()
46
+ .describe('Sort order. Use date.created:desc for newest first (default), date.created:asc for oldest, score:desc for relevance.'),
47
+ include_archived: z
48
+ .boolean()
49
+ .optional()
50
+ .describe('Include alert-archive and archive disasters in results. Uses preset=analysis. Off by default.'),
51
+ limit: z
52
+ .number()
53
+ .int()
54
+ .min(1)
55
+ .max(1000)
56
+ .default(10)
57
+ .describe('Number of results to return (1–1000, default 10). Each call counts against the 1,000-calls/day quota.'),
58
+ offset: z
59
+ .number()
60
+ .int()
61
+ .min(0)
62
+ .default(0)
63
+ .describe('Zero-based offset for pagination. Use with limit and totalCount to page through results.'),
64
+ }),
65
+ output: z.object({
66
+ items: z
67
+ .array(z
68
+ .object({
69
+ id: z.number().describe('ReliefWeb numeric disaster ID.'),
70
+ name: z.string().describe('Disaster name.'),
71
+ status: z
72
+ .string()
73
+ .optional()
74
+ .describe('Disaster status (alert, current, past, archive).'),
75
+ glide: z.string().optional().describe('GLIDE number for cross-system correlation.'),
76
+ dateEvent: z.string().optional().describe('Event date (ISO 8601), when available.'),
77
+ dateCreated: z.string().optional().describe('ReliefWeb index date (ISO 8601).'),
78
+ primaryCountry: z.string().optional().describe('Primary affected country.'),
79
+ countries: z
80
+ .array(z.string())
81
+ .optional()
82
+ .describe('All countries tagged on this disaster.'),
83
+ types: z.array(z.string()).optional().describe('Disaster type names.'),
84
+ primaryType: z.string().optional().describe('Primary disaster type.'),
85
+ urlAlias: z.string().optional().describe('Canonical ReliefWeb URL for this disaster.'),
86
+ })
87
+ .describe('A matching disaster record.'))
88
+ .describe('Matching disasters.'),
89
+ totalCount: z.number().describe('Total disasters matching the query before pagination.'),
90
+ message: z
91
+ .string()
92
+ .optional()
93
+ .describe('Recovery hint when results are empty — echoes filters applied and suggests how to broaden.'),
94
+ }),
95
+ async handler(input, ctx) {
96
+ ctx.log.info('reliefweb_search_disasters', {
97
+ text: input.text,
98
+ country: input.country,
99
+ disasterType: input.disaster_type,
100
+ limit: input.limit,
101
+ });
102
+ const result = await getReliefWebService().searchDisasters({
103
+ ...(input.text?.trim() ? { text: input.text } : {}),
104
+ ...(input.country?.trim() ? { country: input.country.toUpperCase() } : {}),
105
+ ...(input.disaster_type?.trim() ? { disasterType: input.disaster_type } : {}),
106
+ ...(input.status?.trim() ? { status: input.status } : {}),
107
+ ...(input.glide?.trim() ? { glide: input.glide } : {}),
108
+ ...(input.date_from?.trim() ? { dateFrom: input.date_from } : {}),
109
+ ...(input.date_to?.trim() ? { dateTo: input.date_to } : {}),
110
+ ...(input.sort?.trim() ? { sort: input.sort } : {}),
111
+ ...(input.include_archived != null ? { includeArchived: input.include_archived } : {}),
112
+ limit: input.limit,
113
+ offset: input.offset,
114
+ }, ctx);
115
+ if (result.items.length === 0) {
116
+ const filters = [];
117
+ if (input.text)
118
+ filters.push(`text="${input.text}"`);
119
+ if (input.country)
120
+ filters.push(`country=${input.country}`);
121
+ if (input.disaster_type)
122
+ filters.push(`type="${input.disaster_type}"`);
123
+ if (input.status)
124
+ filters.push(`status=${input.status}`);
125
+ return {
126
+ items: [],
127
+ totalCount: 0,
128
+ message: `No disasters matched ${filters.length > 0 ? filters.join(', ') : 'the given filters'}. ` +
129
+ 'Try removing filters, using different disaster type names, or setting include_archived=true for historical data.',
130
+ };
131
+ }
132
+ return { items: result.items, totalCount: result.totalCount };
133
+ },
134
+ format: (result) => {
135
+ const lines = [`**Total:** ${result.totalCount} disasters`];
136
+ if (result.message)
137
+ lines.push(`\n> ${result.message}`);
138
+ for (const item of result.items) {
139
+ lines.push(`\n## ${item.name}`);
140
+ lines.push(`**ID:** ${item.id}`);
141
+ if (item.status)
142
+ lines.push(`**Status:** ${item.status}`);
143
+ if (item.glide)
144
+ lines.push(`**GLIDE:** ${item.glide}`);
145
+ if (item.primaryType)
146
+ lines.push(`**Type:** ${item.primaryType}`);
147
+ if (item.types?.length)
148
+ lines.push(`**Types:** ${item.types.join(', ')}`);
149
+ if (item.dateEvent)
150
+ lines.push(`**Event date:** ${item.dateEvent}`);
151
+ if (item.dateCreated)
152
+ lines.push(`**Indexed:** ${item.dateCreated}`);
153
+ if (item.primaryCountry)
154
+ lines.push(`**Primary country:** ${item.primaryCountry}`);
155
+ if (item.countries?.length)
156
+ lines.push(`**Countries:** ${item.countries.join(', ')}`);
157
+ if (item.urlAlias)
158
+ lines.push(`**URL:** ${item.urlAlias}`);
159
+ }
160
+ return [{ type: 'text', text: lines.join('\n') }];
161
+ },
162
+ });
163
+ //# sourceMappingURL=search-disasters.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-disasters.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disasters.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Search humanitarian job listings on ReliefWeb.
3
+ * @module mcp-server/tools/definitions/search-jobs
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const reliefwebSearchJobs: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ text: z.ZodOptional<z.ZodString>;
8
+ country: z.ZodOptional<z.ZodString>;
9
+ source: z.ZodOptional<z.ZodString>;
10
+ career_category: z.ZodOptional<z.ZodString>;
11
+ theme: z.ZodOptional<z.ZodString>;
12
+ experience: z.ZodOptional<z.ZodString>;
13
+ limit: z.ZodDefault<z.ZodNumber>;
14
+ offset: z.ZodDefault<z.ZodNumber>;
15
+ }, z.core.$strip>, z.ZodObject<{
16
+ items: z.ZodArray<z.ZodObject<{
17
+ id: z.ZodNumber;
18
+ title: z.ZodString;
19
+ dateCreated: z.ZodOptional<z.ZodString>;
20
+ dateClosing: z.ZodOptional<z.ZodString>;
21
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ countries: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ themes: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
+ types: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
+ careerCategories: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ experienceLevels: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ urlAlias: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>>;
29
+ totalCount: z.ZodNumber;
30
+ message: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>, undefined>;
32
+ //# sourceMappingURL=search-jobs.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-jobs.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-jobs.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAGjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;6BA4J9B,CAAC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @fileoverview Search humanitarian job listings on ReliefWeb.
3
+ * @module mcp-server/tools/definitions/search-jobs
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getReliefWebService } from '../../../services/reliefweb/reliefweb-service.js';
7
+ export const reliefwebSearchJobs = tool('reliefweb_search_jobs', {
8
+ title: 'Search ReliefWeb Jobs',
9
+ description: 'Search humanitarian job listings on ReliefWeb by country, organization, career category, theme, and experience level. ' +
10
+ 'Returns current open positions — archived or expired jobs are excluded by default. ' +
11
+ 'Use text search for role titles and job descriptions.',
12
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
13
+ input: z.object({
14
+ text: z
15
+ .string()
16
+ .optional()
17
+ .describe('Full-text search query. Matches against job title, body, and key metadata fields.'),
18
+ country: z
19
+ .string()
20
+ .optional()
21
+ .describe('ISO 3166-1 alpha-3 country code (e.g., SYR, AFG, UKR). Filters to jobs tagged with this country.'),
22
+ source: z
23
+ .string()
24
+ .optional()
25
+ .describe('Organization short name (e.g., UNHCR, OCHA, WFP). Filters on source.shortname.'),
26
+ career_category: z
27
+ .string()
28
+ .optional()
29
+ .describe('Humanitarian career track (e.g., Programme and Project Management, Information and Communications Technology, Logistics and Telecommunications). Filters on career_categories.name.'),
30
+ theme: z
31
+ .string()
32
+ .optional()
33
+ .describe('Sector or cross-cutting theme (e.g., Health, Food and Nutrition, Protection). Filters on theme.name.'),
34
+ experience: z
35
+ .string()
36
+ .optional()
37
+ .describe('Experience level (e.g., 0-2 years, 3-4 years, 5-9 years). Filters on experience.name.'),
38
+ limit: z
39
+ .number()
40
+ .int()
41
+ .min(1)
42
+ .max(1000)
43
+ .default(10)
44
+ .describe('Number of results to return (1–1000, default 10). Each call counts against the 1,000-calls/day quota.'),
45
+ offset: z
46
+ .number()
47
+ .int()
48
+ .min(0)
49
+ .default(0)
50
+ .describe('Zero-based offset for pagination. Use with limit and totalCount to page through results.'),
51
+ }),
52
+ output: z.object({
53
+ items: z
54
+ .array(z
55
+ .object({
56
+ id: z.number().describe('ReliefWeb numeric job ID.'),
57
+ title: z.string().describe('Job title.'),
58
+ dateCreated: z.string().optional().describe('Date this job was indexed (ISO 8601).'),
59
+ dateClosing: z.string().optional().describe('Application closing date (ISO 8601).'),
60
+ sources: z.array(z.string()).optional().describe('Hiring organizations (short names).'),
61
+ countries: z.array(z.string()).optional().describe('Countries tagged on this job.'),
62
+ themes: z.array(z.string()).optional().describe('Humanitarian theme/sector names.'),
63
+ types: z.array(z.string()).optional().describe('Job type names.'),
64
+ careerCategories: z
65
+ .array(z.string())
66
+ .optional()
67
+ .describe('Career category names (humanitarian tracks).'),
68
+ experienceLevels: z
69
+ .array(z.string())
70
+ .optional()
71
+ .describe('Required experience levels.'),
72
+ urlAlias: z
73
+ .string()
74
+ .optional()
75
+ .describe('Canonical ReliefWeb URL for this job listing.'),
76
+ })
77
+ .describe('A matching job listing.'))
78
+ .describe('Matching job listings.'),
79
+ totalCount: z.number().describe('Total jobs matching the query before pagination.'),
80
+ message: z
81
+ .string()
82
+ .optional()
83
+ .describe('Recovery hint when results are empty — echoes filters applied and suggests how to broaden.'),
84
+ }),
85
+ async handler(input, ctx) {
86
+ ctx.log.info('reliefweb_search_jobs', {
87
+ text: input.text,
88
+ country: input.country,
89
+ careerCategory: input.career_category,
90
+ limit: input.limit,
91
+ });
92
+ const result = await getReliefWebService().searchJobs({
93
+ ...(input.text?.trim() ? { text: input.text } : {}),
94
+ ...(input.country?.trim() ? { country: input.country.toUpperCase() } : {}),
95
+ ...(input.source?.trim() ? { source: input.source } : {}),
96
+ ...(input.career_category?.trim() ? { careerCategory: input.career_category } : {}),
97
+ ...(input.theme?.trim() ? { theme: input.theme } : {}),
98
+ ...(input.experience?.trim() ? { experience: input.experience } : {}),
99
+ limit: input.limit,
100
+ offset: input.offset,
101
+ }, ctx);
102
+ if (result.items.length === 0) {
103
+ const filters = [];
104
+ if (input.text)
105
+ filters.push(`text="${input.text}"`);
106
+ if (input.country)
107
+ filters.push(`country=${input.country}`);
108
+ if (input.career_category)
109
+ filters.push(`career_category="${input.career_category}"`);
110
+ return {
111
+ items: [],
112
+ totalCount: 0,
113
+ message: `No jobs matched ${filters.length > 0 ? filters.join(', ') : 'the given filters'}. ` +
114
+ 'Try broader keywords, remove the country filter, or check the career category spelling.',
115
+ };
116
+ }
117
+ return { items: result.items, totalCount: result.totalCount };
118
+ },
119
+ format: (result) => {
120
+ const lines = [`**Total:** ${result.totalCount} jobs`];
121
+ if (result.message)
122
+ lines.push(`\n> ${result.message}`);
123
+ for (const item of result.items) {
124
+ lines.push(`\n## ${item.title}`);
125
+ lines.push(`**ID:** ${item.id}`);
126
+ if (item.sources?.length)
127
+ lines.push(`**Organization:** ${item.sources.join(', ')}`);
128
+ if (item.countries?.length)
129
+ lines.push(`**Countries:** ${item.countries.join(', ')}`);
130
+ if (item.careerCategories?.length)
131
+ lines.push(`**Career category:** ${item.careerCategories.join(', ')}`);
132
+ if (item.experienceLevels?.length)
133
+ lines.push(`**Experience:** ${item.experienceLevels.join(', ')}`);
134
+ if (item.themes?.length)
135
+ lines.push(`**Themes:** ${item.themes.join(', ')}`);
136
+ if (item.types?.length)
137
+ lines.push(`**Type:** ${item.types.join(', ')}`);
138
+ if (item.dateCreated)
139
+ lines.push(`**Indexed:** ${item.dateCreated}`);
140
+ if (item.dateClosing)
141
+ lines.push(`**Closing:** ${item.dateClosing}`);
142
+ if (item.urlAlias)
143
+ lines.push(`**URL:** ${item.urlAlias}`);
144
+ }
145
+ return [{ type: 'text', text: lines.join('\n') }];
146
+ },
147
+ });
148
+ //# sourceMappingURL=search-jobs.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-jobs.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-jobs.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview Search humanitarian reports on ReliefWeb with rich filtering.
3
+ * @module mcp-server/tools/definitions/search-reports
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const reliefwebSearchReports: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
7
+ text: z.ZodOptional<z.ZodString>;
8
+ country: z.ZodOptional<z.ZodString>;
9
+ disaster_id: z.ZodOptional<z.ZodNumber>;
10
+ format: z.ZodOptional<z.ZodString>;
11
+ theme: z.ZodOptional<z.ZodString>;
12
+ language: z.ZodOptional<z.ZodString>;
13
+ source: z.ZodOptional<z.ZodString>;
14
+ date_from: z.ZodOptional<z.ZodString>;
15
+ date_to: z.ZodOptional<z.ZodString>;
16
+ sort: z.ZodOptional<z.ZodString>;
17
+ include_archived: z.ZodOptional<z.ZodBoolean>;
18
+ filter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
19
+ limit: z.ZodDefault<z.ZodNumber>;
20
+ offset: z.ZodDefault<z.ZodNumber>;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ items: z.ZodArray<z.ZodObject<{
23
+ id: z.ZodNumber;
24
+ title: z.ZodString;
25
+ dateOriginal: z.ZodOptional<z.ZodString>;
26
+ dateCreated: z.ZodOptional<z.ZodString>;
27
+ primaryCountry: z.ZodOptional<z.ZodString>;
28
+ countries: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ formats: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
+ themes: z.ZodOptional<z.ZodArray<z.ZodString>>;
32
+ languages: z.ZodOptional<z.ZodArray<z.ZodString>>;
33
+ urlAlias: z.ZodOptional<z.ZodString>;
34
+ fileUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ headlineSummary: z.ZodOptional<z.ZodString>;
36
+ }, z.core.$strip>>;
37
+ totalCount: z.ZodNumber;
38
+ message: z.ZodOptional<z.ZodString>;
39
+ }, z.core.$strip>, undefined>;
40
+ //# sourceMappingURL=search-reports.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-reports.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-reports.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA0MjC,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * @fileoverview Search humanitarian reports on ReliefWeb with rich filtering.
3
+ * @module mcp-server/tools/definitions/search-reports
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { getReliefWebService } from '../../../services/reliefweb/reliefweb-service.js';
7
+ export const reliefwebSearchReports = tool('reliefweb_search_reports', {
8
+ title: 'Search ReliefWeb Reports',
9
+ description: 'Search humanitarian reports on ReliefWeb with filtering by country, disaster, format, theme, language, source, and date. ' +
10
+ 'Returns paginated summaries — use reliefweb_get_report to fetch full body text. ' +
11
+ 'Report body is excluded from results (10–100KB each); call get_report when document content is needed. ' +
12
+ 'Use preset include_archived=true to include expired or archived reports in historical research. ' +
13
+ 'Note: each call counts against the 1,000 calls/day quota.',
14
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
15
+ input: z.object({
16
+ text: z
17
+ .string()
18
+ .optional()
19
+ .describe('Full-text search query. Matches against title, body, and key metadata fields. Use plain natural language or keywords.'),
20
+ country: z
21
+ .string()
22
+ .optional()
23
+ .describe('ISO 3166-1 alpha-3 country code (e.g., SYR, AFG, UKR). Filters to content tagged with this country.'),
24
+ disaster_id: z
25
+ .number()
26
+ .int()
27
+ .optional()
28
+ .describe('ReliefWeb numeric disaster ID. Filters to reports linked to a specific disaster. Get the ID from reliefweb_search_disasters.'),
29
+ format: z
30
+ .string()
31
+ .optional()
32
+ .describe('Content format filter. Valid values: Situation Report, Assessment, Analysis, Map, Infographic, Manual and Guideline, News and Press Release, Policy Document, Appeal, Financial Report, Evaluation and Lessons Learned, Other.'),
33
+ theme: z
34
+ .string()
35
+ .optional()
36
+ .describe('Sector or cross-cutting theme (e.g., Health, Food and Nutrition, Shelter and NFI, Protection). Matches theme.name.'),
37
+ language: z
38
+ .string()
39
+ .optional()
40
+ .describe('ISO 639-1 language code (e.g., en, fr, es, ar). Filters on language.code.'),
41
+ source: z
42
+ .string()
43
+ .optional()
44
+ .describe('Organization short name (e.g., UNHCR, OCHA, WFP). Filters on source.shortname.'),
45
+ date_from: z
46
+ .string()
47
+ .optional()
48
+ .describe('Earliest publication date (ISO 8601, e.g., 2024-01-15T00:00:00+00:00). Filters on date.original (source publication date).'),
49
+ date_to: z
50
+ .string()
51
+ .optional()
52
+ .describe('Latest publication date (ISO 8601). Pair with date_from for a date range.'),
53
+ sort: z
54
+ .string()
55
+ .optional()
56
+ .describe('Sort order. Use date.original:desc for newest first (default), date.original:asc for oldest first, score:desc for relevance.'),
57
+ include_archived: z
58
+ .boolean()
59
+ .optional()
60
+ .describe('Include archived and to-review content in addition to published. Uses preset=analysis. Off by default.'),
61
+ filter: z
62
+ .record(z.string(), z.unknown())
63
+ .optional()
64
+ .describe('Raw ReliefWeb filter object for compound conditions not covered by named params. Example: {"operator": "AND", "conditions": [{"field": "format.name", "value": "Map"}, {"field": "language.code", "value": "fr"}]}.'),
65
+ limit: z
66
+ .number()
67
+ .int()
68
+ .min(1)
69
+ .max(1000)
70
+ .default(10)
71
+ .describe('Number of results to return (1–1000, default 10). Use a smaller value for targeted lookups; larger for bulk research. Each call counts against the 1,000-calls/day quota.'),
72
+ offset: z
73
+ .number()
74
+ .int()
75
+ .min(0)
76
+ .default(0)
77
+ .describe('Zero-based offset for pagination. Use with limit and totalCount from the response to page through large result sets.'),
78
+ }),
79
+ output: z.object({
80
+ items: z
81
+ .array(z
82
+ .object({
83
+ id: z.number().describe('ReliefWeb numeric report ID.'),
84
+ title: z.string().describe('Report title.'),
85
+ dateOriginal: z.string().optional().describe('Source publication date (ISO 8601).'),
86
+ dateCreated: z.string().optional().describe('ReliefWeb index date (ISO 8601).'),
87
+ primaryCountry: z.string().optional().describe('Primary country name for this report.'),
88
+ countries: z
89
+ .array(z.string())
90
+ .optional()
91
+ .describe('All countries tagged on this report.'),
92
+ sources: z
93
+ .array(z.string())
94
+ .optional()
95
+ .describe('Publishing organizations (short names).'),
96
+ formats: z.array(z.string()).optional().describe('Content format names.'),
97
+ themes: z.array(z.string()).optional().describe('Humanitarian theme/sector names.'),
98
+ languages: z.array(z.string()).optional().describe('Language codes (ISO 639-1).'),
99
+ urlAlias: z.string().optional().describe('Canonical ReliefWeb URL for this report.'),
100
+ fileUrls: z
101
+ .array(z.string())
102
+ .optional()
103
+ .describe('Direct file download URLs attached to this report.'),
104
+ headlineSummary: z
105
+ .string()
106
+ .optional()
107
+ .describe('Short editorial summary from the headline block, when present.'),
108
+ })
109
+ .describe('A matching report summary.'))
110
+ .describe('Matching reports (summaries only — use reliefweb_get_report for full body).'),
111
+ totalCount: z.number().describe('Total reports matching the query before pagination.'),
112
+ message: z
113
+ .string()
114
+ .optional()
115
+ .describe('Recovery hint when results are empty — echoes the filters applied and suggests how to broaden. Absent on successful result pages.'),
116
+ }),
117
+ async handler(input, ctx) {
118
+ ctx.log.info('reliefweb_search_reports', {
119
+ text: input.text,
120
+ country: input.country,
121
+ limit: input.limit,
122
+ });
123
+ const result = await getReliefWebService().searchReports({
124
+ ...(input.text?.trim() ? { text: input.text } : {}),
125
+ ...(input.country?.trim() ? { country: input.country.toUpperCase() } : {}),
126
+ ...(input.disaster_id != null ? { disasterId: input.disaster_id } : {}),
127
+ ...(input.format?.trim() ? { format: input.format } : {}),
128
+ ...(input.theme?.trim() ? { theme: input.theme } : {}),
129
+ ...(input.language?.trim() ? { language: input.language } : {}),
130
+ ...(input.source?.trim() ? { source: input.source } : {}),
131
+ ...(input.date_from?.trim() ? { dateFrom: input.date_from } : {}),
132
+ ...(input.date_to?.trim() ? { dateTo: input.date_to } : {}),
133
+ ...(input.sort?.trim() ? { sort: input.sort } : {}),
134
+ ...(input.include_archived != null ? { includeArchived: input.include_archived } : {}),
135
+ ...(input.filter != null ? { rawFilter: input.filter } : {}),
136
+ limit: input.limit,
137
+ offset: input.offset,
138
+ }, ctx);
139
+ if (result.items.length === 0) {
140
+ const filters = [];
141
+ if (input.text)
142
+ filters.push(`text="${input.text}"`);
143
+ if (input.country)
144
+ filters.push(`country=${input.country}`);
145
+ if (input.format)
146
+ filters.push(`format="${input.format}"`);
147
+ if (input.theme)
148
+ filters.push(`theme="${input.theme}"`);
149
+ return {
150
+ items: [],
151
+ totalCount: 0,
152
+ message: `No reports matched ${filters.length > 0 ? filters.join(', ') : 'the given filters'}. ` +
153
+ 'Try broadening the search by removing filters, using different keywords, or checking country codes.',
154
+ };
155
+ }
156
+ return { items: result.items, totalCount: result.totalCount };
157
+ },
158
+ format: (result) => {
159
+ const lines = [`**Total:** ${result.totalCount} reports`];
160
+ if (result.message)
161
+ lines.push(`\n> ${result.message}`);
162
+ for (const item of result.items) {
163
+ lines.push(`\n## ${item.title}`);
164
+ lines.push(`**ID:** ${item.id}`);
165
+ if (item.dateOriginal)
166
+ lines.push(`**Published:** ${item.dateOriginal}`);
167
+ if (item.dateCreated)
168
+ lines.push(`**Indexed:** ${item.dateCreated}`);
169
+ if (item.primaryCountry)
170
+ lines.push(`**Primary country:** ${item.primaryCountry}`);
171
+ if (item.countries?.length)
172
+ lines.push(`**Countries:** ${item.countries.join(', ')}`);
173
+ if (item.sources?.length)
174
+ lines.push(`**Sources:** ${item.sources.join(', ')}`);
175
+ if (item.formats?.length)
176
+ lines.push(`**Format:** ${item.formats.join(', ')}`);
177
+ if (item.themes?.length)
178
+ lines.push(`**Themes:** ${item.themes.join(', ')}`);
179
+ if (item.languages?.length)
180
+ lines.push(`**Languages:** ${item.languages.join(', ')}`);
181
+ if (item.headlineSummary)
182
+ lines.push(`\n${item.headlineSummary}`);
183
+ if (item.urlAlias)
184
+ lines.push(`**URL:** ${item.urlAlias}`);
185
+ if (item.fileUrls?.length)
186
+ lines.push(`**Files:** ${item.fileUrls.join(', ')}`);
187
+ }
188
+ return [{ type: 'text', text: lines.join('\n') }];
189
+ },
190
+ });
191
+ //# sourceMappingURL=search-reports.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-reports.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-reports.tool.ts"],"names":[],"mappings":"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"}