Skip to main content
Glama

sortwell

An inbox with judgment.

You paste something. It decides what kind of thing it is, which project it belongs to, whether it needs you, and whether you already have it. Then it files it. Your text is stored exactly as you wrote it.

The deciding is done by Jev, an evaluation model that answers typed questions with probabilities and writes no text at all. That is the point: it sorts your notes, it cannot rewrite them.

MIT decided by Jev

What it does

Four tools over MCP.

tool

what it does

capture

files one item: decides kind, project, urgency, and duplicate, in one request

shortlist

the few things that matter today, ranked, plus projects gone quiet

add_project

a project finishes, an area is ongoing

mark_done

takes an item off the list; nothing is deleted

Every item is labelled one of task, decision, project-update, reference, personal-follow-up or ignore, and given an action of now, scheduled, read-later or none.

Related MCP server: MCP Index Notes

A real run

A seven line standup transcript, captured one line at a time against three projects, live:

ok   ignore              inbox              thanks everyone for making the time
ok   decision            Warehouse rollout  nightly build moves to 06:15 UTC
ok   task                Hiring an analyst  send the job advert by Thursday
ok   project-update      Warehouse rollout  R2 connector done, previews last
ok   reference           Reading            that piece on evaluation models
ok   personal-follow-up  inbox              I still owe Priya an introduction
DUP  (0.96)              Hiring an analyst  can someone get the job ad over

Kind 6/6. The duplicate caught at 0.96. 424 ms per capture. The reworded repeat of the job advert line was filed as a duplicate rather than a second task, so it never reached the list.

Then the shortlist put I still owe Priya an introduction, I keep forgetting at the top, above both project items. The pleasantry and the duplicate were already gone.

One label of mine was wrong, not the model's: I expected the article link to sit in the inbox and it went to the Reading area, whose scope says "articles worth reading at some point". It was right.

What the eval found

evals/ holds a claude plugin eval suite, and its result is worth knowing before you build anything like this.

Given the tools and a skill telling it to use them, the agent called capture zero times in four runs. Handed a transcript and asked to file it, it wrote its own tidy summary instead. Not blocked, no error, just never reached for. The same thing happened with a sister project, so it is a pattern, not a fluke.

The lesson: an MCP server is not a behaviour change. Tools sitting there, even with a skill, do not reliably get used. The SessionStart hook works because it runs whether or not the model decides to look. Treat the tools as the thing that does the work and the hook as the thing that makes it happen.

Install

Needs Node 22 or newer and a TypeSafe API key. Not published to npm; clone it.

git clone https://github.com/Dharundp6/jev-sortwell && cd jev-sortwell
npm install && npm run build
export TYPESAFE_API_KEY=...

Try it without any client:

node dist/cli.js project project "Hiring an analyst" -- "recruiting one analyst: advert, screening, interviews, offer"
node dist/cli.js capture "Dharun to send the job advert to the recruiter by Thursday"
node dist/cli.js shortlist

As a Claude Code plugin, from the repo root:

claude plugin marketplace add Dharundp6/jev-sortwell
claude plugin install sortwell@sortwell

Or wire the server into any MCP client:

{
  "mcpServers": {
    "sortwell": {
      "command": "node",
      "args": ["/absolute/path/to/jev-sortwell/dist/cli.js"],
      "env": { "TYPESAFE_API_KEY": "..." }
    }
  }
}

How it decides

One request per capture, four questions answered in parallel: kind, project, action, duplicate. Jev is an evaluation model, so all four come back as probabilities and code does the rest.

Two thresholds, both exported constants rather than hidden numbers. Routing needs 0.45 or the item stays in the inbox, because a wrong home is worse than no home. A duplicate needs 0.70 and a specific item it duplicates, because both questions have to agree.

Ranking is the safe use of a probability. Being ranked third instead of second costs nothing, which is not true of being deleted.

Where things are kept

