Informa Events Directory MCP Server
# Informa Events Directory MCP Server
MCP server for querying and retrieving structured event data from the Informa Connect event directory.
## Available Tools
Default (always available):
1. `get_informa_events`
Returns normalized events across all pages (API-first, HTML fallback).
2. `get_informa_events_page`
Returns a single directory page with normalized results.
3. `get_informa_events_by_date_range`
Returns normalized events constrained by `dateFrom` / `dateTo`.
4. `list_informa_event_facets`
Returns raw and simplified facet/filter metadata for the current query context.
5. `find_informa_event`
Finds one event by `id`, `slug`, `url`, or `name`.
6. `get_informa_event_detail`
Fetches one event page and extracts richer detail (JSON-LD event data, offers/pricing hints, contact hints, speaker extraction).
7. `get_informa_events_with_details`
Fetches directory events and bulk-enriches each with event-page details using configurable concurrency (including speaker extraction).
8. `get_informa_events_chunk`
Cursor-based chunked retrieval for large exports to avoid oversized single responses.
9. `get_informa_event_speakers`
Fetches one event page and returns speaker records only, with source selection (`merged`, `jsonld`, `redux`).
Feature-flagged (disabled by default):
10. `get_informa_discovery_suggestions` (feature-flagged)
Calls the discovery suggestions endpoint and returns raw JSON.
11. `search_informa_module_speakers` (feature-flagged)
Calls the discovery module speakers endpoint and returns raw JSON.
12. `search_informa_module_spex` (feature-flagged)
Calls the discovery module spex endpoint and returns raw JSON.
## Core Retrieval Behavior
- Primary data source: `POST https://informaconnect.com/api/v1/discovery/hub-search/pages/events`
- Fallback source: parse `window.__REDUX_STORE__` from HTML pages
- API payload optimization:
- `includeFacets=false` (default) sends a disabled `facetsConfig` to reduce payload size
- `includeFacets=true` enables facet payloads when needed
- Chunk export support:
- `get_informa_events_chunk` returns `hasMore` + `nextCursor`
- cursor can be passed back to continue where the previous chunk stopped
- Pagination stop conditions:
- Empty page
- Reached reported `totalPages`
- `maxPages` safety cap
- Two consecutive pages with no new unique events
- Retry/backoff for `429` and `5xx`
- Missing fields normalize to `null` or empty arrays
## Normalized Event Output
Each normalized event includes (if available):
- `eventName`
- `eventUrl`
- `description`
- `location.city`
- `location.venue`
- `location.country`
- `startDate`
- `endDate`
- `eventType`
- `subBrand`
- `industryOrCategory`
- `pricing` (currently usually `null` in discovery responses)
- `contactInfo` (currently usually `null` in discovery responses)
Plus additional enrichment fields (`eventId`, `sectors`, `topics`, `deliveryTypes`, etc.).
For detail tools, the event-detail payload also includes:
- `speakers[]` (merged/deduped from JSON-LD `performer` and Redux `speakers` when available)
- `speakerSources` (counts by source and total)
For speaker-only retrieval (`get_informa_event_speakers`), the response includes:
- `speakers[]`
- `speakerCount`
- `speakerSource` (requested mode)
- `speakerSources` (available totals by source)
- `eventMeta` (event name, dates, and location)
When `responseMode` is set to `"slim"`, each event is reduced to:
- `eventId`
- `eventName`
- `eventUrl`
- `startDate`
- `endDate`
- `location`
- `eventType`
- `subBrand`
- `sectors`
- `topics`
- `deliveryTypes`
When `responseMode` is set to `"summary"`, each event is reduced further to:
- `eventId`
- `eventName`
- `eventUrl`
- `startDate`
- `endDate`
- `city`
- `country`
- `venue`
- `eventType`
- `subBrand`
- `deliveryTypes`
## Install
```bash
npm install
npm run build
```
## MCP Config Example
Use [mcp-config.example.json](/Users/william.kitchin/Library/Mobile Documents/com~apple~CloudDocs/Codex Projects/Informa Events Directory MCP Server/mcp-config.example.json).
Example:
```json
{
"mcpServers": {
"informa-events-directory": {
"command": "/absolute/path/to/informa-events-directory-mcp/build/index.js"
}
}
}
```
## Example Calls
### 1) Full crawl
```json
{
"tool": "get_informa_events",
"arguments": {
"pageSize": 100,
"maxPages": 50,
"subBrandFilter": "Informa Connect",
"eventTypeFilter": "EVENT",
"requestedSortType": "DATE",
"includeFacets": false,
"responseMode": "slim"
}
}
```
### 2) Single page fetch
```json
{
"tool": "get_informa_events_page",
"arguments": {
"page": 2,
"pageSize": 20
}
}
```
### 3) Date-range query
```json
{
"tool": "get_informa_events_by_date_range",
"arguments": {
"dateFrom": "2026-08-01",
"dateTo": "2026-08-31",
"pageSize": 100,
"maxPages": 20,
"countryFilter": "US",
"responseMode": "slim"
}
}
```
### 4) Find an event by slug
```json
{
"tool": "find_informa_event",
"arguments": {
"identifier": "imn-btr-spring",
"identifierType": "slug",
"includeDetail": true
}
}
```
### 5) Fetch event detail page
```json
{
"tool": "get_informa_event_detail",
"arguments": {
"slug": "imn-btr-spring",
"includeDirectoryRecord": true
}
}
```
Detail response includes `detail.speakers` and `detail.speakerSources` when speaker metadata is present on the event page.
### 6) Bulk enrich many events with detail pages
```json
{
"tool": "get_informa_events_with_details",
"arguments": {
"pageSize": 20,
"maxPages": 5,
"detailMaxEvents": 40,
"detailConcurrency": 3,
"stopOnDetailError": false
}
}
```
### 7) Cursor-based chunk retrieval
```json
{
"tool": "get_informa_events_chunk",
"arguments": {
"pageSize": 100,
"chunkPages": 2,
"requestedSortType": "DATE",
"responseMode": "summary",
"includeFacets": false
}
}
```
Then continue with returned `nextCursor`:
```json
{
"tool": "get_informa_events_chunk",
"arguments": {
"cursor": "<nextCursor-from-previous-response>",
"chunkPages": 2
}
}
```
### 8) Suggestions endpoint (feature-flagged)
```json
{
"tool": "get_informa_discovery_suggestions",
"arguments": {
"searchInput": "biotech",
"pageSize": 5
}
}
```
### 9) Event speakers (single event)
```json
{
"tool": "get_informa_event_speakers",
"arguments": {
"slug": "pharma-forum",
"speakerSource": "merged"
}
}
```
### 10) Speakers module endpoint (feature-flagged)
```json
{
"tool": "search_informa_module_speakers",
"arguments": {
"speakers": [
{
"siteId": "example-site-id",
"contentType": "SPEAKER",
"displayType": "LIST"
}
]
}
}
```
### 11) Spex module endpoint (feature-flagged)
```json
{
"tool": "search_informa_module_spex",
"arguments": {
"spexs": [{ "eventId": "c8b90e9b-548d-44a5-823f-f01ed5d08c13" }]
}
}
```
## Useful Query Parameters
- `includeFacets` (`boolean`, default `false`): include discovery facets in API responses
- `responseMode` (`"full" | "slim" | "summary"`, default `"full"`): control event payload size
- `countryFilter` (`string | string[]`): alias merged into `locationFilter`
- `deliveryTypeFilter` (`string | string[]`): e.g. `"PHYSICAL"`, `"VIRTUAL"`, `"ON_DEMAND"`
- `sectorsFilter`, `topicsFilter`, `locationFilter`: facet-driven filtering inputs
- `cursor` + `chunkPages`: resume and control chunk-sized retrieval with `get_informa_events_chunk`
- `speakerSource` (`"merged" | "jsonld" | "redux"`): source selection for `get_informa_event_speakers`
## Speaker Retrieval Notes
- `get_informa_event_speakers` is the recommended tool when you only need speaker data.
- Speaker extraction works from event-page HTML, not directory listing API pages.
- Source priority for quality is typically JSON-LD `performer`, then Redux `speakers`.
- `speakerSource="merged"` returns deduped speakers from both sources.
## Response Metadata Notes
For multi-page tools (`get_informa_events`, `get_informa_events_by_date_range`, `get_informa_events_with_details`), response metadata includes:
- `totalResultsReported` and `apiReportedTotalCount`
- `totalPagesReported` and `apiReportedTotalPages`
- `isComplete` (whether retrieval completed naturally vs. capped by `maxPages`)
## Optional Environment Variables
```bash
INFORMA_ENTRY_URL="https://informaconnect.com/events/?subBrands%5B0%5D=Informa%20Connect&availableSubBrands%5B0%5D=Informa%20Connect&requestedSortType=FEATURED&page=1&count=20&searchInput=&type%5B0%5D=EVENT"
INFORMA_ORIGIN="https://informaconnect.com"
INFORMA_DEFAULT_PAGE_SIZE=20
INFORMA_DEFAULT_MAX_PAGES=200
INFORMA_REQUEST_TIMEOUT_MS=15000
INFORMA_MAX_RETRIES=4
INFORMA_ENABLE_SUGGESTIONS_TOOL=false
INFORMA_ENABLE_MODULE_TOOLS=false
```
Set `INFORMA_ENABLE_SUGGESTIONS_TOOL=true` and/or `INFORMA_ENABLE_MODULE_TOOLS=true` to expose the optional discovery tools.
## Limitations
- Discovery API is unofficial and may change.
- Some event metadata (pricing/contact) is not consistently present in discovery payloads.
- Facet metadata may be empty for some query contexts.
- HTML fallback relies on Redux state being embedded in the page.
- Anti-bot/CDN protections can affect reliability at higher request volume.
- `modules/speakers` request shape is not publicly documented and may return `422` unless exact speaker payload objects are provided.
- Speaker extraction quality depends on event-page metadata consistency; JSON-LD `performer` is usually the cleanest source.
- `search_informa_module_speakers` is included for experimentation, but event-page speaker extraction is currently the more reliable path.
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one retrieves speakers for a specific event, the other bulk-enriches events with details. No overlap in functionality.
Both tools follow a consistent 'get_informa_<resource>' pattern, using snake_case and clear descriptors ('event_speakers' vs 'events_with_details').
With only 2 tools, the server feels underdeveloped for an events directory. Key operations like searching, filtering, or retrieving single events are missing, making it too sparse for the domain.
The server lacks fundamental operations for an events directory, such as listing all events, searching, or getting individual event details. The two tools cover only speaker retrieval and bulk enrichment, leaving major gaps.