me-sh
command-line tools for me.sh.
mesh lets you inspect contacts, groups, activity, routes, and local snapshots from the terminal. reads are easy to run. writes need --yes, and most write paths can print a --dry-run plan first.
status: alpha. the cli is published on crates.io, works locally, and has unit coverage. macos is the only claimed local platform so far.
limits
- requires a me.sh account and api access.
- tested locally on macos. linux and windows are not claimed until ci/release builds cover them.
mesh loginbinds a local oauth callback on127.0.0.1:6374.mesh login --openuses the macosopencommand. without it, copy the printed url into a browser and paste the callback url or code.- tokens are stored in
~/.config/mesh.jsonwith0600permissions on unix. oldermesh-cli.jsonandclay-cli.jsonconfigs are migrated when read. - the observed me.sh route set does not expose hard delete for contacts or groups.
- notes are create/read through the observed routes. events, emails, and reminders are read-only.
- search has an observed server-side
limit <= 1000cap.offset,page, andskipdid not paginate in live checks; the tool usesexclude_contact_idsfor full exports.
install
install from crates.io:
source checkout install, for local development or testing unreleased changes:
the package is me-sh; the installed command is mesh.
quick start
use --help anywhere:
common work
writes
write commands require --yes unless --dry-run is used.
write paths include contact create/update/archive/restore, group create/update/sync, note creation, bulk apply commands, merge, and snapshot restore.
output
global output controls:
formats:
json
compact-json
jsonl
csv
tsv
table
long snapshot and archive commands draw progress on stderr only when stderr is a terminal. set MESH_NO_PROGRESS=1 to silence it. MESHX_NO_PROGRESS=1 still works for older setups.
when stderr is not a terminal, error reports and retry warnings are plain ascii: no colors, no unicode art, no line wrapping.
exit codes:
0 success
1 generic failure, including partial bulk-write failures that already printed a report
2 usage error, reported by clap itself
3 auth: not logged in, token refresh failed, or HTTP 401/403 from the api
4 network: connect, timeout, or other transport error
5 server returned any other non-2xx HTTP status
--error-format json (env MESH_ERROR_FORMAT, values human|json) replaces the human error report on stderr with one line of json. class and exit_code always agree with the exit codes above. http and retry_after_seconds are null when not applicable; usage errors are still reported by clap in human form.
config
the default config path is:
~/.config/mesh.json
environment variables:
MESH_CONFIG config file path
MESH_ACCESS_TOKEN use this access token instead of stored auth
MESH_API_BASE api base url, default https://api.me.sh
MESH_MCP_BASE mcp tool base url, default https://mcp.me.sh
MESH_NO_PROGRESS disable terminal progress lines
mesh config:show redacts access and refresh tokens. diagnostics do not print tokens.
generated files
safe to delete after you are done with a local run:
target/
work/
*.log
snapshot packaging may create .meshx-index/ sidecars and .meshx-package.json metadata inside archives. export resume writes *.meshx-state.json. those names are part of the current local file format.
development
focused commands:
make check runs format check, clippy, tests, release build, and binary smoke checks.
ci runs the same command on pull requests and pushes to main.
release
release is verification, not just a tag.
see RELEASE.md for the checklist.
license
copyright (c) 2026 sigkillme0.
licensed under gpl-3.0-or-later. see LICENSE.