Log in/Sign up

Vedic Astrology MCP Server

32 read-only Model Context Protocol tools over the Jagannatha Hora calculation engine. An AI agent can compute a birth chart, walk 55 dasha systems, pull any of 23 divisional charts, screen yogas and doshas, read transits, rank muhurta dates and score a marriage match — without you writing an integration for any of it.

Last verified against the service source on 2026-08-31.

What MCP is, in one paragraph

The Model Context Protocol is an open standard for letting a language model call external tools. Instead of pasting astrological data into a prompt, you point the model's client at a server; the client asks the server what tools it has, the server answers with names, descriptions and JSON Schemas, and from then on the model can call any of them mid- conversation and reason over what comes back. This server publishes the Jagannatha Hora Vedic astrology engine that way. It is read-only — every tool computes and returns; none of them write, send, charge or change anything — so an agent can call them freely without a confirmation step in front of each one.

How to connect

Server name
Jagannatha Hora MCP Server
Server version
1.0.0
Endpoint
https://jagannatha-hora-359167915530.europe-west1.run.app/mcp
Transport
JSON-RPC 2.0 over HTTP (POST), with an optional SSE stream
Protocol revision
2024-11-05
Authentication
None. No key, no token, no OAuth.
Health check
https://jagannatha-hora-359167915530.europe-west1.run.app/mcp/health
SSE stream
https://jagannatha-hora-359167915530.europe-west1.run.app/mcp/sse

In a client that supports remote MCP servers, adding the endpoint URL is the entire setup. There is no package to install and no process to spawn — this is not a stdio server.

Which clients this works with

MCP clients that support remote HTTP servers
Work directly. Add the endpoint URL as a remote or custom MCP server. Because the server requires no authentication, leave any API-key or OAuth field empty — and note that a client which insists on OAuth for remote servers will not connect.
Clients that only speak stdio
Need a bridge. A stdio-to-HTTP proxy (the mcp-remote npm package is the common one) runs locally as the stdio server and forwards to this URL. Configure the proxy, not this endpoint, as the command.
Your own agent code
Nothing special required. It is HTTP and JSON — an MCP SDK's HTTP transport works, and so does a plain POST, as the examples below show. Every response is deterministic, so caching on your side is safe.

Client support for remote MCP servers moves quickly and differs between products and versions, so the honest answer is the one above: this server is a standard HTTP JSON-RPC MCP endpoint with no authentication, and it works with any client that can talk to one. If yours only speaks stdio, put a stdio-to-HTTP bridge in front of it.

Verify it in two commands

Is it up?
curl -sS "https://jagannatha-hora-359167915530.europe-west1.run.app/mcp/health"

{"status":"ok","cache":{"entries":3,"max_entries":15,"ttl_seconds":600,
                        "hits":41,"misses":12,"hit_rate":0.77}}
What can it do?
curl -sS -X POST "https://jagannatha-hora-359167915530.europe-west1.run.app/mcp" \
  -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

Machine-readable versions of this page

Same facts, formats a program would rather have. Kept in sync with this page by a test that fails the build when they drift.

Protocol

Standard JSON-RPC 2.0. These are the methods the server implements; anything else returns a -32601.