Two append-only JSONL files in ~/.sortwell, override with SORTWELL_DIR. Nothing is rewritten and nothing is deleted: marking an item done appends a new version and the old line stays. A damaged line is skipped and counted, never removed.

What it will never do

  • Never rewrite your text. Items are stored verbatim. Jev cannot generate text, so this is structural rather than a promise.

  • Never delete. mark_done and close append; the file only grows.

  • Never guess a home. Below the routing threshold it says inbox.

  • Never fail closed. No key, or a scorer that errors, and shortlist returns everything unranked with a line saying why.

License

MIT

Available Tools

4 tools
add_projectAdd a project or areaA

Add a project or an area so captured items have somewhere to go. A project finishes; an area is ongoing. The scope line is what routing is judged against, so write it as a plain description of what belongs here rather than a title.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesshort name, for example 'Warehouse rollout'
scopeYesone line describing what belongs here; routing is judged against this
shelfYesproject finishes, area is ongoing, resource is reference, archive is closed

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses a key behavioral trait: 'The scope line is what routing is judged against', and advises how to phrase the scope. It does not, however, mention side effects, reversibility, permissions, or any other behavioral aspects. The routing detail is valuable but the overall disclosure is incomplete for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that front-load the purpose and then deliver actionable guidance. Every sentence earns its place; there is no fluff or redundancy. It is appropriately sized and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 required parameters, full schema coverage, no output schema), the description covers the essential aspects: what the tool does, the distinction between project and area, and the critical routing behavior. It does not describe return values or error conditions, but these are less critical without an output schema. The description is nearly complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter having a description. The description adds meaningful semantics beyond the schema, notably the guidance on scope ('write it as a plain description of what belongs here rather than a title') and the clarification of project vs. area. This enhances the agent's understanding beyond the raw parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Add' and the resource 'project or an area', and explicitly distinguishes between the two ('A project finishes; an area is ongoing'). It explains the purpose ('so captured items have somewhere to go') and even clarifies how the scope parameter is used for routing. This fully clarifies the tool's function without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used after capturing items ('so captured items have somewhere to go') and provides guidance on choosing between project and area. However, it does not explicitly contrast this tool with its siblings (capture, shortlist, mark_done) or state when not to use it. The usage context is implied but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

captureCapture an itemA

Save something the user wants kept: a note, a link, an email, a line from a meeting, anything. Call it once per distinct item; paste a transcript one item at a time rather than all at once. It decides for itself what kind of thing the item is, which of the user's projects it belongs to, whether it needs attention, and whether they already have it, then files it. The text is stored exactly as given and never rewritten. You do not need to classify anything yourself, and you should not ask the user which project it belongs to.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe item, verbatim; it is stored exactly as given
sourceNowhere it came from: note, url, email, meeting, voice. Defaults to note

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that capture auto-classifies, auto-assigns projects, checks for existing duplicates, and files the item, and that text is stored verbatim and never rewritten. It stops short of explaining what happens on duplicate detection or where the item is filed, but these are not essential for invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is well organized: purpose, batching rule, autonomous behavior, and agent instructions in four sentences. It is efficient, though 'call it once per distinct item' and 'paste a transcript one item at a time' are slightly redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-string-parameter tool with no annotations or output schema, the description is unusually complete: it specifies what to send, how often, what the tool decides, and what the agent should not do. The only minor gap is the absence of any return-value or confirmation behavior, but that is not needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already documents text and source. The description adds a useful constraint not in the schema: the text parameter must carry one distinct item at a time, not a batch. The verbatim/stored-exactly point repeats the schema, but the batching rule is genuine added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Save something the user wants kept: a note, a link, an email...') and clarifies that capture is the catch-all intake tool. It also distinguishes itself from siblings by stating it decides project, attention, and duplicates itself, so an agent won't confuse it with add_project or mark_done.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage rules: call once per distinct item, paste a transcript one item at a time, and do not classify or ask which project. It does not explicitly name sibling tools as alternatives, but the 'decides for itself' statement effectively routes the agent away from add_project and mark_done.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_doneMark an item doneA

