About CatchAll
CatchAll is an MCP server for the NewsCatcher CatchAll Web Search API, for clients that need to discover relevant web pages and manage search jobs. It also exposes monitors, webhooks, projects, datasets, and entities.
Key features
- 01Submit and validate web searches
- 02Track jobs and retrieve results
- 03Create and manage search monitors
- 04Manage webhooks and projects
- 05Organize datasets and entities
Use cases
- 01Find web pages relevant to an event
- 02Run recurring searches with monitors
- 03Retrieve search results as CSV
- 04Organize searches in projects and datasets
MCP support
Exposes CatchAll search and management operations as tools for MCP clients. A hosted endpoint is available, or the server can be run locally or self-hosted.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://catchall-mcp.newscatcherapi.com/mcpclaude mcp add --transport http com-newscatcherapi-catchall https://catchall-mcp.newscatcherapi.com/mcp{"mcpServers":{"com-newscatcherapi-catchall":{"type":"http","url":"https://catchall-mcp.newscatcherapi.com/mcp"}}}Open in Cursor{"servers":{"com-newscatcherapi-catchall":{"type":"http","url":"https://catchall-mcp.newscatcherapi.com/mcp"}}}Open in VS Code{"mcpServers":{"com-newscatcherapi-catchall":{"type":"http","url":"https://catchall-mcp.newscatcherapi.com/mcp"}}}{"mcpServers":{"com-newscatcherapi-catchall":{"serverUrl":"https://catchall-mcp.newscatcherapi.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
https://catchall-mcp.newscatcherapi.com/mcpAuth requiredTools
61| Parameter | Type | Required | Description |
|---|---|---|---|
| mode | string | No | Optional job processing mode: `"lite"` (faster, lower cost, less detail) or `"base"` (default, full extraction). If omitted, the API defaults to `"base"`. |
| limit | any | No | Optional processing cap (minimum 10); affects cost. Omit to retrieve everything up to your plan's maximum. |
| query | string | Yes | Plain text search intent (required). |
| schema | string | No | Optional advanced custom JSON schema string that overrides the default extraction schema. Use `initialize_query` to discover a suitable schema. |
| api_key | string | No | CatchAll API key. Optional if provided via x-api-key header or CATCHALL_API_KEY env var. |
| context | string | No | Optional guidance on what to prioritize (for example, target entities, event types, and specific data points you want captured in enrichments). If a company dataset will be attached, note that entity-relevance validators (e.g. `company_is_primary_subject`) will be auto-generated — do not ask for them here. Do not mention things like "company list will be attached". |
| end_date | string | No | Optional ISO 8601 UTC end of search window. |
| project_id | string | No | Optional project ID to associate this job with. |
| start_date | string | No | Optional ISO 8601 UTC start of search window. |
| validators | any | No | Optional custom boolean validators (`name`, `description`, `type`), as array or JSON-string array. When `connected_dataset_ids` is set, do NOT include entity-relevance validators such as `company_is_primary_subject` — the API generates those automatically. Only add validators that describe the event or topic (e.g. `is_acquisition_event`). |
| enrichments | any | No | Optional custom enrichments (`name`, `description`, `type`), as array or JSON-string array. |
| webhook_ids | any | No | Optional list of webhook IDs to notify when the job completes (max 5 per job). Use `list_webhooks` / `create_webhook` to get IDs. |
| ed_score_min | any | No | Optional minimum entity-domain relevance score (1-10). Only relevant when `connected_dataset_ids` is set. |
| ed_association_type | string | No | Optional filter on how strongly a watchlist entity must appear in each event. Only relevant when `connected_dataset_ids` is set. - `"event_associated"`: keep only events where the entity is a **direct actor** (default when connected_dataset_ids is set). - `"mention"`: keep all even where the entity is **merely referenced**. |
| connected_dataset_ids | any | No | Optional list of dataset IDs whose entities narrow the retrieval scope. When set: (1) entity filtering is applied automatically — do NOT mention the company list or watchlist in `query`; (2) entity-relevance validators such as `company_is_primary_subject` are generated automatically — do NOT add them to `validators`. `ed_score_min` defaults to 2 if not provided. |
| fetch_all_watchlist_news | boolean | No | When `True`, retrieves **all** news for connected watchlist entities without applying topic filtering from `query`. Requires `connected_dataset_ids` to be set. Default: `False`. |
Details
From the project READMENewscatcher CatchAll MCP Server
MCP server for the NewsCatcher CatchAll Web Search API.
Quick Start — Use Our Hosted Server
You don't need to clone or run this repo to use the MCP — NewsCatcher runs a hosted instance:
https://catchall-mcp.newscatcherapi.com/mcp?apiKey=YOUR_CATCHALL_API_KEY
Get a CatchAll API key at platform.newscatcherapi.com, then connect:
{
"mcpServers": {
"catchall": {
"type": "http",
"url": "https://catchall-mcp.newscatcherapi.com/mcp?apiKey=YOUR_CATCHALL_API_KEY"
}
}
}
Or via Claude Code CLI:
claude mcp add --transport http catchall "https://catchall-mcp.newscatcherapi.com/mcp?apiKey=YOUR_CATCHALL_API_KEY"
Full integration docs: https://www.newscatcherapi.com/docs/web-search-api/integrations/mcp
Prefer to run the server yourself (locally or self-hosted)? See Running below.
Tool To Endpoint Mapping
Jobs
| MCP Tool | Method | Endpoint |
|---|---|---|
initialize_query | POST | /catchAll/initialize |
submit_query | POST | /catchAll/submit |
validate_query | POST | /catchAll/validate |
continue_job | POST | /catchAll/continue |
list_user_jobs | GET | /catchAll/jobs/user |
get_job_status | GET | /catchAll/status/{job_id} |
pull_results | GET | /catchAll/pull/{job_id} |
pull_job_csv | GET | /catchAll/pull/{job_id}/csv |
delete_job | DELETE | /catchAll/jobs/{job_id} |
Job listing filters:
list_user_jobssupportssearch,ownership,project_id, andmode(baseorlite) filters in addition topage/page_size.
Monitors
| MCP Tool | Method | Endpoint |
|---|---|---|
create_monitor | POST | /catchAll/monitors/create |
update_monitor | PATCH | /catchAll/monitors/{monitor_id} |
delete_monitor | DELETE | /catchAll/monitors/{monitor_id} |
list_monitors | GET | /catchAll/monitors/ |
list_monitor_jobs | GET | /catchAll/monitors/{monitor_id}/jobs |
get_monitor_status | GET | /catchAll/monitors/{monitor_id}/status |
pull_monitor_results | GET | /catchAll/monitors/pull/{monitor_id} |
pull_monitor_csv | GET | /catchAll/monitors/pull/{monitor_id}/csv |
enable_monitor | POST | /catchAll/monitors/{monitor_id}/enable |
disable_monitor | POST | /catchAll/monitors/{monitor_id}/disable |
Webhooks
| MCP Tool | Method | Endpoint |
|---|---|---|
list_webhooks | GET | /catchAll/webhooks |
create_webhook | POST | /catchAll/webhooks |
get_webhook | GET | /catchAll/webhooks/{webhook_id} |
update_webhook | PATCH | /catchAll/webhooks/{webhook_id} |
delete_webhook | DELETE | /catchAll/webhooks/{webhook_id} |
test_webhook | POST | /catchAll/webhooks/{webhook_id}/test |
assign_webhook_resource | POST | /catchAll/webhooks/{webhook_id}/resources |
list_webhook_resources | GET | /catchAll/webhooks/{webhook_id}/resources |
remove_webhook_resource | DELETE | /catchAll/webhooks/{webhook_id}/resources/{resource_type}/{resource_id} |
list_resource_webhooks | GET | /catchAll/resources/{resource_type}/{resource_id}/webhooks |
get_webhook_history | GET | /catchAll/webhook-history |
trigger_webhook | POST | /catchAll/webhook/trigger/{resource_type}/{resource_id} |
Webhook notes:
create_webhookaccepts an optionalproject_idto attach the webhook to a project on creation.list_webhooksalso accepts an optionalproject_idto filter to webhooks belonging to a specific project.get_webhook_historyqueries in one of two modes — passresource_type+resource_idfor a job/monitor/monitor_group's deliveries, or passwebhook_idfor everything delivered through one webhook (exactly one mode per call). Manual test deliveries (test_webhook) only appear in webhook mode and are recorded withresource_type: "test".
Projects
| MCP Tool | Method | Endpoint |
|---|---|---|
create_project | POST | /catchAll/projects/ |
list_projects | GET | /catchAll/projects/ |
get_project | GET | /catchAll/projects/{project_id} |
update_project | PATCH | /catchAll/projects/{project_id} |
delete_project | DELETE | /catchAll/projects/{project_id} |
get_project_overview | GET | /catchAll/projects/{project_id}/overview |
add_project_resources | POST | /catchAll/projects/{project_id}/resources |
list_project_resources | GET | /catchAll/projects/{project_id}/resources |
remove_project_resource | DELETE | /catchAll/projects/{project_id}/resources/{resource_type}/{resource_id} |
Project resources:
resource_typeis one ofjob,monitor,dataset,monitor_group, orwebhook. A webhook can belong to several projects at once.delete_projectwithdelete_resources=truedeletes the contained jobs, monitors, datasets, and monitor groups, but webhooks are only detached — never deleted — and the response'sdeleted_resourcesreports them under awebhook_unlinkedcount.
Datasets
| MCP Tool | Method | Endpoint |
|---|---|---|
create_dataset | POST | /catchAll/datasets/ |
list_datasets | GET | /catchAll/datasets/ |
get_dataset | GET | /catchAll/datasets/{dataset_id} |
update_dataset | PATCH | /catchAll/datasets/{dataset_id} |
delete_dataset | DELETE | /catchAll/datasets/{dataset_id} |
add_dataset_entities | POST | /catchAll/datasets/{dataset_id}/entities |
remove_dataset_entities | DELETE | /catchAll/datasets/{dataset_id}/entities |
list_dataset_entities | POST | /catchAll/datasets/{dataset_id}/entities/list |
get_dataset_status | GET | /catchAll/datasets/{dataset_id}/status |
create_dataset_from_csv | POST | /catchAll/datasets/upload |
append_csv_to_dataset | POST | /catchAll/datasets/{dataset_id}/upload |
CSV uploads (v1.6.1):
create_dataset_from_csvandappend_csv_to_datasettake the CSV content in thefileparameter — raw CSV text or standard base64. They never read a path from the server's filesystem, so they stay safe on a remote/hosted MCP. Inline CSV content is capped at a hard 10 MB (after base64 decoding).create_dataset_from_csvalso accepts the new optionalproject_idfield.
Entities
| MCP Tool | Method | Endpoint |
|---|---|---|
create_entity | POST | /catchAll/entities/ |
list_entities | GET | /catchAll/entities/ |
create_entities_batch | POST | /catchAll/entities/batch |
get_entity | GET | /catchAll/entities/{entity_id} |
update_entity | PATCH | /catchAll/entities/{entity_id} |
delete_entity | DELETE | /catchAll/entities/{entity_id} |
external_entity_id(v1.6.3):create_entityandupdate_entityaccept an optionalexternal_entity_idstring — a customer-supplied identifier that links the entity to a record in an external system.project_id(v1.8.0):list_entitiesaccepts an optionalproject_idto filter to entities belonging to a specific project.
Source Groups
| MCP Tool | Method | Endpoint |
|---|---|---|
list_source_groups | GET | /catchAll/source-groups |
Source groups (v1.8.0): named, reusable domain allowlists (public groups plus any organization-visibility groups your organization can access).
list_source_groupsreturns each group'sslug,name, anddescription. The direct API'sPOST /catchAll/submitnow accepts asource_groupsfield of slugs to scope fetching to a domain allowlist;submit_querydoes not yet expose this parameter — use the direct API for that until a future release adds it here.
User & Meta
| MCP Tool | Method | Endpoint |
|---|---|---|
get_user_limits | POST | /catchAll/user/limits |
check_health | GET | /health |
get_version | GET | /version |
Authentication
API key precedence (highest to lowest):
api_keytool parameterx-api-keyrequest headerAuthorization: Bearer <key>request header- URL query parameter
?apiKey=... CATCHALL_API_KEYenvironment variable
check_health and get_version do not require API key auth.
Hosted deployment (FastMCP Gateway)
When deployed via fastmcp.app, a stateless gateway sits in front of the server. The gateway
forwards HTTP headers to the backend but not URL query parameters. Use the x-api-key
header or CATCHALL_API_KEY environment variable instead of ?apiKey=.
Claude Code / Cursor:
{
"mcpServers": {
"catchall": {
"type": "http",
"url": "https://YOUR-DEPLOYMENT.fastmcp.app/mcp",
"headers": { "x-api-key": "YOUR_API_KEY" }
}
}
}
Or via CLI:
claude mcp add --transport http catchall "https://YOUR-DEPLOYMENT.fastmcp.app/mcp" \
--header "x-api-key: YOUR_API_KEY"
Direct server access (no gateway): ?apiKey=YOUR_KEY in the URL still works.
Core Workflow (Jobs)
- Optional: call
initialize_queryto preview validators/enrichments/date window. initialize_queryis preview-only (it does not create a job) and suggestions are non-deterministic.- Submit with
submit_query(queryrequired). You can send onlyquery; omitted optional fields are auto-selected/generated. - Optional fields are independent: provide any subset (for example, custom
validatorsonly), omitted ones are still auto-generated. start_date/end_datefilter web page discovery dates, not event dates in extracted content.- For event-time accuracy, use event-focused validators/enrichments and verify
event_datein pulled results. - Poll
get_job_status: first check after ~1-2 minutes, then every 30-60 seconds, stop oncompletedorfailed. - Pull with
pull_results; partial data appears duringenriching. - Paginate while
page < total_pagesto retrieve all available records. - Use
continue_jobonly to process more records (cost-affecting). It applies only to jobs originally submitted withlimit. continue_job.new_limitis optional; if omitted, API defaults to your plan maximum.page/page_size/total_pagesrepresent already-available records; useprogress_validated < candidate_recordsto detect if more records may still appear.
Limit vs Page Size
limit(submit_query,continue_job) controls how many records are processed and therefore affects cost. If provided, must be >= 10. Omit to retrieve everything up to your plan's maximum.page_size(pull_results,list_user_jobs) controls pagination only and does not affect processing cost.pull_results.page_sizedefault is100.page_sizerange is1..1000.pull_resultsresponse includeserror(failed jobs) andlimit(applied job limit).
API-Enforced Monitor Constraints
create_monitor.backfill=true: reference jobend_datemust be within the last 7 days.create_monitor.backfill=false: reference job age constraint does not apply.- Monitor minimum schedule frequency depends on plan.
create_monitorsupports optionallimit(minimum10),backfill(defaulttrue),timezone,webhook_ids, andproject_id.- Webhooks are centralized in v1.5.3: register them with
create_webhook, then attach by ID viacreate_monitor.webhook_ids/update_monitor.webhook_ids(no inline webhook config). - Monitors are only supported for
basejobs (notlite). enable_monitorsupports optionalbackfill.update_monitorupdateswebhook_ids, runlimit,schedule, and/ortimezone(passwebhook_ids=[]to clear assignments;timezoneis ignored unlessscheduleis also set).list_monitorssupports pagination viapageandpage_sizeplussearch,ownership, andproject_idfilters; it returnstotal,page,page_size,total_pages,monitors.
Enrichment Output Notes
enrichment.enrichment_confidenceis always present.- Company enrichments are structured objects with:
source_textconfidencemetadata.namemetadata.domain_urlmetadata.domain_url_confidence
Error Handling
Tools return:
- Pretty JSON string on success.
- (v1.8.0) An MCP tool error (
isError=True) for any upstream non-2xx response (badapi_key, invalid/foreignproject_id, not-found ids, validation failures, etc.) or unhandled exception. The error message carries the upstream status code and message, for exampleAPI Error (401): Api key not found. Before v1.8.0, tools swallowed these failures and returned a plain"Error: ..."string as a successful tool result — clients checking onlyisErrorwould see a false success. That has been fixed: every tool now raises aToolErrorinstead of returning an error string, so failures are always reported as real tool errors.
Running
Install dependencies:
pip install -r requirements.txt
Run over stdio:
python server.py
Run over HTTP (if fastmcp CLI is available):
fastmcp run server.py:mcp --transport streamable-http --host 0.0.0.0 --port 8000
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.