initialize
Handshake. Returns protocolVersion, capabilities ({"tools": {"listChanged": false}}) and serverInfo. The server echoes back whatever protocolVersion the client sent, falling back to 2024-11-05 when the client sends none.
tools/list
The authoritative tool inventory with full JSON Schemas. Call this rather than trusting any written list, including this page.
tools/call
Runs one tool. Takes name and arguments. The result comes back as MCP content: a single text part whose text is the JSON-encoded result object.
ping
Returns an empty object. Liveness.
notifications/*
Accepted and acknowledged with no response body, per JSON-RPC notification semantics.

Transport detail

  • The transport is JSON-RPC 2.0 over HTTP. POST your request to the endpoint and the JSON-RPC response comes straight back in the body — no session, no handshake beyond initialize.
  • An SSE variant exists for clients that want it: GET /mcp/sse with Accept: text/event-stream opens the stream, which emits an endpoint event followed by a session event carrying the session id. Messages are then POSTed with an X-MCP-Session-ID header and the reply is pushed down the stream as a message event, with the POST itself returning 202. A keepalive comment goes out every 25 seconds.
  • This is the HTTP + SSE shape of the 2024-11-05 protocol revision. It is not a stdio server: there is no command to spawn and no package to install.

Errors

-32700
Parse error. The request body was not valid JSON.
-32601
Method not found. A method outside the list above.
-32602
Invalid params. tools/call with no name, an unknown tool name, or birth details that fail to parse — a missing required field names the fields it is missing.
-32603
Internal error. The tool raised. The message carries the reason.

The shared inputs

Most tools identify a chart the same way, with the same six fields. They are listed once here; the tool tables below only name what each tool adds on top.

The birth-details block every chart tool advertises
ParameterTypeRequiredDefaultNotes
datestringYesBirth date in YYYY-MM-DD format, e.g. 1985-06-15
timestringYesBirth time in 24h HH:MM:SS format, e.g. 10:30:00. Shorter forms are normalised server-side.
latitudenumberYesBirth-place latitude in decimal degrees, e.g. 13.0827
longitudenumberYesBirth-place longitude in decimal degrees, e.g. 80.2707
timezonenumberYesTimezone offset from UTC in hours, e.g. 5.5 for IST
placestringNonullOptional birth-place name, cosmetic only.

Three tools take no birth details at all: list_divisional_charts takes no parameters whatsoever, get_planet_ingress works on planets and dates alone, and get_marriage_match takes two nested person objects instead.

Event location override

get_gochara, get_gochara_range and get_muhurta also accept an event location, for the common case where someone was born in one place and is asking about something happening in another. Every field is optional and falls back to the corresponding birth value.

Optional event-location fields
ParameterTypeRequiredDefaultNotes
event_placestringNonullEvent place name; defaults to the birth place.
event_latitudenumberNonullEvent latitude; defaults to the birth latitude.
event_longitudenumberNonullEvent longitude; defaults to the birth longitude.
event_timezonenumberNonullEvent timezone offset from UTC; defaults to the birth timezone.
event_elevationnumberNonullEvent elevation in metres; defaults to the birth elevation.

All 32 tools

Grouped by what they are for. Tools that take parameters beyond the birth block have those parameters tabulated in the next section.

Chart & positions

generate_horoscope
The entry point. Computes the chart, then returns a compact overview — the birth details it used, the ascendant and Moon nakshatra with padas and lord, calendar info, and the list of section names every other tool can then fetch. Start here; the chart is cached, so the follow-up calls are cheap.
get_arudha_padas
The arudha padas — the perceived, as-others-see-it houses — for a chosen divisional chart.
get_chandra_arudhas
The arudha signs of the twelve houses counted from the Moon.
get_chara_karakas
The eight Jaimini chara (variable) karakas — Atma, Amatya, Bhratri and the rest — assigned by planetary degree.
get_graha_arudhas
The arudha — the reflected sign — of each graha and of the lagna.
get_house_varnadas
The varnada lagna for each of the twelve houses.
get_nakshatra_pada
Nakshatra, pada, nakshatra lord and degrees-into-nakshatra for every body in the chart.
get_planetary_states
Dignity and condition flags for the planets — retrograde, combust, exalted, debilitated and the rest.
get_sahams
The sahams — the Vedic Arabic parts — of the chart.
get_special_lagnas
The special and derived lagnas — Bhava, Hora, Ghati and the others.
get_sphutas
The special sphutas — the sensitive computed points of the chart.
get_surya_arudhas
The arudha signs of the twelve houses counted from the Sun.
get_upagrahas
The upagrahas — the shadowy sub-planets such as Gulika and Mandi.

Timing & dashas

get_dasha
Any of 55 dasha systems as a nested tree, with the running period marked. Vimshottari by default; ask for a specific maha or antar to drill into one branch instead of the current one.

Divisional charts

get_amsa_rulers
The Nadiamsa (D-150) ruler for every point in the chart — planets, upagrahas, lagnas, varnada and sphutas.
get_divisional_chart
One varga chart by name, with every body's sign and longitude in that division.
list_divisional_charts
The discovery tool: the menu of the 23 varga charts, each with the token to request it by, its name and what it is classically read for. Takes no parameters and no birth details.

Strength & ashtakavarga

get_ashtakavarga
Ashtakavarga bindu scores with the rows labelled by planet instead of returned as bare arrays: binna (the un-reduced BAV), sodhita (SoAV, the reduced grid the pindas come from), samudhaya (SAV), and the rasi, graha and sodhya pindas. The prastara grid is deliberately left out to keep the payload small.
get_bhava_bala
Bhava Bala — house strength — parsed into House 1 through House 12, each with total virupas, rupas and a strength ratio.
get_other_bala
The remaining strength measures — harsha, pancha and dwadhasa vargeeya bala.
get_shad_bala
Shadbala, the six-fold planetary strength, with each component labelled by planet: sthana, kala, dig, cheshta, naisargika and drik bala, plus total virupas, total rupas and the strength ratio.
get_vaiseshikamsa_bala
Vaiseshikamsa Bala — the count of good vargas each planet occupies.
get_vimsopaka_bala
Vimsopaka Bala — divisional-chart dignity strength on a twenty-point scale.

Yogas, doshas & longevity

get_doshas
The standard dosha checks for the chart — Manglik, Kaal Sarp and the rest of the set.
get_longevity
Classical Ayurdaya longevity reference computations — the band and the combinations that produced it.
get_yogas
Every yoga detected in the chart, each with its classical definition and stated effects.

Transits & muhurta

get_gochara
A transit snapshot for one target date read against the natal chart: panchanga, muhurta windows, all nine planets with their house from the natal Moon and Lagna, and the person-relative strengths (Tara Bala, Chandra Bala, Sade Sati).
get_gochara_range
The same natal transit detail for every day in a range, in one call — no scoring, no verdict, so the model reasons over the raw days itself. The natal reference is computed once.
get_muhurta
Ranks the days in a window for a specific event, scoring the classical factors and the native's own strength on each day, and returning the score breakdown, the weights used, and the best and avoid clock windows. It ranks; it does not choose.
get_planet_ingress
Retrograde-aware sign-change timing across a date range. Takes no birth details at all — ingresses are the same for everyone.
get_saturn_transit
Saturn's Sade Sati windows and the related 4th and 8th house transits.

Compatibility

get_marriage_match
Compatibility for a couple under the North Indian Ashtakoota system, the South Indian ten-porutham system, or both. Returns a summary block with each side's score, rating and Manglik state, plus the full detail.

What a tool call returns

A tools/call result is MCP content: a single text part whose text is the JSON-encoded result object. Thirty-one of the 32 tools wrap their payload in the same envelope — {"section": "...", "data": ...} — with some adding one field, such as the varga that was applied. generate_horoscope is the exception and returns its overview at the top level.

The envelope, unwrapped
{
  "content": [
    { "type": "text",
      "text": "{\"section\": \"chara_karakas\", \"data\": { ... }}" }
  ]
}

Tool parameters

The 8 tools below take something beyond the shared birth block. Defaults are applied by the server at call time — no tool schema declares a JSON-Schema default, so a client reading the schema will not see them.

get_arudha_padas

The arudha padas — the perceived, as-others-see-it houses — for a chosen divisional chart.

Takes the shared birth-details block, plus these:

Parameters for get_arudha_padas
ParameterTypeRequiredDefaultNotes
vargastringNo"D-1"One of: D-1, D-2, D-3, D-4, D-5, D-6, D-7, D-8, D-9, D-10, D-11, D-12, D-16, D-20, D-24, D-27, D-30, D-40, D-45, D-60, D-81, D-108, D-144.

Returns: section "arudha_padhas" (the engine spelling, with the h), plus the varga that was applied

get_dasha

Any of 55 dasha systems as a nested tree, with the running period marked. Vimshottari by default; ask for a specific maha or antar to drill into one branch instead of the current one.

Takes the shared birth-details block, plus these:

Parameters for get_dasha
ParameterTypeRequiredDefaultNotes
systemstringNo"vimsottari"One of 55 values — 28 graha systems plus 27 rasi systems, both listed below.
as_of_datestringNotodayYYYY-MM-DD. "YYYY-MM-DD HH:MM" and "YYYY-MM-DD HH:MM:SS" are also parsed.
depthintegerNo3 for graha systems, 2 for rasi systems1 to 4. Clamped to that range, and reduced to what the chosen system can actually produce.
mahastringNonullRuler name of the maha dasha to expand. No enum — the valid set is the chosen system's rulers (planets or signs).
antarstringNonullRuler name of the antar dasha to expand. Requires maha to be set.

Returns: section "dasha". The data carries dasha_type, system, as_of, depth, levels_available and maha_timeline, plus current_maha / current_antar / current_pratyantar when they apply.

get_divisional_chart

One varga chart by name, with every body's sign and longitude in that division.

Takes the shared birth-details block, plus these:

Parameters for get_divisional_chart
ParameterTypeRequiredDefaultNotes
vargastringNo"D-1_rasi"One of: D-1, D-2, D-3, D-4, D-5, D-6, D-7, D-8, D-9, D-10, D-11, D-12, D-16, D-20, D-24, D-27, D-30, D-40, D-45, D-60, D-81, D-108, D-144. The resolver is forgiving — "D9", "9" and "navamsa" all reach D-9. An unknown value returns an error object listing the available vargas rather than failing the call.

Returns: section "divisional_charts", plus the engine key that was matched (e.g. "D-9_navamsa")

get_gochara

A transit snapshot for one target date read against the natal chart: panchanga, muhurta windows, all nine planets with their house from the natal Moon and Lagna, and the person-relative strengths (Tara Bala, Chandra Bala, Sade Sati).

Takes the shared birth-details block, plus these:

Parameters for get_gochara
ParameterTypeRequiredDefaultNotes
target_datestringYesThe transit date, YYYY-MM-DD.
target_timestringNo"12:00:00"HH:MM:SS; local noon by default.
includestring[]No["ashtakavarga", "gochara_phala", "transit_charts"]Enrichment sections. Omit for all three; pass [] for the lean snapshot.
node_typestringNo"mean""mean" or "true".
event_placestringNonullEvent place name; defaults to the birth place.
event_latitudenumberNonullEvent latitude; defaults to the birth latitude.
event_longitudenumberNonullEvent longitude; defaults to the birth longitude.
event_timezonenumberNonullEvent timezone offset from UTC; defaults to the birth timezone.
event_elevationnumberNonullEvent elevation in metres; defaults to the birth elevation.

Returns: section "gochara"

get_gochara_range

The same natal transit detail for every day in a range, in one call — no scoring, no verdict, so the model reasons over the raw days itself. The natal reference is computed once.

Takes the shared birth-details block, plus these:

Parameters for get_gochara_range
ParameterTypeRequiredDefaultNotes
from_datestringYesRange start, YYYY-MM-DD.
to_datestringYesRange end, YYYY-MM-DD. Maximum 60 days; a longer range is an error.
time_of_daystringNo"12:00:00"The time used for each day.
includestring[]No["ashtakavarga", "gochara_phala"]Two sections here by default, not the three get_gochara defaults to. Pass [] for the lean snapshot.
event_placestringNonullEvent place name; defaults to the birth place.
event_latitudenumberNonullEvent latitude; defaults to the birth latitude.
event_longitudenumberNonullEvent longitude; defaults to the birth longitude.
event_timezonenumberNonullEvent timezone offset from UTC; defaults to the birth timezone.
event_elevationnumberNonullEvent elevation in metres; defaults to the birth elevation.

Returns: section "gochara_range" — range, place, ayanamsa_mode, natal_ref, count and days

get_marriage_match

Compatibility for a couple under the North Indian Ashtakoota system, the South Indian ten-porutham system, or both. Returns a summary block with each side's score, rating and Manglik state, plus the full detail.

Takes no birth-details block. Its full parameter list is:

Parameters for get_marriage_match
ParameterTypeRequiredDefaultNotes
boyobjectYesdate, time, latitude, longitude, timezone (required) and place (optional).
girlobjectYesSame shape as boy.
systemstringNo"both""both", "north" or "south". Choosing one drops the other block from the response.

Returns: section "marriage_match"

get_muhurta

Ranks the days in a window for a specific event, scoring the classical factors and the native's own strength on each day, and returning the score breakdown, the weights used, and the best and avoid clock windows. It ranks; it does not choose.

Takes the shared birth-details block, plus these:

Parameters for get_muhurta
ParameterTypeRequiredDefaultNotes
event_typestringYesOne of six: griha_pravesha_own, griha_pravesha_rented, travel_prayana, vehicle_purchase, business_shop_opening, property_purchase_registration.
from_datestringYesScan start, YYYY-MM-DD.
to_datestringYesScan end, YYYY-MM-DD. Maximum 90 days.
day_part_resolution_minutesintegerNo15Time-of-day granularity. The tool description states 5-60; the JSON schema declares no minimum or maximum, so treat 5-60 as the supported range rather than an enforced one.
respect_inauspicious_windowsbooleanNotrueReport the Rahu, Gulika and Yamaganda windows to avoid.
event_placestringNonullEvent place name; defaults to the birth place.
event_latitudenumberNonullEvent latitude; defaults to the birth latitude.
event_longitudenumberNonullEvent longitude; defaults to the birth longitude.
event_timezonenumberNonullEvent timezone offset from UTC; defaults to the birth timezone.
event_elevationnumberNonullEvent elevation in metres; defaults to the birth elevation.

Returns: section "muhurta" — event_type, event_label, range, rules_applied, weights and the scored candidates

get_planet_ingress

Retrograde-aware sign-change timing across a date range. Takes no birth details at all — ingresses are the same for everyone.

Takes no birth-details block. Its full parameter list is:

Parameters for get_planet_ingress
ParameterTypeRequiredDefaultNotes
planetsstring[]No["Saturn", "Jupiter", "Rahu", "Ketu"]An unrecognised planet name is an error.
from_datestringYesRange start, YYYY-MM-DD.
to_datestringYesRange end, YYYY-MM-DD. Maximum about five years.
timezonenumberNo0.0Offset used to express the crossing dates. Defaults to UTC — this is NOT a birth timezone and is optional here.
ayanamsa_modestringNo"LAHIRI"Ayanamsa mode.

Returns: section "planet_ingress" — range, timezone, ayanamsa_mode, planets and ingresses

The 55 dasha systems

get_dasha accepts any of these as its system argument. 28 are graha (planetary) systems, where the periods belong to planets:

vimsottari, ashtottari, yogini, shodasottari, dwadasottari, panchottari, satabdika, chaturaaseeti_sama, shashtisama, shattrimsa_sama, dwisatpathi, kaala, buddhi_gathi, naisargika, aayu, tara, karaka, tithi_ashtottari, tithi_yogini, karana_chaturaaseeti_sama, saptharishi_nakshathra, rasi_bhukthi_vimsottari, yoga_vimsottari, ashtaka_varga_planet, ashtaka_varga_sign, ashtaka_varga_pinda, moola_graha, rashmi

The other 27 are rasi (sign) systems, where the periods belong to signs. These naturally run shallower, which is why the default depth is 2 rather than 3:

narayana, chara, kendraadhi_rasi, sudasa, drig, nirayana, shoola, kendraadhi_karaka, lagnamsaka, padhanadhamsa, mandooka, sthira, tara_lagna, brahma, varnada, yogardha, navamsa, paryaaya, trikona, kalachakra, chakra, sandhya_panchaka, chathurvidha_utthara, karaka_kendraadhi, lagna_kendraadhi, niryaana, raashiyanka

A worked example: an agent answering a real question

Take the question "I was born on 27 July 1993 at 1:51pm in Hassan, India. Which dasha am I running, and is Saturn giving me trouble right now?" An agent with this server connected answers it in three calls. Nothing below is hypothetical protocol — it is the literal JSON-RPC each step sends.

Step 1 — establish the chart

The agent calls generate_horoscope first. This is the expensive step, and it populates the server's chart cache, so every later call for the same birth details is a lookup rather than a recomputation.

Request
POST https://jagannatha-hora-359167915530.europe-west1.run.app/mcp
content-type: application/json

{
  "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": {
    "name": "generate_horoscope",
    "arguments": {
      "date": "1993-07-27", "time": "13:51:00", "place": "Hassan",
      "latitude": 13.0, "longitude": 76.1, "timezone": 5.5
    }
  }
}
Result (the text part, decoded)
{
  "birth_details": { "date": "1993-07-27", "time": "13:51:00",
                     "place": "Hassan", "latitude": 13.0,
                     "longitude": 76.1, "timezone": 5.5,
                     "ayanamsa_mode": "LAHIRI" },
  "summary": {
    "ascendant_nakshatra": "Swati", "ascendant_pada": 2,
    "moon_nakshatra": "Uttara Ashadha", "moon_pada": 3,
    "moon_nakshatra_lord": "Sun", "sun_nakshatra": "Pushya"
  },
  "available_sections": ["ashtakavarga", "bhava_bala", "chara_karakas",
                         "divisional_charts", "doshas", "graha_dashas", "..."]
}

Step 2 — the running dasha

Now the timing question. The agent asks for Vimshottari to three levels, and the server marks which maha, antar and pratyantar contain today's date, so the model does not have to do date arithmetic over a period tree.

Request
{
  "jsonrpc": "2.0", "id": 2, "method": "tools/call",
  "params": {
    "name": "get_dasha",
    "arguments": {
      "date": "1993-07-27", "time": "13:51:00",
      "latitude": 13.0, "longitude": 76.1, "timezone": 5.5,
      "system": "vimsottari", "depth": 3
    }
  }
}
Result (abridged)
{
  "section": "dasha",
  "data": {
    "dasha_type": "graha", "system": "vimsottari",
    "as_of": "2026-08-09", "depth": 3, "levels_available": 3,
    "current_maha":  { "level": 1, "ruler": "Sun",
                       "start": "2023-01-14", "end": "2029-01-13" },
    "current_antar": { "level": 2, "ruler": "Venus",
                       "start": "2026-05-05", "end": "2027-05-05" },
    "current": { "maha": "Sun", "antar": "Venus", "pratyantar": "Rahu",
                 "path": "Sun / Venus / Rahu",
                 "current_period_ends": "2026-09-21" },
    "maha_timeline": [ "..." ]
  }
}

Step 3 — the Saturn question

"Is Saturn giving me trouble" is a Sade Sati question, so the agent calls the tool that answers it directly rather than trying to infer it from planetary positions.

Request
{
  "jsonrpc": "2.0", "id": 3, "method": "tools/call",
  "params": {
    "name": "get_saturn_transit",
    "arguments": {
      "date": "1993-07-27", "time": "13:51:00",
      "latitude": 13.0, "longitude": 76.1, "timezone": 5.5
    }
  }
}

Three calls, and the model now has the running period with its end date and the Saturn transit windows — the two things the question actually turned on. It writes the answer from computed data instead of from whatever it remembered about Vedic astrology.

The shape of this matters more than the specifics. Do not reach for generate_horoscope and then ask the model to find the answer in it — that is the megabyte-into-the-context-window mistake. Establish the chart, then call the one or two tools that own the question. Each returns kilobytes.

How the server behaves

Every tool is read-only
Each tool advertises readOnlyHint: true, destructiveHint: false, idempotentHint: true and openWorldHint: false. Nothing here writes, sends, charges or mutates anything. An agent can call any of them without a confirmation step.
The chart is cached, so slice freely
The expensive step is computing the chart, not slicing it. The server keeps a small in-process LRU of parsed charts — 15 entries, with a 10-minute TTL that refreshes on every hit — keyed by the birth details and the calculation settings. So the intended pattern is one generate_horoscope followed by as many section tools as the question needs, not one call that drags 3.5 MB back to the model. Cache statistics are exposed at GET /mcp/health.
No authentication
The MCP router enforces no authorization header today. There is no API key to obtain and no OAuth flow to complete — which also means an MCP client that requires OAuth for remote servers will not be satisfied by this one. Do not send anything you would not put in a public request.
Rate limits apply here too
The MCP router runs inside the same FastAPI app as the REST API, so the app-wide default of 200 requests per minute per IP governs it. The per-endpoint REST limits do not apply to tool calls; the default does.
tools/list is the contract
The registry discovers tools by importing every module in its tools package at startup, so the live set can differ from any written list. Call tools/list at connect time and use the schemas it returns. This page is a snapshot for humans and crawlers; the server is the authority.
Undocumented parameters exist — do not rely on them
The birth parser accepts calculation settings that appear in no advertised schema: elevation, ayanamsa_mode, ayanamsa_value, calculation_type, bhava_madhya_method, language, pravesha_type, years, months, sixty_hours, tamil_month_method and kali_start_year. They work, but they are not part of the published contract and could change without notice. Send only what tools/list advertises. If you need a non-default ayanamsa today, the REST API exposes it as a supported, documented parameter.