Skip to content

MCP servers › io.github.kfireliyahu › emerald

MCP server · registry snapshot 2026-10-23 · last tested 2026-10-23

io.github.kfireliyahu/emerald

The database under the chat: a local SQLite file a model asks for rows, not notes to re-read. — the publisher's description

8 of 9 record checks metRead-only · tools listed 2026-10-23Topic: data-and-databases · AI-classifiedversion 0.1.6TypeScriptAGPL-3.0-onlystandard input/output85 tools

Summary

io.github.kfireliyahu/emerald is a local MCP server listed in the official MCP registry at version 0.1.6. On 2026-10-23 ProtocolProbe started its published package in an isolated sandbox in read-only mode and read its inventory: 85 tools, 1 resource and 0 prompts.

Record checks

8 of 9 record checks met

  • met: Registry entry is active and says how to run it
  • met: Source repository link opens
  • met: Repository is not archived
  • met: Code pushed to the repository in the 90 days before our check
  • met: Repository publishes a security policy (SECURITY.md)
  • met: Package names its licence with a standard (SPDX) identifier
  • met: The version the registry lists can be installed and is not withdrawn
  • not met: npm package carries build provenance (attestation)
  • met: No known critical or high advisory in the package or its dependencies
  • #3,357 of 15,112 packages by monthly downloads, tied with 5 others
  • Not ranked by stars: 2 stars (ranked from 10)

From public records, not a safety rating. Each check with its reason · Is it safe to install?

Key facts

Runs
local package
Transport
standard input/output
Package
npm · listed version current
License
AGPL-3.0-only
Dependencies
no known high or critical advisories
Repository
public
Tools
85
Described as changing data
55 of 85 toolsAI-classified
Mainly works on
a databaseAI-classified
Topic
data-and-databasesAI-classified
Last tested
2026-10-23

Add to your client

Worth knowing before you connect it

  • 55 tools are described as changing something (declare_format, connect_formats, extend_format, …): our AI model's reading of the descriptions, not something we tested. We did not call them.

Each line comes from a section below, with its source and date.

How fresh this is

Live-tested
yes, a real session (not a text-only review)
Last tested
2026-10-23
Mode
read-only (no tool calls)
Latest version
0.1.6, published 2026-10-20 (registry, as of the 2026-10-23 snapshot)
First listed version
2026-10-18 (earliest version still in the registry; older removed versions would be earlier)
Version history
5 versions listed, 2026-10-18 to 2026-10-20; 5 in the 90 days before the 2026-10-23 snapshot.
Most recent 5 versions
  • 0.1.6 · 2026-10-20
  • 0.1.5 · 2026-10-19
  • 0.1.4 · 2026-10-19
  • 0.1.2 · 2026-10-18
  • 0.1.1 · 2026-10-18
(versions still listed in the registry only)
Registry data
snapshot 2026-10-23
Package and repository
checked 2026-10-23
Engine
mcp-runtime-engine@0.1.0 · sdk@1.32.0

Changes since the last refresh

New in the registry: not in the list of 2026-10-04, listed on 2026-10-23 with version 0.1.6 (published 2026-10-20).

Source: the official MCP Registry list on 2026-10-04 and on 2026-10-23.

What it is

What does this server offer?

Observed inventory
85tools
1resources
0prompts

What it mainly works on, as our AI model read its tool descriptions: a database.

