Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/steadfastasart/geoscience-skills/harmonicanpx skills add SteadfastAsArt/geoscience-skills --skill harmonicagit clone --depth 1 https://github.com/SteadfastAsArt/geoscience-skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/steadfastasart/geoscience-skills/harmonica)<a href="https://agentmods.dev/skills/steadfastasart/geoscience-skills/harmonica"><img src="https://agentmods.dev/badge/skills/steadfastasart/geoscience-skills/harmonica.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00109 | $0.01866 |
| Opus 5 | $0.00055 | $0.00933 |
| Sonnet 5 | $0.00022 | $0.00373 |
| Haiku 4.5 | $0.00011 | $0.00187 |
Grade A, and why
harmonica scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 192 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Harmonica - Gravity and Magnetics
Quick Reference
import harmonica as hm
import numpy as np
# Forward model - prism gravity
prism = [-500, 500, -500, 500, -2000, -500] # (west, east, south, north, bottom, top)
gravity = hm.prism_gravity(coordinates, prism, density=500, field='g_z')
# Terrain correction
layer = hm.prism_layer((easting, northing), surface=topo, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity(coordinates, field='g_z')
# Equivalent source gridding
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit(coordinates, gravity_data)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
# Upward continuation (requires gridded xarray)
upward = hm.upward_continuation(gravity_grid, height_displacement=1000)
Key Functions
| Function | Purpose |
|---|---|
point_gravity |
Gravity from point masses |
prism_gravity |
Gravity from rectangular prisms |
tesseroid_gravity |
Gravity from spherical prisms (regional/global) |
prism_magnetic |
Magnetic anomaly from prisms |
prism_layer |
Create layer of prisms from topography |
EquivalentSources |
Grid scattered data with equivalent sources |
upward_continuation |
FFT-based upward continuation |
bouguer_correction |
Simple Bouguer plate correction |
Essential Operations
Forward Model - Rectangular Prism
# Define prism: (west, east, south, north, bottom, top) in meters
prism = [-500, 500, -500, 500, -2000, -500]
density = 500 # kg/m3 density contrast
# Observation grid
x_obs, y_obs = np.meshgrid(np.linspace(-5000, 5000, 100), np.linspace(-5000, 5000, 100))
z_obs = np.zeros_like(x_obs)
# Calculate gravity (mGal). Fields: 'g_z', 'g_north', 'g_east', 'potential'
gravity = hm.prism_gravity((x_obs.ravel(), y_obs.ravel(), z_obs.ravel()),
prism, density, field='g_z')
Terrain Correction
import xarray as xr
topo = xr.open_dataarray('dem.nc')
layer = hm.prism_layer((topo.easting.values, topo.northing.values),
surface=topo.values, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity((obs_easting, obs_northing, obs_height), field='g_z')
bouguer_anomaly = free_air_anomaly - terrain_effect
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 192 lines · 109 tokens per session scan A 62cfa33bd7cd
harmonica is a skill published in the GitHub repository SteadfastAsArt/geoscience-skills (57 stars, last pushed 5mo ago), licensed MIT. It adds 109 tokens to every session and 1,866 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
cmtj-simulation
Write correct CMTJ macromagnetic simulations (LLGS dynamics, Smit-Beljers statics, PIMM/VSD/FMR procedures, stochastic/thermal runs, parallel sweeps, stacks) with right units, layer setup, drivers, and solver choice. Use when writing/reviewing/debugging a cmtj simulation script, adding a Layer/Junction/Stack, setting…
glm-lake-mendota
Simulate vertical water temperature profiles for lakes using the General Lake Model (GLM), calibrate key parameters to minimize RMSE against field observations, and produce validated NetCDF output.
map-to-evo-schemas
Use when implementing the reader and geoscience-object builder for an Evo data converter — turning a parsed file into evo-schemas objects. Covers implementing read file, building Pointset/TriangleMesh/grid/etc. objects, uploading arrays via dataclient.savetable or the parquet-hash pattern, and setting CRS, bounding…
build-evo-converter
Use when building a complete new Evo data converter from scratch, end to end. Orchestrates the four phases — scaffolding, discovery, mapping to Evo geoscience objects, and testing — for turning a third-party geoscience file format into published Evo objects. Use for: 'build a converter for X', 'add support for a new…
converter-discovery
Use when starting a new Evo data converter and you need to understand the input file format before writing code. Inspects sample data, identifies the format, finds a suitable open-source reader library (license-checked), and maps the data to Evo geoscience object types. Use for: 'build a converter for X format', 'what…
obspy-seismology
Seismological data analysis with ObsPy — FDSN waveform download, response removal, phase picking, moment tensor inversion, and seismicity mapping.