OSINT MCP Server for Claude Desktop
Ignifer is a Model Context Protocol (MCP) server that provides Claude Desktop with powerful Open Source Intelligence (OSINT) capabilities. It aggregates five authoritative data sources into a unified interface, enabling comprehensive intelligence briefings, entity research, transportation tracking, and multi-source deep dive analysis directly within your Claude conversations.
Real-time news intelligence from 65+ language sources worldwide via GDELT (Global Database of Events, Language, and Tone). Get synthesized briefings on any topic with automatic article extraction, translation support, and configurable time ranges.
Comprehensive country economic profiles using World Bank Open Data, organized by E-series analysis categories:
- E1 - Vulnerability Assessment: External debt, current account balance, reserves
- E2 - Trade Profile: Exports, imports, trade openness, trade balance
- E4 - Financial Indicators: Inflation, unemployment, FDI, domestic credit
Rich contextual data from Wikidata including:
- Entity profiles (people, organizations, vessels, locations)
- Aliases and alternative names
- Relationships and associated entities
- Government leadership and institutional context
- Cross-reference identifiers (Q-IDs, IMO numbers, etc.)
Real-time aircraft tracking via OpenSky Network:
- Track by callsign, tail number, or ICAO24 code
- Current position, altitude, heading, and speed
- 24-hour flight track history
- Aircraft type and registration details
Real-time vessel tracking via AISStream:
- Track by vessel name, IMO number, or MMSI
- Current position, speed, and course
- Destination and ETA information
- Vessel type and flag state
Comprehensive analysis correlating all available sources:
- Automatic source selection based on query type
- Concurrent querying of relevant sources
- Corroboration detection when sources agree
- Conflict identification when sources disagree
- Source attribution for every finding
Persistent metadata tracking for news source quality assessment:
- Automatic enrichment from GDELT data on first encounter
- IC-style reliability grades (A-F) for each source domain
- Political orientation tracking with region-specific axes
- Source ranking prioritizing regional and high-reliability sources
- User override capability with rollback to original values
- Multi-region detection for global topics
Toggle enhanced analytical output for professional analysts:
- ICD 203 confidence levels (REMOTE to ALMOST_CERTAIN)
- IC-standard phrasing: "We assess with moderate confidence..."
- Full source attribution with URLs and timestamps
- Academic citation formatting (bibliography)
- Analytical caveats and limitations
- Source quality assessments
| Source | Type | Quality | Auth Required |
|---|---|---|---|
| GDELT | Global news & events | Medium | No |
| World Bank | Economic indicators | High | No |
| Wikidata | Entity information | High | No |
| OpenSky | Aviation tracking | High | Yes (free) |
| AISStream | Maritime tracking | High | Yes (free) |
Ignifer exposes twelve tools to Claude Desktop:
Generate OSINT intelligence briefings on any topic.
briefing(topic: str, time_range: str | None = None, rigor: bool | None = None) -> str
Parameters:
topic- Topic to research (2-4 words recommended)time_range- Optional time filter:"last 24 hours","last 48 hours""last 7 days","last 30 days""this week","last week""2026-01-01 to 2026-01-08"(ISO date range)
rigor- Enable IC-standard output with confidence levels and citations
Example:
briefing("Syria", time_range="last 48 hours")
briefing("Ukraine", rigor=True) # IC-standard output
Extract full article content from any news URL.
extract_article(url: str) -> str
Parameters:
url- Full URL of the article to extract
Returns: Clean article text with ads and navigation removed.
Get comprehensive economic analysis for any country.
economic_context(country: str, rigor: bool | None = None) -> str
Parameters:
country- Country name (e.g., "Germany") or ISO code (e.g., "DEU")rigor- Enable IC-standard output with confidence levels and citations
Returns: Structured economic report with key indicators, vulnerability assessment, trade profile, and financial indicators.
Look up any entity and get comprehensive intelligence.
entity_lookup(name: str = "", identifier: str = "", rigor: bool | None = None) -> str
Parameters:
name- Entity name to search foridentifier- Alternative identifier (Wikidata Q-ID, IMO number, etc.)rigor- Enable IC-standard output with match confidence percentages
Returns: Entity profile with type, description, aliases, relationships, and cross-reference identifiers.
Example:
entity_lookup(name="Gazprom")
entity_lookup(identifier="Q102673", rigor=True) # Shows "87% match confidence (VERY_LIKELY)"
Track any aircraft by callsign, tail number, or ICAO24 code.
track_flight(identifier: str, rigor: bool | None = None) -> str
Parameters:
identifier- Callsign (UAL123), tail number (N12345), or ICAO24 coderigor- Enable IC-standard output with ADS-B coverage caveats
Returns: Current position, altitude, heading, speed, and 24-hour track history.
Note: Requires OpenSky OAuth2 credentials. Set IGNIFER_OPENSKY_CLIENT_ID and IGNIFER_OPENSKY_CLIENT_SECRET environment variables. Create API credentials at https://opensky-network.org/account
Track any vessel by name, IMO number, or MMSI.
track_vessel(identifier: str, rigor: bool | None = None) -> str
Parameters:
identifier- Vessel name, IMO number (IMO 9811000), or MMSI (367596480)rigor- Enable IC-standard output with AIS coverage caveats
Returns: Current position, speed, course, destination, and vessel details.
Note: Requires AISStream API key. Set IGNIFER_AISSTREAM_KEY environment variable.
Comprehensive multi-source analysis correlating all available data sources.
deep_dive(topic: str, focus: str | None = None, rigor: bool | None = None) -> str
Parameters:
topic- The subject to analyze (country, person, organization, vessel, event)focus- Optional focus area to emphasize (e.g., "economic", "entity", "aviation", "maritime")rigor- Enable IC-standard output with full source attribution and bibliography
Returns: Comprehensive analysis with:
- Automatic source selection based on query type
- News & events (GDELT)
- Economic context (World Bank)
- Entity profiles (Wikidata)
- Corroboration notes where sources agree
- Conflict markers where sources disagree
Example:
deep_dive("Myanmar")
deep_dive("Venezuela", focus="economic")
deep_dive("Roman Abramovich", rigor=True) # Full IC-standard analysis
Set the reliability grade for a news source domain.
set_source_reliability(domain: str, reliability: str) -> str
Parameters:
domain- The news source domain (e.g., "reuters.com", "scmp.com")reliability- Reliability grade A-F:- A = Completely reliable
- B = Usually reliable
- C = Fairly reliable
- D = Not usually reliable
- E = Unreliable
- F = Reliability cannot be judged
Example:
set_source_reliability("focustaiwan.tw", "B")
set_source_reliability("rt.com", "E")
Set the political orientation for a news source domain.
set_source_orientation(domain: str, orientation: str, axis: str | None = None) -> str
Parameters:
domain- The news source domainorientation- Political orientation description (e.g., "Pro-independence", "Center-right")axis- Optional orientation axis for context (e.g., "china-independence", "left-right")
Example:
set_source_orientation("focustaiwan.tw", "Pro-independence", "china-independence")
set_source_orientation("guardian.co.uk", "Center-left", "left-right")
Set the nation of origin for a news source domain.
set_source_nation(domain: str, nation: str) -> str
Parameters:
domain- The news source domainnation- Nation of origin (e.g., "Hong Kong", "Taiwan", "United States")
Example:
set_source_nation("scmp.com", "Hong Kong")
Get stored metadata for a news source domain.
get_source_metadata(domain: str) -> str
Parameters:
domain- The news source domain to inspect
Returns: Formatted metadata including nation, language, reliability grade, and political orientation.
Reset source metadata to original auto-enriched values.
reset_source_metadata(domain: str) -> str
Parameters:
domain- The news source domain to reset
Returns: Confirmation message or error if no original values exist to restore.
Rigor mode provides IC-standard analytical output suitable for professional intelligence products.
Per-query: Add rigor=True to any tool call:
briefing("Ukraine", rigor=True)
deep_dive("Venezuela", rigor=True)
Globally: Set environment variable:
export IGNIFER_RIGOR_MODE=trueOr in config file (~/.config/ignifer/config.toml):
rigor_mode = trueWhen enabled, output includes:
ICD 203 Confidence Levels:
- REMOTE (<5%), VERY_UNLIKELY (5-20%), UNLIKELY (20-45%)
- ROUGHLY_EVEN (45-55%), LIKELY (55-80%)
- VERY_LIKELY (80-95%), ALMOST_CERTAIN (>95%)
IC-Standard Phrasing:
- "We assess with moderate confidence (55-80%) that..."
- "It is very likely (80-95%) that..."
Source Attribution:
- Full URLs with retrieval timestamps
- Data freshness indicators (Fresh, Recent, Stale, Archived)
- Source quality tier (HIGH, MEDIUM, LOW)
Academic Citations:
Sources
═══════
GDELT Project. "Global Database of Events, Language, and Tone."
Retrieved 2026-01-10T14:32:00Z from https://api.gdeltproject.org/...
Data freshness: Fresh (<1 hour old)
World Bank. "World Development Indicators: Germany."
Retrieved 2026-01-10T14:32:15Z from https://api.worldbank.org/...
Data freshness: Recent (1-24 hours old)
Note: Data reflects point-in-time snapshot. URLs may change;
consider archiving via archive.org for permanent reference.
- Python 3.10+
- uv (package manager)
make installAdd to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"ignifer": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ignifer", "ignifer"]
}
}
}Or if installed globally:
{
"mcpServers": {
"ignifer": {
"command": "ignifer"
}
}
}For sources requiring authentication, set environment variables:
# OpenSky (Aviation Tracking - OAuth2)
export IGNIFER_OPENSKY_CLIENT_ID="your_client_id"
export IGNIFER_OPENSKY_CLIENT_SECRET="your_client_secret"
# AISStream (Maritime Tracking)
export IGNIFER_AISSTREAM_KEY="your_api_key"
# Rigor Mode (Optional - enables IC-standard output globally)
export IGNIFER_RIGOR_MODE=trueAlternatively, create a config file at ~/.config/ignifer/config.toml:
rigor_mode = true # Optional: enable rigor mode globally
# OpenSky OAuth2 credentials
opensky_client_id = "your_client_id"
opensky_client_secret = "your_client_secret"
# AISStream API key
aisstream_key = "your_api_key"ignifer/
├── server.py # FastMCP server with tool definitions
├── adapters/
│ ├── base.py # Base adapter protocol & error hierarchy
│ ├── gdelt.py # GDELT news adapter
│ ├── worldbank.py # World Bank economic data adapter
│ ├── wikidata.py # Wikidata entity adapter
│ ├── opensky.py # OpenSky aviation adapter
│ └── aisstream.py # AISStream maritime adapter
├── aggregation/
│ ├── entity_resolver.py # Tiered entity resolution system
│ ├── relevance.py # Source relevance engine
│ └── correlator.py # Multi-source correlation
├── confidence.py # ICD 203 confidence framework
├── citation.py # Academic citation formatting
├── rigor.py # Rigor mode output formatting
├── cache.py # SQLite-based response caching
├── config.py # Configuration management
├── models.py # Pydantic data models
├── output.py # Output formatting
├── source_metadata.py # Source quality tracking & management
└── timeparse.py # Time range parsing
All data source adapters implement the OSINTAdapter protocol:
source_name- Unique identifier for the sourcebase_quality_tier- Quality tier (HIGH, MEDIUM, LOW)query(params)- Execute a query against the sourcehealth_check()- Verify source availabilityclose()- Clean up resources
The aggregation layer provides intelligent source selection and correlation:
- SourceRelevanceEngine - Analyzes queries to identify relevant sources
- Correlator - Queries sources concurrently, detects corroboration/conflicts
- EntityResolver - Tiered entity matching (exact → normalized → Wikidata → fuzzy)
Ignifer uses SQLite-based caching with source-specific TTLs:
- GDELT: 1 hour
- World Bank: 24 hours
- Wikidata: 7 days
- OpenSky: 5 minutes
- AISStream: 15 minutes
All tools provide graceful degradation:
- Timeout errors suggest retry or query refinement
- Rate limiting returns helpful wait guidance
- Missing data offers alternative search suggestions
- Partial data returns available results with source attribution
- Authentication failures provide configuration guidance
# Run tests
make test
# Run linting
make lint
# Run type checking
make type-check
# Format code
make format
# Run all checks
make all
# Clean build artifacts
make clean# All tests
make test
# With coverage
uv run pytest --cov=ignifer --cov-report=term-missing
# Specific test file
uv run pytest tests/adapters/test_gdelt.py -v- Phase 1: Zero-Config OSINT (GDELT, World Bank, Wikidata)
- Phase 2: Transportation Tracking (OpenSky, AISStream)
- Phase 3: Multi-Source Correlation & Rigor Mode
- Phase 4: Source Quality Intelligence (reliability tracking, political orientation, regional prioritization)
- Enhancements to economic tool (trade network/resource security)
- Social media monitoring/trend analysis
- Infrastructure monitoring (power/internet/telecom outages)
- Strategic modeling (scenario modeling/actor capability/strategic impact)
- System Administration & Power Features
- Visualization
MIT License - see LICENSE file for details.
