# GeoRisk Site Screener: flood risk, contamination, EUDR (`translucent_wire/georisk-site-intelligence`) Actor

Site risk screening for any coordinates, address or plot: flood risk, climate risk (heat, drought), up-gradient contamination for pre-Phase I environmental due diligence, EUDR deforestation and protected areas, and solar potential. A-F grades, a red/yellow/green verdict and a PDF-ready report.

- **URL**: https://apify.com/translucent_wire/georisk-site-intelligence.md
- **Developed by:** [Ghulam Nabi](https://apify.com/translucent_wire) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $250.00 / 1,000 site risk screeneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GeoRisk Site Screener: flood, contamination, EUDR and solar for any location

**Know if a site is a deal-breaker before you spend thousands on consultants.** Give this Actor coordinates, a street address or a plot polygon anywhere in the world. Within about a minute you get **150+ data fields**, **7 risk scores with A–F grades**, a **RED / YELLOW / GREEN deal verdict** with plain-English next steps, and a **branded executive report** you can print to PDF and send to your client.

No API keys needed. No GIS skills. Works in 190+ countries. Optionally add your own Open-Meteo key to unlock river discharge and air quality.

- 🌊 **Flood & drainage**: 3×3 terrain grid, slope, drainage direction, ponding index, distance and height above the nearest river, and extreme rainfall. With an Open-Meteo key: 20 years of river discharge, 10- and 100-year flood peaks (Gumbel) and a 30-day river forecast
- ☣️ **Pre-Phase I contamination scan**: fuel stations, dry cleaners, landfills, industrial land, scrap yards, wastewater works and substations within your radius, each labelled **up-gradient, down-gradient or on-site** by comparing its ground height with the site
- 🌳 **EUDR & ecology**: inside or near forest, protected areas, wetlands and rivers, plus the EU country risk benchmark
- 🔥 **Climate extremes**: days above 35 °C and 40 °C, tropical nights, cooling/heating degree-days, 50 mm cloudbursts, wettest day, strongest winds, and the hot-day trend
- 💧 **Drought & water security**: UNEP aridity index (rainfall ÷ evapotranspiration), water deficit, longest dry spell, rainfall trend
- 😷 **Air quality vs WHO 2021 guidelines** (with an Open-Meteo key): PM2.5, PM10, NO₂, ozone, desert dust and UV over the last 12 months
- ☀️ **Solar PV bankability**: irradiation, kWh/kWp, annual MWh, revenue, payback, LCOE, NPV and CO₂ avoided for a system size you choose
- 📄 **Branded executive report** per site with gauges, the elevation matrix, the up/down-gradient source table and the solar math, plus a **SHA-256 hash** so anyone can verify the data was not edited

### Who uses it

| You are | You use it to |
|---|---|
| **Commercial real estate buyer, lender or broker** | Screen 50 listings in an afternoon and order a full Phase I ESA only for the sites that pass |
| **Environmental consultant / engineer** | Get the desktop part of a Phase I or a site visit plan done in minutes: up-gradient sources, drainage, wetlands, flood context |
| **Solar developer** | Rank land parcels by yield, payback, slope, flood risk and protected-area conflicts before you call landowners |
| **EUDR importer (cocoa, coffee, palm oil, rubber, soy, cattle, wood)** | Flag supplier plots that sit in or near forest or protected areas, with plot area from the polygon |
| **Insurer or underwriter** | Add flood, heat, drought and wind indicators to every address in a portfolio |

### Example (real run, October 2026)

*Industrial lot near the Houston Ship Channel, Texas: use case "general".*

| Category | Score | Grade | Why |
|---|---|---|---|
| Flood & drainage | 54 | D | Creek 26 m away at the same height as the site, flat ground, 205 mm wettest day |
| Contamination | 67 | F | 12 mapped sources in 1.5 km, 8 of them up-gradient (industrial land 264 m east, 2 m higher) |
| Climate & heat | 62 | F | 167 tropical nights a year, cloudbursts above 200 mm |
| Solar PV | 1,304 kWh/kWp | C | 500 kWp ≈ 652 MWh a year, payback ≈ 6.3 years at $0.12/kWh |
| **Verdict** | **YELLOW** | | Next step: Phase I ESA records review for the up-gradient industrial site, flood map check |

### How to use it

1. Paste your sites into **Sites to screen** (coordinates, addresses or GeoJSON polygons), or list addresses one per line.
2. Choose a **use case**: general, commercial real estate, solar, EUDR or insurance. This sets the score weights and the deal-breaker rules.
3. Optional: change the **search radius**, the **solar finance inputs**, and add your **logo, colour and client name** for white-label reports.
4. Click **Start**. Download the results as Excel, CSV or JSON. Each row has a `reportUrl` to the branded report.

#### Input example

```json
{
  "locations": [
    {"id": "lot-12", "name": "Warehouse lot", "latitude": 29.7355, "longitude": -95.2310},
    {"id": "farm-88", "polygon": {"type": "Polygon", "coordinates": [[[-6.600, 5.790], [-6.590, 5.790], [-6.590, 5.800], [-6.600, 5.800], [-6.600, 5.790]]]}},
    {"address": "Kaukauna, Wisconsin"}
  ],
  "useCase": "real_estate",
  "radiusMeters": 1500,
  "solarSystemKwp": 500,
  "brandName": "Your Company"
}
```

### Output fields

Every row is flat, so it opens cleanly in Excel. The main fields:

**Location**: `locationId`, `locationName`, `latitude`, `longitude`, `formattedAddress`, `countryCode`, `country`, `state`, `county`, `municipality`, `postcode`, `osmLandUseClass`, `containingLandUse`, `polygonAreaHa`

**Terrain**: `elevationM`, `elevationGrid3x3`, `elevationOuterRing450m`, `slopePercent`, `slopeDegrees`, `aspectDegrees`, `drainageDirection`, `regionalDrainageDirection`, `tpi90m`, `tpi450m`, `higherNeighborCount`, `localReliefM`, `terrainPosition`, `pondingIndex`

**Flood & rivers**: `riverDischargeMeanM3s`, `riverDischargeMedianM3s`, `riverDischargeP95M3s`, `riverDischargeP99M3s`, `riverDischargeMaxRecordedM3s`, `riverDischargeMedianAnnualMaxM3s`, `discharge10yrM3s`, `discharge100yrM3s`, `peakToMeanRatio`, `p95SurgeAnomalyPct`, `riverSizeClass`, `forecastMaxDischargeM3s`, `forecastEnsembleMaxM3s`, `forecastP75MaxM3s`, `forecastExceedsP95`, `nearestWaterwayName`, `nearestWaterwayType`, `nearestWaterwayDistanceM`, `heightAboveNearestWaterwayM`, `floodRiskScore`, `floodGrade`, `floodDrivers`

**Climate**: `climatePeriod`, `meanAnnualTmaxC`, `hotDays35PerYear`, `extremeHeatDays40PerYear`, `tropicalNightsPerYear`, `frostDaysPerYear`, `coolingDegreeDaysPerYear`, `heatingDegreeDaysPerYear`, `hotDaysTrendPerDecade`, `tmaxTrendCPerDecade`, `annualPrecipitationMm`, `heavyRainDays50mmPerYear`, `maxOneDayRainMm`, `maxFiveDayRainMm`, `maxWindSpeedMs`, `climateRiskScore`, `climateGrade`

**Drought**: `annualEt0Mm`, `aridityIndex`, `aridityClass`, `waterDeficitMm`, `longestDrySpellDays`, `precipitationTrendPctPerDecade`, `droughtRiskScore`, `droughtGrade`

**Solar PV**: `ghiKwhM2Year`, `planeOfArrayKwhM2Year`, `specificYieldKwhPerKwp`, `solarSystemKwp`, `annualGenerationMwh`, `capacityFactorPct`, `annualRevenueUsd`, `capexUsd`, `annualOpexUsd`, `simplePaybackYears`, `lcoeUsdPerKwh`, `npvUsd`, `co2AvoidedTonnesPerYear`, `solarViabilityScore`, `solarGrade`

**Air quality**: `pm25MeanUgM3`, `pm25WhoRatio`, `daysAbovePm25Guideline`, `pm10MeanUgM3`, `pm10WhoRatio`, `no2MeanUgM3`, `no2WhoRatio`, `ozoneMeanDailyMax8hUgM3`, `ozonePeakSeasonUgM3`, `ozoneDaysAbove100`, `dustMeanUgM3`, `dustP95UgM3`, `uvIndexMax`, `airQualityRiskScore`, `airQualityGrade`

**Contamination (pre-Phase I)**: `contaminationSourcesCount`, `upGradientSourcesCount`, `nearestSourceType`, `nearestSourceDistanceM`, `nearestUpGradientSourceType`, `nearestUpGradientSourceName`, `nearestUpGradientSourceDistanceM`, `fuelStationsWithin500m`, `dryCleanersWithin500m`, `industrialSitesWithin1000m`, `landfillsWithinRadius`, `sensitiveHumanReceptors`, `contaminationSources` (each with distance, direction, height vs site, gradient and risk points), `contaminationRiskScore`, `contaminationGrade`

**EUDR & ecology**: `insideProtectedArea`, `protectedAreaName`, `nearestProtectedAreaDistanceM`, `insideForest`, `nearestForestDistanceM`, `forestFeatureCount`, `insideWetland`, `nearestWetlandDistanceM`, `wetlandCount`, `waterwayCount`, `waterBodyCount`, `eudrCountryRiskBenchmark`, `ecologicalReceptors`, `ecologicalRiskScore`, `ecologicalGrade`

**Verdict**: `compositeRiskScore`, `overallGrade`, `verdict`, `dealBreakers`, `cautions`, `recommendations`, `executiveSummary`, `summarySource`, `reportUrl`, `dataUrl`, `sha256`, `warnings`, `dataSourcesOk`

### How the scores work

- **Risk scores** run from 0 (no concern) to 100 (severe). Grades: A ≤ 15, B ≤ 30, C ≤ 45, D ≤ 60, F above 60. The **solar score** is the other way round: 100 = excellent.
- **Up-gradient** means the source's ground is higher than the site by more than 1.5 m (more for distant sources), or uphill along the site's slope. This follows the usual desktop practice of inferring groundwater flow from surface topography.
- **Combined risk** = 70% weighted average + 30% worst category, so one severe problem is never averaged away. Weights depend on the use case.
- **RED** when there is a deal-breaker: severe flood or contamination score, a fuel station, dry cleaner, landfill or scrap yard on the site or up-gradient within 150 m, a site inside a protected area, or (EUDR use case) a plot inside mapped forest. **YELLOW** when any category is 45 or more. Otherwise **GREEN**.
- The summary is written by built-in rules. If you add your own OpenAI or Gemini key, the AI rewrites it from the computed facts only.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Site screened (all 150+ fields, scores, verdict) | **$0.25** |
| Branded executive report (optional) | **$1.00** |

Sites where too few data sources answer are returned **free**, with a warning. Your own Open-Meteo key (optional) is billed by Open-Meteo, not by this Actor. A desktop Phase I ESA usually costs thousands of dollars and takes weeks; use this Actor to decide which sites deserve one.

Examples:

- **Default run** (1 site + report): **$1.25**
- 20 sites without reports: **$5.00**; with reports: **$25.00**

Runs are paid from your Apify balance; the free plan's $5 monthly credit covers a few default runs. Use **Maximum cost per run** in the run options to set a hard cap.

### Data sources: two modes

The column `dataMode` in each row tells you which mode was used.

**Standard (no key needed)** uses open-licence data:

- **Geocoding**: Nominatim and Photon, © OpenStreetMap contributors (ODbL)
- **Elevation**: Terrain Tiles on AWS Open Data: 3DEP, GMTED2010 and SRTM courtesy of the U.S. Geological Survey; ETOPO1 from NOAA; EU-DEM produced using Copernicus data funded by the European Union; other national models under open licences
- **Climate and solar**: NASA Langley Research Center POWER Project (MERRA-2 / CERES); reference evapotranspiration by the FAO-56 Hargreaves method
- **Map features**: OpenStreetMap via the Overpass API (ODbL)

**Extended (add your own Open-Meteo API key from a paid plan)** adds or replaces:

- **River discharge and 30-day forecast**: GloFAS v4, Copernicus Emergency Management Service (CC BY 4.0)
- **Air quality**: CAMS global, Copernicus Atmosphere Monitoring Service (CC BY 4.0)
- **Elevation**: Copernicus DEM GLO-90; **Climate**: ERA5 / ERA5-Land reanalysis (CC BY 4.0)

### Honest limits

- **This is a pre-screen, not an ASTM E1527-21 Phase I ESA.** It does not search regulatory databases (UST/LUST, RCRA, CERCLIS/NPL), historical aerial photos or city directories, and it does not involve a site visit or an Environmental Professional. Use it to decide which sites need one.
- OpenStreetMap shows what is mapped today. Unmapped or historical uses (an old gas station, a closed factory) will not appear.
- Without an Open-Meteo key there is no river-discharge history, river forecast or air-quality section; the flood score then relies on terrain, mapped watercourses and rainfall. NASA POWER climate data is coarse (about 50 km), so local heat extremes can be underestimated.
- River discharge (extended mode) comes from a ~5 km GloFAS grid cell: it describes the regional river, not a flood map. Distance and height above the nearest mapped watercourse bring it down to the site. Always check the official flood map.
- Elevation is a 90 m model with metre-level accuracy, so small height differences are uncertain. That is why the up-gradient rule needs at least 1.5 m.
- Forest polygons do not prove EUDR compliance. Deforestation-free status after 31 Dec 2020 needs satellite forest-change data for the full plot.
- A typical site takes 30–90 seconds. Most of that is the public OpenStreetMap query. Many sites run in parallel.

### More tools from translucent_wire

**Coming from EUDR Plot File Fixer?** Its `OUTPUT` record (`nextStep.georiskLocations`) gives your plots' centres in this Actor's `locations` format: paste them in to screen every plot.

| Tool | What it does |
|---|---|
| [Local Business Leads](https://apify.com/translucent_wire/local-business-email-finder) | Local businesses by type and city: email, website gaps, fit score, audit pages, map |
| [Hiring Signals to Proposals](https://apify.com/translucent_wire/hiring-signals-to-proposals) | Companies hiring for a role your service can do: tasks covered, saving, email, proposal page |
| [EUDR Plot File Fixer](https://apify.com/translucent_wire/eudr-plot-file-fixer) | Fix GeoJSON/KML/CSV/Shapefile plot files so the EU Information System accepts them |
| [Solar Roof Prospects](https://apify.com/translucent_wire/solar-roof-prospects) | Business roofs that suit commercial solar: system size, saving, payback, email, estimate page |

### Use it from an AI assistant (MCP)

Add Apify's MCP server to Claude, ChatGPT, Cursor or any MCP client and this Actor becomes a tool your assistant can run:

```json
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=translucent_wire/georisk-site-intelligence"}}}
```

AI agents without an Apify account can also run it and pay per run in USDC through Apify's x402 support.

### FAQ

**Can I screen a whole portfolio?** Yes. Add hundreds of sites in one run. They are screened in parallel (3 at a time by default).

**Can I put my own brand on the reports?** Yes. Set your company name, logo, colour, client name and contact line.

**Can I verify the data later?** Yes. Each row has a `dataUrl` (the exact JSON) and a `sha256`. Hash the JSON file and compare.

**Does it work outside the US?** Yes. Every source is global. Air quality, climate and terrain cover the whole world; OpenStreetMap detail varies by country.

**Is my AI key safe?** Keys are stored as encrypted secret inputs by Apify, used only for one summary request, and never written to the results.

# Actor input Schema

## `locations` (type: `array`):

One object per site. Use latitude + longitude, or an address, or a GeoJSON polygon (the polygon centroid is screened and the plot area is reported). Optional: id (used in report file names) and name. Example: \[{"id": "plot-7", "name": "Warehouse lot", "latitude": 29.7355, "longitude": -95.2310}, {"address": "Kaukauna, Wisconsin"}].

## `addresses` (type: `array`):

Optional: paste street addresses or place names, one per line. Each is geocoded with OpenStreetMap and screened like a site.

## `useCase` (type: `string`):

Changes how the combined risk score weighs each category and which findings count as deal-breakers.

## `radiusMeters` (type: `integer`):

Radius around each site for fuel stations, dry cleaners, industrial land, landfills, wetlands, rivers, protected areas and forest. 1,500 m is close to the ASTM E1527-21 search distances for most record types.

## `generateReports` (type: `boolean`):

Creates one self-contained executive scorecard per site with gauges, the elevation matrix, the up/down-gradient source table and the solar ROI math. The link is in each result row.

## `climateYears` (type: `integer`):

How many full past years of ERA5 daily reanalysis to analyse for heat, rain, drought and solar irradiation.

## `floodHistoryYears` (type: `integer`):

Years of daily GloFAS river discharge used for percentiles, annual peaks and the Gumbel 10-year and 100-year flood estimates.

## `solarSystemKwp` (type: `integer`):

System size used for annual MWh, revenue, payback, LCOE and NPV.

## `performanceRatio` (type: `string`):

Share of irradiation turned into AC energy after all losses (0.5 to 0.95). 0.78 is a common conservative value.

## `tiltGainFactor` (type: `string`):

Multiplier from horizontal to tilted-panel irradiation. 1.0 = horizontal (conservative); about 1.10-1.20 for fixed optimal tilt at mid latitudes; about 1.25-1.35 for single-axis trackers.

## `electricityPriceUsdPerKwh` (type: `string`):

Value of each kWh produced (retail price saved or PPA tariff).

## `solarCapexUsdPerWp` (type: `string`):

All-in installed cost per watt-peak used for capex, payback, LCOE and NPV.

## `opexPercentOfCapex` (type: `string`):

Operation and maintenance cost per year as a percentage of capex.

## `discountRatePercent` (type: `string`):

Discount rate for LCOE and NPV.

## `degradationPercentPerYear` (type: `string`):

Yearly output loss of the panels.

## `lifetimeYears` (type: `integer`):

Years used for LCOE and NPV.

## `gridEmissionFactorKgPerKwh` (type: `string`):

Used for CO2 avoided per year. About 0.4 is a world average; use your grid's value.

## `brandName` (type: `string`):

Shown in the report header (white-label).

## `brandLogoUrl` (type: `string`):

Public https link to your logo (PNG, JPG or SVG).

## `brandColor` (type: `string`):

Hex colour for headings and accents, for example #0b5cab.

## `preparedFor` (type: `string`):

Optional client name printed on each report.

## `brandContact` (type: `string`):

Optional contact line for the report header, for example your email and website.

## `openMeteoApiKey` (type: `string`):

Without a key, the Actor uses open-licence data: OpenStreetMap, open terrain tiles (SRTM / 3DEP / EU-DEM) and NASA POWER climate and solar. Add your own key from a paid Open-Meteo plan (open-meteo.com/en/pricing) to also get 20 years of river discharge, the 30-day river forecast and air quality vs WHO, and Copernicus DEM / ERA5 data. The key is stored encrypted and never written to the results.

## `llmProvider` (type: `string`):

Optional. The built-in summary works without any AI. Choose a provider and add your own key to have the summary rewritten from the computed facts only.

## `openaiApiKey` (type: `string`):

Your own OpenAI key. Stored encrypted by Apify and never written to the results.

## `geminiApiKey` (type: `string`):

Your own Google AI Studio key. Stored encrypted by Apify and never written to the results.

## `llmModel` (type: `string`):

Optional model name. Defaults: gpt-4.1-mini (OpenAI) or gemini-2.5-flash (Gemini).

## `maxConcurrency` (type: `integer`):

Keep this low (1-5): the public data services have fair-use limits.

## `maxSites` (type: `integer`):

Safety cap on the number of sites screened in one run.

## Actor input object example

```json
{
  "locations": [
    {
      "id": "houston-ship-channel",
      "name": "Industrial lot, Galena Park TX",
      "latitude": 29.7355,
      "longitude": -95.231
    }
  ],
  "useCase": "general",
  "radiusMeters": 1500,
  "generateReports": true,
  "climateYears": 10,
  "floodHistoryYears": 20,
  "solarSystemKwp": 500,
  "performanceRatio": "0.78",
  "tiltGainFactor": "1.0",
  "electricityPriceUsdPerKwh": "0.12",
  "solarCapexUsdPerWp": "0.90",
  "opexPercentOfCapex": "1.5",
  "discountRatePercent": "7",
  "degradationPercentPerYear": "0.5",
  "lifetimeYears": 25,
  "gridEmissionFactorKgPerKwh": "0.40",
  "brandColor": "#0b5cab",
  "llmProvider": "auto",
  "maxConcurrency": 3,
  "maxSites": 500
}
```

# Actor output Schema

## `sites` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        {
            "id": "houston-ship-channel",
            "name": "Industrial lot, Galena Park TX",
            "latitude": 29.7355,
            "longitude": -95.231
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("translucent_wire/georisk-site-intelligence").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locations": [{
            "id": "houston-ship-channel",
            "name": "Industrial lot, Galena Park TX",
            "latitude": 29.7355,
            "longitude": -95.231,
        }] }

# Run the Actor and wait for it to finish
run = client.actor("translucent_wire/georisk-site-intelligence").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    {
      "id": "houston-ship-channel",
      "name": "Industrial lot, Galena Park TX",
      "latitude": 29.7355,
      "longitude": -95.231
    }
  ]
}' |
apify call translucent_wire/georisk-site-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,translucent_wire/georisk-site-intelligence"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ivEdGA2BKqZ4lHlZ5/builds/P2IlKydgGaXYcuR2a/openapi.json
