Locate photos from visual clues and assess location claims with candidates and uncertainty.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check the authenticated Oceanir account's current credit balance and remaining monthly allowance.
This tool takes no arguments.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http oceanir https://mcp.oceanir.ai
Check the authenticated Oceanir account's current credit balance and remaining monthly allowance.
No arguments.
{
"type": "object",
"properties": {}
}Analyze an image and return its probable real-world location. Returns ranked coordinates with a confidence score and the visual evidence chain the analysis used (architecture, signage, vegetation, terrain, lighting). No EXIF or GPS required. Reads the scene only (architecture, signage, terrain, vegetation), never the people in it. No face recognition, no biometric identification, no person matching. It answers where an image was taken, never who is in it, and must not be used to locate or track a person.
| Argument | Type | Description |
|---|---|---|
| depth | integer | Analysis depth. 1 = Surface (region scan, 1 credit). 2 = Standard (ranked candidates with evidence, 2 credits). 3 = Forensic (deeper reasoning and contradiction checks, 10 credits). |
| scope | object | The location being claimed. Oceanir treats this as a search boundary and never as evidence: it can only narrow the search, never raise confidence, and the model will reject it outright on hard image-legible contradiction (signage in an impossible script, the wrong driving side, a landmark that is elsewhere). |
| image_b64 | string | Base64-encoded image bytes (no data: prefix). |
| image_url | string | Public HTTPS URL to the image to analyze. |
{
"type": "object",
"anyOf": [
{
"required": [
"image_url"
]
},
{
"required": [
"image_b64"
]
}
],
"properties": {
"depth": {
"enum": [
1,
2,
3
],
"type": "integer",
"default": 1,
"description": "Analysis depth. 1 = Surface (region scan, 1 credit). 2 = Standard (ranked candidates with evidence, 2 credits). 3 = Forensic (deeper reasoning and contradiction checks, 10 credits)."
},
"scope": {
"type": "object",
"required": [
"name",
"lat",
"lng"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"name": {
"type": "string",
"description": "Place name, e.g. \"Doral, Florida\"."
},
"radius_km": {
"type": "number",
"default": 60,
"description": "How far from the centre still counts as the claimed place. Defaults to 60km, which covers a metro area."
},
"captured_at": {
"type": "string",
"description": "When the image is CLAIMED to have been taken. Optional, and worth sending whenever the claim carries a date, because it is the only check here that does not depend on the model's own confidence. A bare date (2026-09-12) returns whether the sun rose at that place at all that day and for how long; at high latitudes that alone can contradict a daylit image outright. A time WITH a UTC offset (2026-09-12T14:30:00-04:00) additionally returns the sun's altitude and compass direction at that moment. A time WITHOUT an offset has its clock time ignored and only its date used: an assumed timezone can turn noon into midnight, so it is never guessed."
}
},
"description": "The location being claimed. Oceanir treats this as a search boundary and never as evidence: it can only narrow the search, never raise confidence, and the model will reject it outright on hard image-legible contradiction (signage in an impossible script, the wrong driving side, a landmark that is elsewhere)."
},
"image_b64": {
"type": "string",
"description": "Base64-encoded image bytes (no data: prefix)."
},
"image_url": {
"type": "string",
"format": "uri",
"description": "Public HTTPS URL to the image to analyze."
}
}
}Test whether an image is consistent with a location someone has already claimed: a listing's stated city, an address on a case file or claim form, a caption. Oceanir locates the image from visual evidence alone FIRST, then compares. Returns a verdict of `agrees`, `contradicts`, or `unverifiable`, with the distance between the claim and the evidence. `unverifiable` means the image does not settle it and the item needs a human. It is a real answer, not a failure. A verdict of `agrees` means the image is consistent with the claim, not that the claim is true. Reads the scene only (architecture, signage, terrain, vegetation), never the people in it. No face recognition, no biometric identification, no person matching. It answers where an image was taken, never who is in it, and must not be used to locate or track a person.
| Argument | Type | Description |
|---|---|---|
| depth | integer | Analysis depth. 2 = Standard is the right default for verification; 1 = Surface is city-level only and will rarely contradict anything; 3 = Forensic adds contradiction checks (10 credits). |
| scope* | object | The location being claimed. Oceanir treats this as a search boundary and never as evidence: it can only narrow the search, never raise confidence, and the model will reject it outright on hard image-legible contradiction (signage in an impossible script, the wrong driving side, a landmark that is elsewhere). |
| image_b64 | string | Base64-encoded image bytes (no data: prefix). |
| image_url | string | Public HTTPS URL to the image to test. |
{
"type": "object",
"anyOf": [
{
"required": [
"image_url"
]
},
{
"required": [
"image_b64"
]
}
],
"required": [
"scope"
],
"properties": {
"depth": {
"enum": [
1,
2,
3
],
"type": "integer",
"default": 2,
"description": "Analysis depth. 2 = Standard is the right default for verification; 1 = Surface is city-level only and will rarely contradict anything; 3 = Forensic adds contradiction checks (10 credits)."
},
"scope": {
"type": "object",
"required": [
"name",
"lat",
"lng"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"name": {
"type": "string",
"description": "Place name, e.g. \"Doral, Florida\"."
},
"radius_km": {
"type": "number",
"default": 60,
"description": "How far from the centre still counts as the claimed place. Defaults to 60km, which covers a metro area."
},
"captured_at": {
"type": "string",
"description": "When the image is CLAIMED to have been taken. Optional, and worth sending whenever the claim carries a date, because it is the only check here that does not depend on the model's own confidence. A bare date (2026-09-12) returns whether the sun rose at that place at all that day and for how long; at high latitudes that alone can contradict a daylit image outright. A time WITH a UTC offset (2026-09-12T14:30:00-04:00) additionally returns the sun's altitude and compass direction at that moment. A time WITHOUT an offset has its clock time ignored and only its date used: an assumed timezone can turn noon into midnight, so it is never guessed."
}
},
"description": "The location being claimed. Oceanir treats this as a search boundary and never as evidence: it can only narrow the search, never raise confidence, and the model will reject it outright on hard image-legible contradiction (signage in an impossible script, the wrong driving side, a landmark that is elsewhere)."
},
"image_b64": {
"type": "string",
"description": "Base64-encoded image bytes (no data: prefix)."
},
"image_url": {
"type": "string",
"format": "uri",
"description": "Public HTTPS URL to the image to test."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.