Skip to main content

MCP Server — GEIANT Perception Service

The GEIANT perception service is a live Model Context Protocol server that exposes geospatial AI tools over SSE. Every tool call is audit-wrapped with delegation checks and breadcrumb drops.

Connection

SSE endpoint: https://packagesmcp-perception-production.up.railway.app/sse
Messages: POST /message?sessionId=<id>
Health: GET /health

Connect with MCP SDK

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';

const BASE = 'https://packagesmcp-perception-production.up.railway.app';
const transport = new SSEClientTransport(new URL(`${BASE}/sse`));
const client = new Client({ name: 'my-app', version: '1.0.0' });

await client.connect(transport);
const tools = await client.listTools();
console.log(tools.tools.map(t => t.name));
// ['perception_fetch_tile', 'perception_classify',
// 'perception_embed', 'perception_weather']

Connect with Claude Desktop

Add to your Claude Desktop MCP config (~/.config/claude/claude_desktop_config.json):

{
"mcpServers": {
"geiant-perception": {
"url": "https://packagesmcp-perception-production.up.railway.app/sse"
}
}
}

Available Tools

perception_weather

Fetch historical or forecast weather for any H3 cell via Open-Meteo ERA5.

const result = await client.callTool({
name: 'perception_weather',
arguments: {
h3_cell: '851e8053fffffff', // Rome
timestamp: '2026-03-20T12:00:00Z', // Optional, defaults to now
write_to_spatial_memory: false, // Write result to Supabase
},
});

const weather = JSON.parse(result.content[0].text);
// { temperature_c: 18.1, wind_speed_ms: 1.57, status: 'ok', ... }

perception_fetch_tile

Fetch Sentinel-2 L2A satellite tiles for any H3 cell. Returns STAC metadata and band URLs.

const result = await client.callTool({
name: 'perception_fetch_tile',
arguments: {
h3_cell: '851e8053fffffff',
max_cloud_cover: 20,
bands: ['B02', 'B03', 'B04', 'B8A', 'B11', 'B12'],
},
});

perception_classify

Run Prithvi-EO-2.0 foundation model inference on a fetched tile. Requires a running RunPod GPU endpoint.

const result = await client.callTool({
name: 'perception_classify',
arguments: {
h3_cell: '851e8053fffffff',
model: 'prithvi-eo-2.0-300m',
task: 'flood_detection',
},
});

perception_embed (Planned)

Generate Clay v1.5 geospatial embeddings for a tile. Phase 4.2 — coming soon.

HTTP Endpoints

Beyond MCP tools, the service exposes REST endpoints:

EndpointMethodDescription
/healthGETService status, chain tip, audit state
/test/weatherGETQuick test — drops a breadcrumb
/epoch/rollPOSTRoll all unrolled breadcrumbs into an epoch
/complianceGETGenerate EU AI Act compliance report
/compliance/:agent_pkGETCompliance report for a specific agent

Epoch Rollup

curl -X POST https://packagesmcp-perception-production.up.railway.app/epoch/roll
{
"success": true,
"epoch_index": 1,
"block_count": 3,
"start_block": 5,
"end_block": 7,
"merkle_root": "6fa3e35a8f8fd9d4...",
"tier_at_close": "provisioned",
"epoch_hash": "5c6b317cadc39538..."
}

Compliance Report

curl https://packagesmcp-perception-production.up.railway.app/compliance

Returns a full EU AI Act compliance report with chain verification, epoch summaries, delegation certificate, trust score, and violation history.

Audit Trail

Every MCP tool call automatically:

  1. Pre-flight: Checks delegation certificate (jurisdiction, facet, temporal validity, tool whitelist)
  2. Executes: Runs the actual tool
  3. Post-flight: Builds context digest, chains to previous block, Ed25519-signs, writes to Supabase

If pre-flight fails, the tool call is blocked — it never executes. A compliance violation is logged instead.

The chain tip is visible in the /health endpoint:

curl -s .../health | jq '{chain_tip, audit_active, agent_pk}'
# { "chain_tip": 8, "audit_active": true, "agent_pk": "c14094ea7efb6122" }