vortx-ai/emem/emem-field-tokens
Claude Code and agent skill by vortx-ai/emem
- community
Checking that the SKILL.md file is still in the repository.
Fetches a native-resolution raster field over an area from emem, or the same field over several dates. The result is a signed artifact that anyone can re-derive, not a set of per-cell values. Use when the user needs the grid of values over an area, not one number at one point. Examples are a world-model input, a band or NDVI layer, change over a scene window, or pixels a third party can re-hash. Returns content-addressed grid artifacts, a signed derivation record, and an emem:raster, emem:cube or emem:rasterset token. Reads need no key.
Install
npx vskill@latest install vortx-ai/emem/emem-field-tokensSKILL.md
emem-field-tokens
| Use it when | The user needs a grid of pixel values over an area, at one date or at several dates. | |
| You need | A bounding box (min_lat, min_lng, max_lat, max_lng) and a band. Dates are optional. No key. | |
| You get | A grid artifact with its BLAKE3 name (artifact_cid), a signed derivation record, a receipt, and an emem:raster: or emem:cube: token. | |
| Calls | POST /v1/band_raster, /v1/band_composite, /v1/band_cube, then /v1/raster/resolve or /v1/cube/resolve to check a token. |
Network use. The commands in this skill send JSON tohttps://emem.devand receive JSON or a raster file from it.https://emem.devis the service that the MCP server of the plugin connects to. The commands do not execute what they download. The files underscripts/read local files and make no network calls.
A world model reads a field over an area, often across time. This skill gets that field from emem as a signed artifact. Another party can fetch the same bytes again, or compute them again, and get the same hash.
Calls in this skill
| Call | What it returns | |
|---|---|---|
POST /v1/band_raster | One field over a bbox at one date, and an emem:raster: token. | |
POST /v1/band_composite | A cloud-free median of one band over a date window. Same shape as band_raster. | |
POST /v1/band_cube | The same field at several dates: a signed list of raster slices, and an emem:cube: token. | |
POST /v1/raster_bundle | 2 to 64 raster tokens as one set, and an emem:rasterset: token. | |
POST /v1/raster/resolve, /v1/cube/resolve, /v1/raster_bundle/resolve | The signed record behind a token. With "spot_check": true, the raster route also reads sample pixels back. | |
POST /v1/cells_in_bbox | The cell64 addresses in a bbox, in pages. Use it when you want addresses, not a grid. |
Each route has an MCP tool that takes the same JSON body: emem_band_raster, emem_band_composite, emem_band_cube, emem_raster_bundle, emem_raster_resolve, emem_cube_resolve, emem_raster_bundle_resolve and emem_cells_in_bbox. These tools are not in the short tool list of the plugin. The MCP server runs them by name through tools/call. If your host calls only listed tools, or has no MCP, send the body to the REST route. The steps below use REST.
The receipt does not sign a pixel value. It signs a derivation: this responder made the artifact named artifact_cid from a pinned Sentinel-2 scene, over an area named aoi_cid, at one time slot.
When to use a different skill
| Question | Use | |
|---|---|---|
| One value at one place | `emem-locate-and-recall` | |
| Signed per-cell facts inside an area | `emem-recall-polygon` | |
| A picture to look at | GET /v1/scene.png?bbox=w,s,e,n, see `emem-field-signals`. It is a view, not a signed artifact. |
Step 1: fetch one field
/v1/band_raster accepts these bands:
| Band | Source | Window cap | |
|---|---|---|---|
s2.B02, s2.B03, s2.B04, s2.B08, s2.B11, s2.B12 | Sentinel-2 L2A reflectance | 512 px a side, about 5.1 km at 10 m | |
copdem30m.elevation | Copernicus GLO-30 DEM. Open ocean has no tile. | 512 px a side | |
forest_change.lossyear, forest_change.treecover2000, forest_change.gain, jrc_gfc2020.forest_2020, jrc_tmf.deforestation_year | Static forest layers | 1024 px a side |
The band list and the caps come from crates/emem-api-rest/src/band_raster.rs. A larger window gets a refusal that gives the size and the cap. Split the area into smaller boxes. To ask for a capture date, add "observed_on": "YYYY-MM-DD". The responder pins the scene that it used in both cases.
Send this body to POST https://emem.dev/v1/band_raster:
Save the answer as raster.json. Then print a summary:
On 7 November 2026 this call returned in 0.6 s at 00:56 UTC and in 1.3 s at 02:56 UTC:
| Field | 00:56 UTC | 02:56 UTC | |
|---|---|---|---|
grid | 32 x 32 px, 10 m, EPSG:32643 | same | |
scene | S2A_MSIL2A_20261104T054241_R005_T43SFS_20261104T085202 | same | |
artifact_cid | 77zgrf4hiv4cnzqblgkttrg4jssvh5sghhvdqjjq3wnj77nmgpma | same | |
tokens.raster | emem:raster:tllufj6j...:s2.B04:20761:2w5daw7i... | emem:raster:tllufj6j...:s2.B04:20761:tsgxwzhu... |
Each call signs and stores a new derivation record. The record contains its signing time, so each call gives a new derivation_cid and a new token. The artifact_cid stays the same while the scene stays the same. Both tokens resolve. To compare two rasters, compare their artifact_cid values, not their tokens.
Without a date, the responder picks a recent usable scene. When a newer scene arrives, the artifact_cid changes too.
Step 2: download the bytes and hash them again
Download the file at artifact.url. No MCP tool returns the bytes. Send a GET to https://emem.dev/v1/artifacts/77zgrf4hiv4cnzqblgkttrg4jssvh5sghhvdqjjq3wnj77nmgpma and save the bytes as artifact.bin. Then hash them again:
Use your own artifact_cid from step 1 in the URL and in the command. ${CLAUDE_SKILL_DIR} is the directory of this skill. Claude Code sets it.
Output of rehash.py | Exit code | Meaning | |
|---|---|---|---|
The computed cid, then MATCH | 0 | The bytes are the bytes that the record names. | |
The computed cid, then MISMATCH | 1 | The bytes changed, or you used a different cid. | |
emem_crypto.py not found | 2 | The script is not beside emem_crypto.py. |
On 7 November 2026 the file was 4160 bytes and rehash.py printed MATCH. With a different cid, it printed MISMATCH. rehash.py gets BLAKE3 from scripts/emem_crypto.py, which ships with this skill. It is plain Python with no third-party packages. rehash.py --self-test checks it against the official test vectors.
The file format is application/x.emem-grid-f32.v1. It has a 64-byte header, then a little-endian f32 array. The header starts with the magic EMEMGRD1, then width, height, epsg, nodata, the origin and the steps. NaN is nodata. A 32 x 32 grid is 64 + 32 x 32 x 4 = 4160 bytes.
Step 3 (optional): get a cloud-free composite
/v1/band_composite takes the median of one Sentinel-2 band over a date window. It removes cloud pixels by their scene class first.
Send this body to POST https://emem.dev/v1/band_composite:
Save the answer as composite.json. Then print a summary:
max_scenes is 2 to 16, and the default is 12. min_valid_count (default 1) sets how many clear samples a pixel needs. On 7 November 2026 this call used 4 scenes and returned in 1.4 s. The result has the same shape as a band_raster result. Check it with steps 2 and 5.
Step 4 (optional): fetch the field at several dates
Send this body to POST https://emem.dev/v1/band_cube:
Save the answer as cube.json. Then print the members:
A cube contains no new pixels. It is a signed list of member_count raster slices, one for each scene. You can resolve each slice alone. If two dates map to the same scene, they become one member. Each member gives its requested_dates and the distance in days to its scene. cube_cid is the BLAKE3 of the ordered member derivation cids.
On 7 November 2026 this call returned three members:
| Requested date | Scene date | requested_date_distance_days | |
|---|---|---|---|
| 2026-05-15 | 2026-06-10 | 26 | |
| 2026-06-15 | 2026-06-30 | 15 | |
| 2026-07-15 | 2026-08-03 | 19 |
A cube member is not a reading on the requested day. When you report a member, give the requested date and the distance.
Step 5: check a token that you received
For a raster token, send it with spot_check to POST https://emem.dev/v1/raster/resolve:
Read resolved, artifact.url, receipt.field, spot_check.passed and spot_check.anchors in the answer.
On 7 November 2026 this returned resolved: true, passed: true and anchors: 5.
| Field | Meaning | |
|---|---|---|
resolved | The token matches the signed record. | |
artifact.url | Where to download the bytes for step 2. | |
receipt.field | The aoi_cid and derivation_cid that the receipt signature covers. | |
spot_check.passed | The sampled pixels in the artifact agree with the values in the signed record. | |
spot_check.anchors | The number of sampled pixels. | |
spot_check.fact_matches_grid | Sampled pixels that also agree with a signed per-cell fact. It is 0 when the store holds no such fact. |
For a cube token, send {"token": "emem:cube:..."} to /v1/cube/resolve. Read resolved and member_tokens. On 7 November 2026 the cube from step 4 resolved with 3 member tokens.
The responder checks each part of the token against the signed record before it reads the artifact. If the area, band or date does not match, you get HTTP 409. For example, a raster token with s2.B08 in place of s2.B04 returned:
To check the receipt signature offline, use `emem-verify-receipt` on raster.json. On 7 November 2026 it printed VALID, primitive emem.band_raster, with the FIELD segment bound.
Step 6 (optional): put several rasters in one set
Send 2 to 64 raster tokens to POST /v1/raster_bundle:
The result has an emem:rasterset: token. Check it with /v1/raster_bundle/resolve. This call stores a new bundle record on the responder, so this page does not show a live run.
List the cells in an area
Send this body to POST https://emem.dev/v1/cells_in_bbox:
Read total, count, next_cursor and the first entry of cells[] in the answer.
On 7 November 2026 this box had total: 1394 cells. The first page had 1024 cells and next_cursor: 1024. Send "cursor": <next_cursor> to get the next page. Stop when next_cursor is null. You can send each page to POST /v1/recall_many with a budget_ms. This call reads no facts and returns no receipt.
Limits and failures
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/emem/skills/emem-field-tokens/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/vortx-ai/emem/emem-field-tokens)