Mark an item finished so it leaves the shortlist. Nothing is deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe item id, as shown in the shortlist

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states 'Nothing is deleted,' which is a valuable behavioral disclosure beyond the schema. It clarifies that the operation is non-destructive, which is important for an agent deciding whether to call it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no waste. The core action and the key non-destructive behavior are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description is complete. It explains the effect and the non-destructive nature. It could mention what happens to the item after marking, but that is not essential for calling the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the 'id' parameter. The description adds no additional parameter semantics beyond what the schema provides, which is acceptable given full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Mark') and resource ('an item'), and clarifies the effect ('finished so it leaves the shortlist'). It distinguishes itself from siblings like capture and add_project by focusing on the shortlist lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when an item should be finished and removed from the shortlist. It does not explicitly state when not to use it or name alternatives, but the context is clear enough for a simple tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shortlistWhat matters todayA

The few things that matter today, ranked out of everything still open, with any projects that have gone quiet. Call it when the user asks what they should be doing, what is outstanding, or at the start of a working session. Takes no arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the nature of the output (a ranked list of open/quiet items) and the absence of arguments. It implies a read-only operation without stating it explicitly, but for a summary tool that's acceptable. It does not mention any side effects or prerequisites, which is appropriate given the simplicity. A 5 would involve explicit statement of no side effects or auth needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, with the first sentence defining the tool's functionality and the second providing usage guidance. The 'Takes no arguments' sentence is redundant but does not detract. Information is front-loaded: purpose first, usage second. No word is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description is complete. It explains what the tool returns (ranked list of open items and quiet projects), when to use it, and that it takes no arguments. The agent has everything needed to call it correctly. There are no missing pieces given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema shows an empty object. The baseline for zero parameters is 4, as the schema fully covers parameter semantics. The description redundantly states 'Takes no arguments,' which adds no new meaning beyond what the empty schema already conveys, but it doesn't hurt. Thus, the score matches the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states what the tool returns: 'The few things that matter today, ranked out of everything still open, with any projects that have gone quiet.' This is a specific, unambiguous output that clearly distinguishes it from siblings like capture, add_project, and mark_done, which perform different actions (capturing, adding, marking done).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage triggers: 'Call it when the user asks what they should be doing, what is outstanding, or at the start of a working session.' This clearly tells the agent when to use the tool. It doesn't explicitly exclude alternatives, but the siblings are semantically distinct (they are data-modifying actions), so the guidance is sufficient. A 5 would require explicit 'when not to use' or contrast with siblings, which is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedadd_project
    • First observedcapture
    • First observedmark_done
    • First observedshortlist

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct role: capture saves items, shortlist shows priorities, add_project creates routing targets, and mark_done changes item state. No two tools could plausibly be confused for the same operation.

Naming Consistency5/5

All tool names are lowercase imperative verbs, with compound names using underscores (add_project, mark_done). The naming pattern is uniform and predictable across the set.

Tool Count5/5

Four tools cover the full capture-to-completion loop without redundancy. The count is well-matched to the server's focused personal-information-management purpose.

Completeness4/5

The core workflow (capture, route, shortlist, mark done) is fully covered. A minor gap is the lack of a way to browse or search all captured items that fall off the shortlist, but this is workable for the stated use case.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    Provides an agent-first note-taking system designed from the ground up for AI collaboration. Organizes your notes as a local vault of ordinary markdown files with semantic note types.
    28
    7 npm
    10
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Enables indexing and retrieving notes with full-text search using SQLite, plus building knowledge graphs to find relationships between concepts. Supports natural language note management, tagging, and semantic connections.
    16
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Turns an LLM agent into a personal planner by providing atomic context (roles, goals, decision matrix) and routing classified items to Obsidian, with optional projection to Google Calendar and Tasks.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to read and write to a personal knowledge vault of markdown notes, projects, and tasks, with tooling for search, capture, daily logs, and project management across different AI tools.
    MIT