55 of 85 tools are described as changing something (creating, editing, deleting, sending or running). For 5 the reading was uncertain, so no mark is shown.

  • formatsreads or searches

    “What kinds of thing this document holds — every format declared in it, with its columns, their types, units, bounds and enum members, and the prose the author wrote around them.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstring“One declared format by name, for its full column list.”
  • declare_formatcreates or changes datadescribed as changing data

    “Bring a **new** kind of thing into a document: a format, compiled to a real table with real types and checks.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    13 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstring“The name of the format, `snake_case` — `ingredient`.”
    • formatsarray“Several new formats, each `{ format, title, columns, … }`.”
    • titlestring“What a person calls one of these — `Ingredient`.”
    • notesstring“Prose about the format.”
    • columnsarray“The columns, in the order they should read.”
    • claimsarray“What is claimed about one of these, proved or failed on every row.”
    • aggregatesarray“What this format works out from the rows of another that point at it.”
    • constraintsarray“Rules across the columns of one row, each `{ rule, note }` — `rule` is one of `x is required when kind is A, B`, `x is required only when kind is A, B` (and em…”
    • rollupsarray“Figures per month over this format’s rows, each `{ name, works_out, note }`: `sum of minutes by month of done_on or started_on and project where status is DONE…”
    • rule_setsarray“Rows of this format as rules setting a link of another, each `{ name, sets, note }`: `note.topic from target when title matches pattern by kind (EXACT equals, …”
    • computedarray“Computed columns, worked out rather than typed, each `{ name, works_out, note }`: a claim’s expression with no `=` — `price * (1 + vat)`, `amount in g`, `link.…”
    • commitboolean“Write it.”
  • connect_formatscreates or changes datadescribed as changing data

    “Join two formats this document **already** declares: a `link` column on `format`, so each of its rows belongs to one row of `target` — each `recipe_line` belongs to one `recipe` — and, optionally, a …”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    9 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The format that gets the link — the many side, `recipe_line`.”
    • targetstringrequired“The format each row belongs to one of — `recipe`, the one side.”
    • columnstring“The link column’s name, `snake_case`.”
    • requiredboolean“Every row must name one.”
    • notestring“What the link means.”
    • found_bystring“How the link fills itself while empty: `date in period` (this date’s month) or `date on paid_on` (the same day).”
    • aggregateobject“The total `target` keeps of the rows that name it: a `name` in `snake_case`, an `of` — one of sum, count, average, minimum, maximum — a `works_out` expression …”
    • commitboolean“Write it.”
  • extend_formatcreates or changes datadescribed as changing data

    “Change a format this document **already** declares, as its table does: add `columns`, `claims`, `computed` columns, `unique`, `constraints`, `rollups` and `aggregates` as `declare_format` takes them;…”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    15 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The format to change, by name.”
    • columnsarray“The new columns, after the ones it has.”
    • claimsarray“New claims, each with a `name`, an `expression` with one `=`, an optional `tolerance` and a `note` — as `declare_format` takes them.”
    • uniquearray“Columns it already has that should become unique — refused, naming the repeated values, while two rows share one.”
    • constraintsarray“New row constraints, each `{ rule, note }` as `declare_format` takes them — refused, naming the rows, while any row already breaks one.”
    • rollupsarray“New rollups, as `declare_format` takes them.”
    • rule_setsarray“New rule sets.”
    • computedarray“New computed columns, as `declare_format` takes them.”
    • aggregatesarray“New totals, as `declare_format` takes them.”
    • orderarray“Every column, new ones too, once each, in order.”
    • renameobject“`{ old: new }`.”
    • changearray“Columns it has, named, with what changes: `{ name, type: "enum", values }`.”
    • removearray“Names of columns, claims, totals, computed columns, rollups or rule sets.”
    • commitboolean“Write it.”
  • delete_formatdeletesdescribed as changing data

    “Remove a declared format: its declaration, its table and **every row in it**.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The format to remove, by name.”
    • commitboolean“Remove it.”
  • format_rowsreads or searches

    “The rows this document holds of one declared format.”

    Publisher declares: read-only yes · destructive no · open-world no

    10 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • matchobject“Column name to the value it must equal.”
    • searchstring“A substring, in every column as shown but yes/no.”
    • columnsarray“Column names to show, as a table — stored or computed.”
    • orderstring“A declared column to sort by.”
    • descendingboolean“Sort the other way.”
    • limitnumber“Rows to return.”
    • offsetnumber“Rows to skip first — the `offset` a cut-short answer hands back for the rest.”
    • valuesstring“A column: each value it holds and how many rows, under the other filters.”
  • show_formatreads or searches

    “Shows the person one declared format as the app draws it — its table, or its board, roadmap or ready-to-start list when the format has one; or the agenda, every dated format’s rows from today — in th…”

    Publisher declares: read-only yes · destructive no · open-world no

    6 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstring“The declared format, by name.”
    • viewstring“Which of the format’s views to open on.”
    • matchobject“Column name to the value it must equal.”
    • searchstring“A substring, in every column as shown but yes/no.”
    • columnsobject“Columns its lines draw, by format: `{unit:[title,state]}`.”
  • format_problemsreads or searches

    “What the engine can see is wrong in a format’s rows, without a rule anybody wrote: a link empty where most rows fill it, rows the same in every column, claims failed or unchecked.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatsarray“By name.”
  • search_documenton 3 other serversreads or searches

    “Every row of every format, and the rest of the file, that holds any of `terms`: each hit by format, row and column, columns searched as shown.”

    Publisher declares: read-only yes · destructive no · open-world no

    3 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • termsarray“Words or phrases, any case, up to 50.”
    • denyliststring“Instead of `terms`: a denylist’s absolute path, `literal==>x` or `regex:pattern==>x` a line.”
  • start_hereon 15 other serversreads or searches

    “Call first.”

    Publisher declares: read-only yes · destructive no · open-world no

    1 input, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
  • format_rollupreads or searches

    “A rollup a format declares, run: a figure per month, and per linked row.”

    Publisher declares: read-only yes · destructive no · open-world no

    6 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • rollupstring“By name; optional when there is one.”
    • fromstring“First month, `YYYY-MM`.”
    • tostring“Last month, `YYYY-MM`.”
    • limitnumber“Groups.”
  • apply_ruleson 1 other serverruns code or commandsdescribed as changing data

    “Run a rule set over every row it sets — a write applies it by itself.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The format whose rows are the rules — or, with `link`, the one the link is on.”
    • rule_setstring“By name; optional when there is one.”
    • linkstring“A link column found by a date (`found_by`): fill the rows where it is empty.”
    • commitboolean“Write it.”
Show 73 more tools
  • record_format_rowscreates or changes datadescribed as changing data

    “Write rows into a declared format — **a list of them in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    4 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • rowsarrayrequired“One object per row, keyed by declared column name.”
    • commitboolean“Write it.”
  • update_format_rowscreates or changes datadescribed as changing data

    “Change columns of rows already stored — **a list of edits in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • editsarrayrequired“One entry per row.”
    • commitboolean“Write it.”
  • delete_format_rowsdeletesdescribed as changing data

    “Remove rows from a declared format by id — **a list of them in one call**.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    4 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • idsarrayrequired“Row ids, as `format_rows` printed them.”
    • commitboolean“Remove them.”
  • claim_unitscreates or changes datadescribed as changing data

    “In a document that keeps the `development` pack, take units by `ref`: `planned` to `in_progress` with `taken_by`, the git `branch` they are taken on and `started` (default today), the batch refused u…”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    7 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • unitsarrayrequired“Refs, up to 50.”
    • taken_bystringrequired“Who takes them: the host’s name for its session.”
    • branchstring“The git branch they are taken on.”
    • startedstring“`YYYY-MM-DD`; today if left out.”
    • take_overstring“The `taken_by` whose claim this replaces, for units already in progress.”
    • commitboolean“Write it.”
  • land_unitscreates or changes datadescribed as changing data

    “In a document that keeps the `development` pack: a unit’s closing pass in one call, for a list of units by `ref`: their new `decisions` (date, milestone, scope and `state: live` default to the unit’s…”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    4 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • unitsarray“Up to 50.”
    • inboxarray“Inbox row ids of landing proposals, or `{id, other_branch}`.”
    • commitboolean“Write it.”
  • dispatch_planreads or searches

    “In a document that keeps the `development` pack, before handing units out: for unit refs (every ready unit if left out), which can run at once and which share a path in their `paths` — one per line —…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • unitsarray“Refs, up to 50.”
  • record_unitscreates or changes datadescribed as changing data

    “Teach this document a unit it does not know — `slice`, `IU`, a tablespoon that is 20 ml in this kitchen.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • unitsarray“One object per unit.”
    • currencystring“The document’s currency, a three-letter code: `ILS`.”
    • commitboolean“Write it.”
  • read_onto_formatcreates or changes datadescribed as changing data

    “Read what the user already keeps onto a declared format: any .csv, .xlsx (or .xls) or .json of rows, a file row per table row; or **a folder of Markdown notes**, a note per row: `title`, `file`, each…”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    16 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstring“The declared format to read onto, by name.”
    • filestring“Absolute path to the file to read: one of .xlsx, .xls, .csv, a .json file of rows (an array of objects, or an object holding one), a Markdown note (.md), or **…”
    • filesarray“Instead of `format` and `file`: each `{ file, format }`, plus that file’s own columns.”
    • sheetstring“Which sheet, or key of a .json object; defaults to the first.”
    • recursiveboolean“A folder of notes: its subfolders’ notes too (not a hidden one), with a `folder` column, the path under it.”
    • header_rownumber“Force the header row, from 0, when the guess is wrong — exports often have a preamble.”
    • date_orderstring“How a written date is ordered: one of dmy, mdy, ymd.”
    • columnsobject“Column number → key of the format, from what the user confirmed, or → null to read nothing from that column.”
    • fixedobject“Key → one value for every row of this file.”
    • separatorsobject“Key → what splits one cell into several members, for a column holding several of a list (`enums`): `{ "tags": "," }` reads `vegan, quick` as two.”
    • headerobject“`{ format, link, cells, fixed }`: the one row of another format this file writes and every line links to through `link`.”
    • itemsstring“"list" or "table": a folder’s list items or table rows as rows of `format`, each linked to its note’s row (read the notes in the same `files`, or before).”
    • understring“With `items`: only those under this heading.”
    • remove_goneboolean“Read again: remove rows whose line is gone (else named, kept).”
    • commitboolean“Write it.”
  • supersede_readingdeletesdescribed as changing data

    “Take back the rows one file wrote onto a declared format — **exactly those rows and no others**.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    4 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The declared format, by name.”
    • readingstring“The reading to take back, by id.”
    • commitboolean“Do it.”
  • readerscreates or changes datadescribed as changing data

    “List a declared format’s readers — one per kind of file it has read — or name and forget them.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    5 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • formatstringrequired“The format, by name.”
    • renamearray“`{ reader, name }`, by id; an empty name restores the file’s.”
    • forgetarray“Reader ids.”
    • commitboolean“Do it.”
  • keep_copycreates or changes datadescribed as changing data

    “Backs the document up now: a copy as it is, in Emerald’s folder, named for what it comes before (`work.before-20261006T120512-cleanup.emd`), and says where.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • beforestring“What it comes before, in a few words: `the cleanup`.”
  • store_document_ascreates or changes datadescribed as changing data

    “Writes the document again as `text` (diffs in git) or as `sqlite` bytes, and every later write keeps that shape — the app’s Save as text.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • asstringrequired“How the file is stored from now on.”
    • commitboolean“Write it.”
  • arrange_viewscreates or changes datadescribed as changing data

    “How the app shows a format: on its entry, a column’s `show_as`, `header` line and the `order`; a board’s lanes; a table column’s `width`; a column’s `setting` in a roadmap, a ready list or a start-he…”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • settingsarrayrequired“Up to 200.”
    • commitboolean“Write it; omit for the dry run.”
  • create_documenton 23 other serverscreates or changes datadescribed as changing data

    “Create a new .emd document at a path that does not exist yet; never overwrites.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs
    • pathstring“Full path for the new document, ending in .emd.”
    • packsarray“The packs the document starts with, by id; `[]` for none.”
  • keep_packscreates or changes datadescribed as changing data

    “Keep packs in an existing document (the Packs screen’s *Keep this pack here*): declares the pack’s formats it lacks, adds missing optional columns to those it holds, renames a column the pack renamed…”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • packsarrayrequired“The packs to keep, by id.”
    • commitboolean“Keep them.”
  • document_inforeads or searches

    “Describe an Emerald document (a .emd file): whether this plugin will serve it, the formats it declares with how many rows each holds, and — when it keeps the ledger — its accounts, transactions, cate…”

    Publisher declares: read-only yes · destructive no · open-world no

    1 input, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
  • category_treereads or searches

    “The document category taxonomy: every category full path (Living → Utilities → Electricity), its id, its kind and its Plan bucket.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • include_archivedboolean“Include archived categories.”
  • uncategorized_merchantsreads or searches

    “The uncategorized backlog, grouped by merchant: how many rows each merchant has, and what the user has already categorized other rows of the same merchant under.”

    Publisher declares: read-only yes · destructive no · open-world no

    7 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • fromstring“Inclusive start of the charge-date range, as YYYY-MM-DD.”
    • tostring“Inclusive end of the charge-date range, as YYYY-MM-DD.”
    • account_idstring“Restrict to one account.”
    • searchstring“Matched against the merchant as written, the normalized merchant, and the provider label.”
    • limitnumber“Merchants to return.”
    • include_amountsboolean“Print what each merchant adds up to.”
  • transactionsreads or searches

    “A filtered page of the ledger, plus the totals over every matching row — not just the page.”

    Publisher declares: read-only yes · destructive no · open-world no

    13 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • fromstring“Inclusive start of the charge-date range, as YYYY-MM-DD.”
    • tostring“Inclusive end of the charge-date range, as YYYY-MM-DD.”
    • account_idstring“Restrict to one account.”
    • searchstring“Matched against the merchant as written, the normalized merchant, and the provider label.”
    • category_idstring“Restrict to one category.”
    • uncategorizedboolean“Only rows with no category.”
    • include_subcategoriesboolean“Read `category_id` as a parent and include its children.”
    • minnumber“Smallest amount, by magnitude, in major units of the document currency.”
    • maxnumber“Largest amount, by magnitude, in major units of the document currency.”
    • sortstring“One of DATE, CHARGED, MERCHANT, CATEGORY, AMOUNT.”
    • directionstring“ASC or DESC.”
    • limitnumber“Rows to return.”
  • month_summaryreads or searches

    “One month already added up: income, expenses, balance, savings rate; how each compares with last month, the three-month average and the same month last year; the category breakdown rolled up to paren…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • monthstring“The month as YYYY-MM.”
  • year_summaryreads or searches

    “One year already added up: income, expenses, balance and savings rate; averages over the complete months only; the best and worst month by balance; a month-by-month table where a month with no data r…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • yearnumber“Four-digit year.”
  • fixed_expensesreads or searches

    “The bills the document tracks: what each is expected to cost, its amortized monthly equivalent, its cadence, whether the amount is fixed or variable, what it is matched against in the ledger, and whe…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • include_inactiveboolean“Include ended bills.”
  • debtsreads or searches

    “Every debt with its principal, what has been paid, what is outstanding, how far along it is and when it projects to be paid off — plus the totals and what card installments still commit the user to.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • include_closedboolean“Include closed debts in the table.”
  • savingson 2 other serversreads or searches

    “Goals and where the money is: net worth — the one figure Overview shows, with its parts (in the bank, in accounts with holdings, locked, pension and hishtalmut funds, owed) — each goal balance broken…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • include_closedboolean“Include closed goals.”
  • goal_projectionreads or searches

    “What each open goal will hold in N months, by plain addition of the amount Plan puts toward it each month (no interest counted), and what a month would have to be to reach it on its date.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • monthsnumber“How many months ahead.”
  • debt_projectionreads or searches

    “What each open debt will have left in N months, by plain addition of its monthly payment and the extra Plan puts toward it (no interest counted), and when it is paid off with and without the extra.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • monthsnumber“How many months ahead.”
  • fixed_expense_candidatesreads or searches

    “What looks like a recurring bill in the imported transactions but has not been confirmed as one: the merchant, the typical charge and its amortized monthly share, the cadence, how many months it was …”

    Publisher declares: read-only yes · destructive no · open-world no

    4 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • window_monthsnumber“How many months of history to look at, 2–24.”
    • ending_atstring“The newest month of the window, as YYYY-MM.”
    • include_dismissedboolean“Also list the merchants that were said no to.”
  • track_fixed_expensescreates or changes datadescribed as changing data

    “Turn recurring charges into tracked bills — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    5 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • expensesarrayrequired“One entry per bill.”
    • window_monthsnumber“The lookback used to re-find the candidates, matching the one you listed them with.”
    • ending_atstring“The newest month of that window, as YYYY-MM.”
    • commitboolean“Default false.”
  • dismiss_fixed_expense_candidatescreates or changes datadescribed as changing data

    “Record that these merchants are not recurring bills, so the detector stops offering them — to this conversation and to every later one.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • merchantsarrayrequired“Normalized merchant names, exactly as `fixed_expense_candidates` printed them.”
    • restoreboolean“Default false.”
  • planson 3 other serversreads or searches

    “The Plan screen as rows: each plan with what every bill does to it (out of net, part of the split, or ignored) and its buckets — what each is for (a goal, a debt, a category, a fund, an account or no…”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • plan_idstring“One plan.”
  • plan_monthreads or searchesdescribed as changing data

    “One plan worked out for one month: net pay, the bills out of net, what is left to split, each bucket’s amount and share, what it actually got lately, when a goal is reached at this rate, money with n…”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    7 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • plan_idstring“Ids come from `plans`.”
    • monthstring“The month as YYYY-MM.”
    • only_bucketsarray“Bucket ids from `plans`.”
    • monthsarray“Months as YYYY-MM to give this plan.”
    • back_to_defaultarray“Months as YYYY-MM of this plan to put back on the default plan.”
    • commitboolean“Default false.”
  • set_fixed_expense_rolescreates or changes datadescribed as changing data

    “For each bill, per plan: `net` (comes out of net pay before the split), `split` (is one share of the split, drawn on the bar) or `ignore` (this plan leaves it out).”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • rolesarrayrequired“One entry per bill and plan.”
    • commitboolean“Default false.”
  • set_planon 2 other serverscreates or changes datadescribed as changing data

    “What the Plan screen does to a plan — **a list of entries in one call**.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • plansarrayrequired“One entry per plan.”
    • commitboolean“Default false.”
  • edit_fixed_expensescreates or changes datadescribed as changing data

    “Change bills that exist — **a list in one call**.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • editsarrayrequired“One entry per bill.”
    • commitboolean“Default false.”
  • paychecksreads or searches

    “Every paycheck recorded in the document — gross, net, the employer’s own contributions, total compensation, the effective tax rate, what payroll put away, and whether each itemization reconciles to i…”

    Publisher declares: read-only yes · destructive no · open-world no

    3 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • limitnumber“How many paychecks to list, newest salary month first.”
    • include_linesboolean“Also print each listed paycheck’s itemization, line by line.”
  • record_paycheckscreates or changes datadescribed as changing data

    “Write paychecks into the document — **several in one call**, one entry per paycheck.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • paychecksarrayrequired“One entry per paycheck.”
    • commitboolean“Default false.”
  • set_deduction_typescreates or changes datadescribed as changing data

    “Everything the deduction types screen does, for **several types in one call**: **make** a type (its name, what the paycheck calls it, its kind), **rename** one, change its kind, **remove** one, put t…”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    4 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • typesarray“One entry per deduction type, up to 60 in a call.”
    • orderarray“Types by id or by name — the names they will have after this call, new ones included.”
    • commitboolean“Default false.”
  • fundsreads or searches

    “Every pension, study fund, provident fund and managers’ insurance the document tracks: the latest transcribed balance and how old it is, the management fee as stated and as measured against what was …”

    Publisher declares: read-only yes · destructive no · open-world no

    3 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • fund_idstring“Narrow to one fund and add its working — readings, returns, and the expected-versus-actual table behind the deposit verdict.”
    • include_archivedboolean“Include archived funds.”
  • record_fund_readingscreates or changes datadescribed as changing data

    “Transcribe what a pension, hishtalmut, provident or managers’-insurance report says into the document — **several readings in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • readingsarrayrequired“One entry per reading.”
    • commitboolean“Default false.”
  • create_goalscreates or changes datadescribed as changing data

    “Add goals — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • goalsarrayrequired“One entry per goal.”
    • commitboolean“Default false.”
  • record_depositscreates or changes datadescribed as changing data

    “Record money moving in a goal — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • depositsarrayrequired“One entry per movement.”
    • commitboolean“Default false.”
  • set_place_accountscreates or changes datadescribed as changing data

    “Say which account each place on Net worth is — the bank account, the broker, the savings account whose statements show its money — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • linksarrayrequired“One entry per place.”
    • commitboolean“Default false.”
  • record_holding_readingscreates or changes datadescribed as changing data

    “Write what a statement printed each holding was worth on a day — **a list in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • readingsarrayrequired“One entry per holding and day.”
    • commitboolean“Default false.”
  • set_goal_deposit_categoriescreates or changes datadescribed as changing data

    “Say what feeds each goal, **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • goalsarrayrequired“One entry per goal.”
    • commitboolean“Default false.”
  • set_cushioncreates or changes datadescribed as changing data

    “Set the cushion.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    5 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • monthsnumber“How many months of bills, above 0 and at most 24, to two places.”
    • bucketsarray“Plan buckets to count in the cushion, or to stop counting.”
    • accountsarray“Bank accounts whose balance counts toward what is in the bank, or stops counting.”
    • commitboolean“Default false.”
  • pause_goalscreates or changes datadescribed as changing data

    “Pause goals for a number of months, or start them again, **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • goalsarrayrequired“One entry per goal.”
    • commitboolean“Default false.”
  • settle_set_asidecreates or changes datadescribed as changing data

    “Answer, for a goal, whether money **set aside** (promised to it but still inside the bank) is still there.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • goalsarrayrequired“One entry per goal.”
    • commitboolean“Default false.”
  • suggest_goal_amountsdescribed as changing data

    “Suggest each goal's monthly amount: goals by nearest date (no kind of goal goes first), each taking what gets it there on its date until what Plan has for goals runs out (what they take now plus what…”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • commitboolean“Default false.”
  • set_goal_amountscreates or changes datadescribed as changing data

    “Set the monthly amount toward a goal, or the extra on a debt: the Plan bucket for it, in the default plan.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • amountsarrayrequired“One entry per goal or debt.”
    • commitboolean“Default false.”
  • set_opening_balancescreates or changes datadescribed as changing data

    “Say what each bank or cash account **held before its first statement**, and the day that stands for everything before — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • accountsarrayrequired“One entry per account.”
    • commitboolean“Default false.”
  • create_debtscreates or changes datadescribed as changing data

    “Add debts — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • debtsarrayrequired“One entry per debt.”
    • commitboolean“Default false.”
  • record_debt_paymentscreates or changes datadescribed as changing data

    “Record payments against a debt — **several in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • paymentsarrayrequired“One entry per payment.”
    • commitboolean“Default false.”
  • guide_statusreads or searches

    “In a document that keeps the ledger: the places worth setting up, in order — reading statements and paychecks, making the list of categories yours, giving each merchant a category, the bills, the pla…”

    Publisher declares: read-only yes · destructive no · open-world no

    1 input, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
  • update_accounton 12 other serverscreates or changes datadescribed as changing data

    “Give an account a real name and the last 4 digits of its card or number.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • account_idstringrequired“The account to change.”
    • namestring“A name the user will recognise, e.g.”
    • last4string“The last four digits, as digits.”
    • kindstring“One of CREDIT_CARD, BANK, CASH, HOLDINGS, if it was created as the wrong one.”
  • choose_categoriescreates or changes datadescribed as changing data

    “Put categories away, or bring them back.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • archive_idsarray“Categories to put away.”
    • restore_idsarray“Archived categories to bring back.”
    • keep_idsarray“Empty document only: every id to keep.”
  • create_categoryon 8 other serverscreates or changes datadescribed as changing data

    “Add categories the document does not have — **a list of them in one call**.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • categoriesarray“One entry per category.”
  • edit_categoriescreates or changes datadescribed as changing data

    “Change categories that exist — **a list of edits in one call**.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    3 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • editsarray“One entry per category.”
    • commitboolean“Default false.”
  • set_excluded_from_totalscreates or changes datadescribed as changing data

    “Leave transactions out of every total — **a list of ids in one call** — or count them again with `excluded: false`.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • transaction_idsarrayrequired“Up to 2000 transaction ids, from `transactions`.”
    • excludedboolean“Default true: leave them out.”
    • commitboolean“Default false.”
  • set_transaction_notescreates or changes datadescribed as changing data

    “Write the note on a transaction — **a list in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • notesarrayrequired“One entry per transaction.”
    • commitboolean“Default false.”
  • set_transaction_holdingscreates or changes datadescribed as changing data

    “Name the holding a transaction bought or sold, and how much of it — **a list in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • rowsarrayrequired“One entry per transaction.”
    • commitboolean“Default false.”
  • transfersreads or searches

    “Lists the transfers between two of the person’s own accounts that imports have found: a row leaving one account and the same amount arriving in another within a few days.”

    Publisher declares: read-only yes · destructive no · open-world no

    2 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • answerstring“Which to list.”
  • answer_transferscreates or changes datadescribed as changing data

    “Answers the pairs `transfers` lists — **a list in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • pairsarrayrequired“One entry per pair.”
    • commitboolean“Default false.”
  • count_card_chargescreates or changes datadescribed as changing data

    “The card payments in a bank statement for a card this document has no statement of — that month of card spending is otherwise missing.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 1 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • cardsarray“Last four digits per card, or `unknown`.”
    • commitboolean“Default false.”
  • set_no_pay_monthscreates or changes datadescribed as changing data

    “Says months had no pay — between jobs, unpaid leave — so no paycheck is missing for them: Home stops asking "No paycheck for …" and `paychecks` stops listing them as gaps.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • monthsarrayrequired“Salary months, as YYYY-MM.”
    • no_payboolean“Default true.”
    • commitboolean“Default false.”
  • set_card_payerscreates or changes datadescribed as changing data

    “Say that a bank merchant pays a credit card — **a list in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • paymentsarrayrequired“One entry per bank merchant.”
    • commitboolean“Default false.”
  • skip_merchantscreates or changes datadescribed as changing data

    “Set merchants aside in the By merchant queue — **a list in one call** — or put them back with `skip: false`.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • merchantsarrayrequired“Normalized merchant names, exactly as `uncategorized_merchants` printed them.”
    • skipboolean“Default true: set them aside.”
    • commitboolean“Default false.”
  • assign_categorycreates or changes datadescribed as changing data

    “Categorize the transactions with no category — **many merchants in one call**.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • assignmentsarrayrequired“One entry per category-and-scope.”
    • commitboolean“Default false.”
  • note_merchant_suggestionscreates or changes datadescribed as changing data

    “Remember what this conversation suggested for merchants that were **not** categorized — a category the user declined, or a name nobody could identify — so the next conversation does not ask about the…”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • suggestionsarrayrequired“One entry per merchant.”
  • “Create a standing rule that categorizes matching transactions into a category, now and on every future import.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    11 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • category_idstringrequired“The category the rule assigns.”
    • kindstring“One of EXACT_MERCHANT, CONTAINS, REGEX, PROVIDER_CATEGORY, AMOUNT_RANGE, ACCOUNT.”
    • patternstring“What the rule matches on.”
    • namestring“Optional.”
    • account_idstring“Restrict the rule to one account.”
    • amount_minnumber“Restrict by amount, as a magnitude in major units.”
    • amount_maxnumber“Restrict by amount, as a magnitude in major units.”
    • apply_to_existingboolean“Default true: also categorize the transactions it already matches.”
    • commitboolean“Default false.”
    • confirmationstring“The token the preview printed.”
  • statement_preview

    “Read a card or bank statement (.xlsx, .xls, .csv) and report what is in it: which sheet, where the header row is, what each column looks like and what the app guesses it is, the first rows verbatim, …”

    Publisher declares: read-only yes · destructive no · open-world no

    6 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • filestringrequired“Absolute path to the statement file.”
    • sheetstring“Which sheet, when the file has more than one.”
    • header_rownumber“Force the header row number, when the guess is wrong.”
    • columnsobject“Try columns without importing: column number → role.”
    • amount_conventionstring“One of SIGNED_SINGLE, POSITIVE_IS_CHARGE, SEPARATE_DEBIT_CREDIT.”
  • import_statement

    “Import a card or bank statement into an account, through the app’s own pipeline: the same parse, the same dedupe by natural key, the same rules applied on commit.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    11 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • filestringrequired“Absolute path to the statement file.”
    • account_idstring“The account to import into.”
    • new_accountobject“Instead of `account_id`, on a document that has no account for this file yet: the account the statement is for, made on commit — or found, when one of that kin…”
    • sheetstring“Which sheet, when the file has more than one.”
    • header_rownumber“Force the header row number, when the guess is wrong.”
    • columnsobject“Column number → role, from what the user confirmed in `statement_preview`.”
    • amount_conventionstring“One of SIGNED_SINGLE, POSITIVE_IS_CHARGE, SEPARATE_DEBIT_CREDIT.”
    • save_mapping_asstring“Keep these columns as a reader under this name, so the next statement of the same shape imports without asking.”
    • ignore_printed_totalboolean“Import even though the parse disagrees with the total the file prints.”
    • commitboolean“Default false.”
  • record_holdings_statement

    “Write what a broker’s (or any account with holdings’) statement printed — **the whole file in one call**: its movements onto the account, and its holdings table as dated readings.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    12 inputs, 3 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • filestringrequired“Absolute path to the statement file you read.”
    • account_idstring“The account with holdings.”
    • new_accountstring“Instead of `account_id`: the name of the account to make, e.g.”
    • placestring“The place on Net worth that names the account, when it names none yet — by id or name; made when new.”
    • as_ofstringrequired“The day the holdings table is for, YYYY-MM-DD.”
    • fromstring“The first day of the period the statement printed, when it printed one.”
    • currencystring“Defaults to the document’s currency.”
    • rowsarray“Every movement, in the order printed.”
    • holdingsarray“The holdings table, one entry per holding but the cash.”
    • cashnumber“The cash line of the holdings table, in major units.”
    • commitboolean“Default false.”
  • frame_copy

    “Not for a model: a view drawn in the conversation calls it with its own key to fetch its document, and any other call is refused.”

    Publisher declares: read-only yes · destructive no · open-world no

    3 inputs, 2 required
    • pathstringrequired“Absolute path to a .emd file on this machine.”
    • keystringrequired“The drawn view’s own key.”
    • sincestring“The stamp of the copy the view holds; no copy comes back while it still holds.”

Each quoted sentence is the first sentence of the publisher’s own description. The kind of tool and the “changes data” mark are our AI model’s reading of that description, not something we tested: two differently worded runs had to agree, otherwise no label is shown, and nobody has checked them by hand. A tool without the “changes data” mark is described as only reading, searching or calculating, or the two runs did not agree. No tool was called. Read the publisher’s full description before relying on it. “Publisher declares” lists the hints the server itself sends with the tool (MCP annotations: read-only, destructive, idempotent, open-world); they are the publisher's claims, not checked by us. Inputs are the parameters in the tool's own input schema: name, declared type, whether it is required, and the first sentence of its description. Read 2026-10-23.

How well are its tools described?

Features #4 and #5

How clearly this server's own tool descriptions say what a tool does, and how consistent its tool list is. The first part is an AI model's yes/no reading of each description; the second part is counted. We do not turn it into a grade.

Descriptions

AI reading of each description

Says what the tool does
100% of 80 tools
Says what it returns
42% of 77 tools
States limits, defaults or errors
31% of 54 tools
Says when to use it
100% of 51 tools
Items covered per tool
2.9 of 4 on average

Counted from the listing

Parameters with a description
100% of 357
Tools with a description
100% of 85
Typical description length
583 characters

The tool set

Counted from the listing

Tools
85
Size of the list
about 40,846 tokens for an agent to load (characters ÷ 4)
Naming
76 of 85 names use snake_case

AI reading: easy to mix up

No pair found.

The AI items cover 80 of 85 tools: for a tool where two differently worded runs disagreed, that item is left out. They were not checked by hand, and no tool was called. “Easy to mix up” means two tools whose names or descriptions overlap without saying how they differ; the AI found none, comparing tools within groups of 40. We do not rate whether the tool set is complete or whether side effects are spelled out, because our AI reading of those was not reliable enough.

How do I add it to my client?

Config from the registry entry

From the npm package emerald-mcp

Our sandbox started this package on 2026-10-23 (a read-only session: no tool was called).

Add to CursorAn install link in the format Cursor documents, holding the Cursor config below. The command runs the publisher’s code on your machine.

Claude Desktop · claude_desktop_config.json (Settings → Developer → Edit Config)
{
  "mcpServers": {
    "emerald": {
      "command": "npx",
      "args": [
        "-y",
        "emerald-mcp@0.1.6"
      ]
    }
  }
}
Cursor · .cursor/mcp.json in a project, or ~/.cursor/mcp.json
{
  "mcpServers": {
    "emerald": {
      "command": "npx",
      "args": [
        "-y",
        "emerald-mcp@0.1.6"
      ]
    }
  }
}
VS Code · .vscode/mcp.json
{
  "servers": {
    "emerald": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "emerald-mcp@0.1.6"
      ]
    }
  }
}
VS Code (command line) · Bash or zsh terminal (macOS, Linux)
code --add-mcp '{"name":"emerald","type":"stdio","command":"npx","args":["-y","emerald-mcp@0.1.6"]}'
Claude Code
claude mcp add --transport stdio emerald -- npx -y emerald-mcp@0.1.6
Try it in the MCP Inspector · runs on your machine, opens in your browser · Node 22.19+
npx @modelcontextprotocol/inspector@2.11.0 -- npx -y emerald-mcp@0.1.6
  • This runs the publisher's code on your machine (npx). Read its README first.
  • The MCP Inspector lists the server's tools, resources and prompts; a tool you call there runs for real.

Built from the server's registry entry with each client's documented format (checked 2026-10-14; the Cursor link and the VS Code command 2026-10-19; the MCP Inspector command 2026-10-21). Values in < > are yours to fill in; this page never contains a key. Where the server needs a setting the entry does not declare, it can still fail to start.

Can it be installed, and is it up to date?

Version pin · advisories

Listed version

Registry lists
0.1.6
Latest stable
0.1.6
Status
current
Withdrawn
no

Source: registry.npmjs.org · 2026-10-23. About the version the registry lists; a manual install may resolve to a different one.

Dependency advisories

critical0high0moderate0low0

Counted in the full dependency tree as resolved on 2026-10-23 (npm audit). Bars share one scale. The package itself has no known vulnerability (OSV.dev).

Integrity, provenance, license

Integrity
sha512-1A3kJyOAh6OWKE993…
Signature
signed
License
AGPL-3.0-only

Source: the package registry · 2026-10-23.

Usage

Downloads
800 in the last month

Source: api.npmjs.org · 2026-10-23.

Does the registry listing match what we found?

Feature #6

The registry verifies a package once, when it is published, and does not re-check it. A difference below is about the listing, not a judgement of the publisher.

Registry saysWe foundResultSource · date
Published package can be startedStarted and answeredmatchesour test · 2026-10-23
Version 0.1.6 on npmExists and can be installedmatchesnpm · 2026-10-23
Repository github.com/kfireliyahu/emerald-emdOpens publiclymatchesapi.github.com · 2026-10-23

Who made it?

Feature #7 · lineage

Facts about the publisher. We do not turn them into a trust score.

Namespace
io.github.kfireliyahu
GitHub owner
a personal account (kfireliyahu)
Build record
signed
Repository
github.com/kfireliyahu/emerald-emd
Stars
2
Repository age
0–30 days
Last push
0–30 days ago
Archived
no
Security policy
SECURITY.md

Source: the registry entry and api.github.com · 2026-10-23; security policy read from GitHub · 2026-10-23.

Publish this server? Run these checks against it yourself before release, from your own machine: a server the command starts, or your own server at its URL after a one-time proof that you control it: npx protocolprobe-selftest.

Choosing

Record checks

Public records · not a safety rating

8 of 9 record checks met

  • #3,357 of 15,112 packages by monthly downloads, tied with 5 others
  • Not ranked by stars: 2 stars (ranked from 10)
  • MetRegistry entry is active and says how to run itActive, with a package or a remote address.
  • MetSource repository link opensThe linked GitHub repository is public.
  • MetRepository is not archivedNot archived.
  • MetCode pushed to the repository in the 90 days before our checkLast push 0-30 days before our check.
  • MetRepository publishes a security policy (SECURITY.md)SECURITY.md found.
  • MetPackage names its licence with a standard (SPDX) identifierAGPL-3.0-only
  • MetThe version the registry lists can be installed and is not withdrawnThe listed version exists and is current.
  • Not metnpm package carries build provenance (attestation)Signed by npm, but no build attestation.
  • MetNo known critical or high advisory in the package or its dependenciesNone known in the package or its dependency tree.

Read from public records only: the registry entry, npm/PyPI, GitHub and advisory databases, checked 2026-10-23. No tool was called. Only “met” and “not met” are counted, so the total differs between servers; a check that does not apply or that we could not run is listed, never counted against it. It is not a safety rating. How each check works · Leaderboards

Common questions about io.github.kfireliyahu/emerald

Answered from the data above

Is io.github.kfireliyahu/emerald safe to install?

We do not rate servers as safe or unsafe. 8 of its 9 applicable record checks are met (facts from public records, each listed on this page). What the records show: Its source repository opens publicly. Its repository had a push in the last 90 days. The listed version is the latest stable release. The package itself has no known vulnerability (OSV.dev). Its full dependency tree has no known advisory. 55 of its tools describe changing data (our AI model's reading of the descriptions). These are facts with their sources on this page, not a safety guarantee, and we did not run its tools.

Has io.github.kfireliyahu/emerald been security tested?

Partly. 3 of the 12 checks that apply to it were exercised. We started the package in an isolated sandbox and read what it declares, but this test round was read-only, so its tools were not called. No security verdict is published before verification.

What can io.github.kfireliyahu/emerald do?

It lists 85 tools. In our AI model's reading of their descriptions (two runs had to agree, nobody checked it by hand), they include tools that read or search, create or change data, delete and run code or commands. We did not call any tool, so this describes the text, not the behaviour.

Can io.github.kfireliyahu/emerald change or delete data?

55 of its tools say in their description that they create, edit, delete, send or run something (our AI model's reading). We did not call any tool, so we cannot say what actually happens.

Does io.github.kfireliyahu/emerald publish a security policy?

Yes: its repository has a public security policy (github.com/kfireliyahu/emerald-emd/blob/HEAD/SECURITY.md). That is the publisher's statement, not permission for us to test the server, and we call none of its tools.

Is the listed version current?

Yes. The registry lists 0.1.6, the latest stable release on npm.

Where is the source code of io.github.kfireliyahu/emerald?

In github.com/kfireliyahu/emerald-emd, which opens publicly.

Found this page useful?

Anonymous · no sign-in

A quick, anonymous reaction — no account, no email. One per kind from your browser. The tally updates when the page is next refreshed, and it is only a rough count, never a safety rating or a measured number of people.

Similar servers

Same topic · AI-read

Active servers whose topic is also “data-and-databases” and that have at least one tool of the same kind; most kinds in common first, then most GitHub stars. The topic and the tool kinds are an AI model's reading of the publishers' descriptions, not checked by hand. Similar is not a recommendation.

Compare with another server

Side by side: registry entry, our read-only session, the tools and the 18 classification fields. Same values as each page; no score.

Security testing

What did we test, and what did we leave out?

18 checks · features #1, #2

Not probed (read-only run)

We started the package in an isolated sandbox and read what it declares, but this test round was read-only, so its tools were not called. No security score is given; a check we did not run is never counted as passed.

The 18 checks at a glanceour test · 2026-10-23
  1. Inventory: exercised
  2. Hidden instructions: exercised
  3. Real execution: not run · our policy
  4. Secret leak: not run · nothing to check it against
  5. Internal addresses: not run · our policy
  6. Unconfirmed changes: not run · our policy
  7. Bad input: not run · our policy
  8. Model requests: not run · nothing to check it against
  9. Sensitive questions: not run · nothing to check it against
  10. Folder boundary: not run · our policy
  11. Log leaks: not run · nothing to check it against
  12. Hidden content: exercised
  13. Fake assistant turns: not applicable
  14. Token passthrough: not applicable
  15. Token audience: not applicable
  16. Sign-in redirect: not applicable
  17. Consent handling: not applicable
  18. Sign-in metadata: not applicable

3 exercised9 not run (reason given)6 not applicable

Each check ends in exactly one state: exercised, not run (with the reason), or not applicable (with the reason). 3 of the 12 checks that apply to it were exercised. We do not publish security-check outcomes for named servers.

Exercised · 3
  • 1Inventory
    tool-list
    Reads the declared tools, resources and prompts.exercised
  • 2Hidden instructions
    description-poisoning
    Looks for hidden instructions in tool descriptions.exercised
  • 12Hidden content
    audience-hiding
    Checks resources that hide content from the user.exercised
Not run, with the reason · 9
  • 3Real execution
    real-execution
    Calls a tool and checks what really happens.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 4Secret leak
    canary-leak
    Plants a fake secret and checks whether it leaks.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 5Internal addresses
    ssrf
    Checks whether a tool can be steered to internal addresses.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 6Unconfirmed changes
    write-without-confirmation
    Checks whether tools that change data act without asking.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 7Bad input
    error-handling
    Sends bad input and watches how the server answers.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 8Model requests
    sampling
    Checks whether the server asks the client's model to act for it.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 9Sensitive questions
    elicitation-sensitive-data
    Checks whether the server asks users for sensitive data.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 10Folder boundary
    root-boundary
    Checks whether the server reaches outside the folders it was given.This check calls the package's tools. This test round was read-only, so no tool was called; tools can act on outside services with the publisher's or a user's account.not run · our policy
  • 11Log leaks
    logging-side-channel
    Checks whether log messages carry data they should not.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
Does not apply to this server · 6
  • 13Fake assistant turns
    fake-assistant-turn
    Checks prompts that pose as the assistant's own words.The server exposes no prompts.not applicable
  • 14Token passthrough
    token-passthrough
    Checks whether the server forwards a user's token to other services.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 15Token audience
    token-audience-validation
    Checks whether tokens meant for another service are accepted.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 16Sign-in redirect
    open-redirect
    Checks the sign-in redirect for abuse.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 17Consent handling
    confused-deputy
    Checks consent handling when one service acts for another.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable
  • 18Sign-in metadata
    oauth-url-scheme
    Checks the published sign-in metadata for unsafe URLs.The server runs locally over standard input/output, so there is no sign-in flow to check.not applicable

Source: our own test in an isolated sandbox, 2026-10-23, mcp-runtime-engine@0.1.0. Which checks count and why follows our published scoring model.

What happened during the test?

Feature #8

The steps in order, as the test record holds them.

  1. 0 msStarted the published package in an isolated sandbox (read-only mode)
  2. 1,817 msConnected after 0 redirects.
  3. Read the inventory: 85 tools, 1 resource, 0 prompts.
  4. 12,652 msFinished: 3 checks exercised.

Reference

How is it classified?

18 fields

One value per field, each with its source. Fields written by AI models are marked. A field with no value says why.

TopicAI-classified
AI-classified · 2026-10-23
Pricing modelAI-classified
not known (our limit)
The website shows almost no text without JavaScript, and we did not re-read it in a browser. This is our limit.
Programming language
api.github.com · 2026-10-23
Hosting type
registry · 2026-10-23
MCP capability
resources, tools
our test · 2026-10-23
Transport
standard input/output
registry · 2026-10-23
Required credentials
none declared
registry · no declaration is not a guarantee
Package registry
registry · 2026-10-23
Freshness
0–30 days
registry updatedAt · 2026-10-23
Lifecycle status
registry · 2026-10-23
License class
package registry · 2026-10-23
Integrity hash
declared (sri)
package registry · 2026-10-23
Signature / provenance
signed
package registry · 2026-10-23
Dependency advisories
none known
npm audit · 2026-10-23
Popularity
800 downloads a month
package registry · 2026-10-23
Publisher signals
owner: a personal account · repository age: 0–30 days · stars: 0–9 · build record: signed
api.github.com · 2026-10-23
Maintenance
api.github.com · 2026-10-23
Environment
your machine
where it runs, from the hosting type

“Not stated” means the source did not state it; “does not apply” means it does not apply to this kind of server; “our limit” means our own lookup failed. A linked value opens the directory filtered to the same value.

Cite or correct this page

Sources and corrections

Suggested citation

ProtocolProbe. “io.github.kfireliyahu/emerald: MCP server record.” Data checked 2026-10-23. https://protocolprobe.com/mcp/servers/io.github.kfireliyahu/emerald

Figures are valid for the date shown. Our facts on this page are CC BY 4.0: reuse them with a link and the check date. Quoted text (the publisher’s descriptions, website quotes, tool names) is not ours to license.

As JSON: this record in the API · API documentation.

Badge for your README

ProtocolProbe: 8 of 9 record checks met

[![ProtocolProbe](https://protocolprobe.com/api/v1/badge/io.github.kfireliyahu/emerald)](https://protocolprobe.com/mcp/servers/io.github.kfireliyahu/emerald)

It shows this server's record-check count: facts from public records, no tool called. It is not a security rating or a pass. It links here and updates after each data reload.

Something wrong, or is this yours?

If a fact here is wrong, tell us and we will re-check it. If you operate this server, you can run our checks on it yourself with the free self-test command; we call no server’s tools ourselves for anything shown here.

Write to hello@protocolprobe.com · corrections log · methodology