Creation and lifecycle tools
Tools that create new notes or move existing ones through their lifecycle.
Creation
| Tool | Inputs | Effect |
|---|---|---|
create_project | title, context, core_question?, slug?, vars? | Create a project (parked if at the active cap). (cdno project create) |
create_portfolio | question, project?, slug?, vars? | Create an evidence portfolio. question is free text or an existing question’s slug; given a slug, the portfolio takes that question’s text as its title, links both ways, and slug must be omitted or equal to it (portfolio_slug_mismatch otherwise). |
create_question | domain (research|life), text, slug?, vars? | Create a question note. |
create_stewardship | name, context, expanded?, slug?, vars? | Create a stewardship; expanded adds a tracking/ folder. |
create_custom_note | type_name, title, fields?, slug?, vars?, body?, origin? | Create a note of a config-defined custom type ([note_types.<name>]); built-in types have their own dedicated create tools, on this page and under Write tools. fields is a name → value map of the type’s declared frontmatter fields — every required one must be present, and each key must be declared. body excludes the title heading (the engine writes the H1) and fills the template’s {{body}} placeholder, or is inserted after the H1; origin is one string of wikilinks to where the note came from, always stored as a frontmatter string, and is refused unless the type declares an origin field. Creation is logged to today’s daily note as <type> created [[<folder>/<slug>]] — <title>; a promotion (creation with origin) needs no other log line. Pass slug to name the file; passing it beside a slug entry in fields is refused (slug_given_twice). Without slug, a second note with the same title is not refused but created as <slug>-2, so for a concept, search the library (search_notes with note_type: concept) and refine an existing note with revise_note instead. Call list_note_types first to discover a vault’s types and their fields. (cdno note create) |
link_portfolio_to_question | portfolio, question | Retrofit a portfolio→question link (backlinks both ways). |
link_portfolio_to_project | portfolio, project | Retrofit a portfolio→project link (sets project: and appends to the project’s Links). |
Lifecycle
| Tool | Inputs | Effect |
|---|---|---|
park_project | project | Move an active project to _parked/. |
complete_project | project | Close an active or parked project whose work is done: move it to _done/<year>/ with status: completed and closed:. Refused while any action or milestone is open. (cdno project complete) |
drop_project | project, reason?, open_items? (refuse|drop), expected_open_items? | Close an active or parked project that is not going to happen: status: dropped, closed:, moved to _done/<year>/. Refused with the open items by default; open_items: "drop" with the refusal’s hash drops them too. (cdno project drop) |
activate_project | project | Bring a parked or closed project back, clearing closed: (enforces the five-project cap). |
set_question_status | question, status (active|parked|answered|retired) | Transition a question’s status. |
add_periodic_commitment | stewardship, title, recurrence, next_date | Append a periodic commitment to a stewardship dashboard. |
The holder
| Tool | Inputs | Effect |
|---|---|---|
hand_off_project | project, holder?, take_back? | Record whose move an open (active or parked) project is. Exactly one of holder (the name the person gives, written as held_by: "<name>") or take_back: true (writes held_by: null); omitting both is an error, never a silent take-back. The map keeps its status and folder. Logs holder on [[<slug>]] with indented was: / now: lines, (mine) for no holder; naming the holder it already has changes nothing. (cdno project hand-off, take-back) |
An active project that names a holder does not count toward the cap (counts: false, and
slots.counted on list_projects leaves it out). Handing off is never
the way to make room at the cap: call it only on the person’s word that someone else is moving the
project. Rejections:
empty_field(remedy: take_back): an emptyholder, or one on the vault’s[projects] holder_sentinels(a name meaning the person or no one in particular). If they cannot name who has it, it is theirs.project_in_focus: an action on the project is in focus; the person pauses it first.project_cap_reached: taking back an active project would make it count with the counted projects already at the cap; itsdetailscarrycurrent,maxandactive_projects, which lists only the projects that count. Taking back a parked project only clears the name and never activates it.project_not_active: the project is completed or dropped.
The tool also appears with the other project writes under Write tools.
Naming a note
The eight create tools (create_project, create_question, create_portfolio, create_stewardship,
create_custom_note, add_action, promote_action, create_commitment) take an optional slug
naming the new note’s file; omitted, it is derived from the title. Propose one when the title
is long. It follows the slug rule: lowercase a-z, 0-9 and single -, at most 50 characters, not
something YAML reads as a number, boolean, null or date. An explicit slug is used exactly or refused,
never suffixed with -2. Refusals are coded rejections with nothing written: invalid_slug,
slug_taken, portfolio_slug_mismatch and slug_given_twice, listed with their details under
When a call is rejected. add_action ignores slug unless with_note
is true: an inline bullet has no file.
Notes
contextis one of the fixed life domains.recurrencefollows the recurrence syntax:daily,weekly,monthly,yearly, orevery N months.activate_projectenforces the cap — if activating would make more projects count than the cap (active and naming no holder), the call fails and the assistant must park one first.- Closing a project never needs a slot, and works on a parked project directly. While an action or
milestone is open, both closing tools return a
project_has_open_itemsrejection whosedetailslist theactions, themilestones(withdateandhard), theuntouched_commitments(linked standalone commitments, which no close ever touches) and anopen_items_hash.complete_projectstays refused until each item is completed or dropped: a completion is a claim that the work was done.drop_projectwithopen_items: "drop"andexpected_open_itemsset to that hash drops every listed item with the project, each logged withreason: project dropped (<reason>)(plainreason: project droppedwhen noreasonwas given); if the list has changed since, it is refused again with the new list and hash. The result namesdropped_actions,dropped_milestonesanduntouched_commitments. - A closed project can take the other outcome later (
complete_projecton a dropped one, and the reverse), re-filed under this year’s folder with a newclosed:date. The same outcome again is aproject_not_activerejection whosedetailscarrystatusandclosed. vars?is an optionalname -> valuemap supplying values for a custom template’s[variables.prompt]placeholders — the MCP analogue of the CLI’s repeatable--var name=value. Supply an entry for each prompted variable the note’s template uses that has no static[variables]default; otherwise creation fails with an “unresolved prompts” error (MCP has no interactive prompt to fall back on).- See also: Write tools, Context-gathering tools.