MCP Tool Reference¶
Meridian exposes 148 tools over MCP.
They fall into two usage patterns:
- Planner sessions (claude.ai, planning work) -
start_session·pin_decision·update_decision·add_note·get_context_block·generate_handoff - Executor sessions (Claude Code, Cursor, automated workers) -
start_session·log_task·request_hitl·get_session_brief·generate_handoff
Quick Reference - 5 tools you use 90% of the time¶
| Tool | One-liner | Example call |
|---|---|---|
start_session |
Register session, get full project context | start_session(project_name="my-project", session_name="feature-x", human_id="alice") |
log_task |
Record completed work to the shared task log | log_task(session_id="sid", project_id="abc-123", description="Wired OAuth redirect") |
checkpoint |
Snapshot progress: auto-capture + delta handoff + next /goal | checkpoint(session_id="sid", project_id="abc-123") |
pin_decision |
Add an architectural decision to the live constitution | pin_decision(project_id="abc-123", title="Use psycopg3", body="asyncpg has DLL issues on Windows", category="TECHNICAL") |
request_hitl |
Surface a blocking question to the human queue | request_hitl(project_id="abc-123", question="Should we rate-limit per IP or per token?", urgency="blocking") |
Tip: Use
checkpoint()instead ofgenerate_handoff()when ending a session — it also runsauto_captureand returns the next/goalstring.
Starting a session¶
start_session¶
Register a session and get the full project context (goal, sprint, recent tasks, decisions) in one call. Use this instead of register_session.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
session_name |
string | optional | Optional (599d0097): omit or leave blank to auto-generate a meaningful name from the first pending sprint item title + a timestamp, instead of inventing a string. |
human_id |
string | optional | |
client |
string | optional | |
role |
string | optional | Pass 'executor' to inject executor_config and credentials guidance. |
compact |
boolean | optional | Default true — slim orientation. Set false for the full goal/instructions payload. |
version |
string | optional | Optional sprint-version bucket (e.g. 'v0.1.x') to scope this session to. Sprint progress/items in the orientation and /goal filter to it. Omit to auto-infer the bucket with the most pending items. |
mode |
string | optional | Pass 'continue' to resume an already-active same-name session WITHOUT re-reading the full L0/L1/L2 orientation: returns just session_id + live pending items + the ready-to-paste /goal string. Auto-detected anyway within a 5-min heartbeat window; 'continue' widens that so a known-yours session resumes cleanly even after a longer gap. |
Example:
start_session(project_name="my-project", session_name="feature-x", human_id="alice", role="executor")
get_session_brief¶
Read-only: Call this FIRST for project summaries or to see what a session did — returns session, tasks, decisions, and recent commits in one call. Compact session orientation (<500 tokens): sprint focus, pending items, recent tasks, blocking failures, and open HITL requests. Ideal for worker/automation sessions that don't need the full context.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
role |
string | optional | Tailors the brief. 'worker'=sprint+tasks only; 'executor'=adds version-scoped pending items, this session's file claims, and decisions code-anchored to them (pass session_id); 'planner'=adds full decisions/notes/sessions, last-session summary, and decisions needing revisit. |
session_id |
string | optional | Caller session id — enables session-scratchpad notes, board-change detection, and (role='executor') file-claim + version scoping. |
Example:
Tasks¶
log_task¶
Log what this session did, is doing, or failed at. Call frequently — this is the primary signal in the timeline and handoffs.
Valid statuses: pending · in_progress · done · failed · backlog · future · backburner
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id |
string | required | |
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
description |
string | required | |
status |
string | optional | |
kind |
string | optional | Entry taxonomy. shipped=work done, found=discovery, decided=arch choice, blocked=blocker. |
Example:
log_task(session_id="session-uuid", project_id="abc-123", description="Fixed auth bug", status="done")
get_tasks¶
[SUPPORT] Read-only: Get recent tasks across all sessions.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
limit |
integer | optional |
Example:
search_tasks¶
[SUPPORT] Read-only: Search tasks by keyword or natural-language query. Uses trigram similarity on Postgres, LIKE on SQLite. Returns top matches with similarity score.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
query |
string | required | |
limit |
integer | optional |
Example:
Goal & sprint¶
get_goal¶
[SUPPORT] Read-only: Fine-grained — return just the goal fields (north_star, sprint, version_goal) in isolation. Use start_session or get_session_brief for full context including tasks and decisions. Use get_goal when you only need the raw goal fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
Example:
set_goal¶
[MAINTENANCE] Set or update the goal state.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
content |
string | required |
Example:
get_sprint_progress¶
Read-only: Sprint progress summary — counts by status, percent_complete, and the item list.
Poll this between tasks. After each complete_sprint_item, call get_sprint_progress(project_id, session_id) (pass session_id) before claiming the next item. The board_change field reports items a planner injected since this session started, so an executor picks them up at the item boundary without restarting — never idle-poll, only poll at task boundaries. The result is cached server-side for 10 seconds, so parallel sessions polling together share a single DB query.
Statuses include provisional_complete — work finished but not yet verified/deployed, a non-terminal state between in_progress and done that does not count toward percent_complete.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
session_id |
string | optional | Optional: include board_change (items added since this session started). |
version |
string | optional | Filter to a specific sprint version bucket. |
item_group |
string | optional | Filter to a specific item group. |
Example:
Executor config & file coordination¶
set_executor_config¶
Store project-level executor defaults so worker sessions start with repo path, env file, test command, deploy command, shell, branch, and the injected credentials rule.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
repo_path |
string | optional | |
repo_paths |
array | optional | Known locations [{cwd, hostname}] — merged into existing repo_paths, not overwritten. |
env_file |
string | optional | |
test_cmd |
string | optional | |
test_min |
integer | optional | |
deploy_cmd |
string | optional | |
shell_type |
string | optional | |
branch |
string | optional | |
filesystem_roots |
array | optional | Directories the tunnel's filesystem connector may serve (unioned across the tenant's projects). Overwrites the existing list. |
serena_repo_path |
string | optional | b970fe07 — default repo path for Serena (the tunnel's code-extractor slot). Auto-fetched at tunnel start; used only when --repo is not passed on the CLI. |
codebase_code_dirs |
array | optional | b970fe07 — directories codebase-memory-mcp (the tunnel's code-intel slot) auto-indexes. Deduped-union across the tenant's projects; used only when --code-dir is not passed on the CLI. Overwrites the existing list. |
context_threshold |
integer | optional | Turns before a context-budget warning is surfaced to the session. |
max_turns |
integer | optional | Turn ceiling injected into the /goal string ('Stop after N turns'). Default 200. |
Example:
set_executor_config(project_id="abc-123", repo_path="/repo", env_file="/repo/.env", test_cmd="pixi run test", test_min=619, deploy_cmd="git push", shell_type="powershell", branch="dev")
claim_file¶
Claim exclusive edit rights on a file path for this session. Locks auto-expire after 2 hours.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id |
string | required | |
file_path |
string | required | |
mode |
string | optional | Claim grain (ffa03655). 'write' (default) = EXCLUSIVE: blocks other writers and is blocked by any other session's read claim. 'read' = SHARED: many sessions can read-claim the same file at once (no false contention for parallel reader agents), blocked only by another session's write lock. |
symbol |
string | optional | Optional symbol to claim (class/function/method name, e.g. 'AuthRouter' or 'AuthRouter.login'). Requires content. |
content |
string | optional | Full source of the file, required when symbol is given so the server can resolve the symbol's line range. |
Example:
release_file¶
Release a file lock held by this session when you're done editing.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id |
string | required | |
file_path |
string | required |
Example:
idle_until_session_done¶
Read-only: Wait on another session before touching a shared file. The tool polls every 30 seconds until the watched session is done.
| Parameter | Type | Required | Description |
|---|---|---|---|
watching_session_id |
string | required | |
timeout_seconds |
number | optional | Max seconds to wait before returning done=false, timed_out=true (default 1800). A stuck/never-closing session can't hang the caller past this. |
Example:
Parallel coordination¶
store_finding¶
[MAINTENANCE] PARALLEL COORDINATION (c35370cc): persist a per-task intermediate result to the session_findings table so it survives session boundaries. Parallel reader agents write findings; an orchestrator or writer agent reads them via get_findings. Unlike save_finding (which creates a research note), this is a lightweight key→content store for agent-to-agent handoff of intermediate work.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id. |
content |
string | required | The finding body. |
key |
string | optional | Optional bucket/topic for scoped retrieval (e.g. a subsystem name). |
title |
string | optional | Optional short title. |
session_id |
string | optional | Optional writing session. |
task_id |
string | optional | Optional task this finding belongs to. |
get_findings¶
[MAINTENANCE] Read-only (c35370cc): read stored session_findings for a project (newest first), optionally scoped by key and/or session_id. The read side of store_finding.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id. |
key |
string | optional | Only findings in this bucket. |
session_id |
string | optional | Only findings from this session. |
limit |
integer | optional | Max rows (default 50). |
send_message¶
[MAINTENANCE] PARALLEL COORDINATION (d3a3a01d): enqueue an actor-model message to another session (session_messages table). 'Done with X, you do Y' between parallel agents. The recipient reads with receive_messages. A2A-compatible.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id. |
to_session_id |
string | required | Recipient session id. |
payload |
string | required | Message body (text or JSON). |
from_session_id |
string | optional | Sender session id (defaults to session_id). |
kind |
string | optional | Optional message kind/tag. |
receive_messages¶
[MAINTENANCE] PARALLEL COORDINATION (d3a3a01d): fetch unread messages addressed to a session (oldest first) and mark them read by default. The receive side of send_message.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id |
string | required | The recipient session. |
mark_read |
boolean | optional | Mark fetched messages read (default true). |
limit |
integer | optional | Max messages (default 50). |
idle_until_all_done¶
[MAINTENANCE] PARALLEL COORDINATION (d3a3a01d): non-blocking barrier check across sibling sessions. Returns {all_done, pending, statuses}; a session is done when closed/archived/missing. The server can't block, so poll until all_done is true — the A2A 'wait for X, Y, Z to finish' primitive.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_ids |
array | required | Sessions to wait on. |
Decisions¶
pin_decision¶
Record an authoritative decision that supersedes earlier statements. Pinned decisions appear in every session's context block.
Categories: STRATEGIC · COMPETITIVE · TECHNICAL · TACTICAL · BUSINESS · PRODUCT · ARCHITECTURAL
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
title |
string | required | |
body |
string | required | |
category |
string | optional | |
priority |
string | optional | urgent decisions sort first and are weighted higher in start_session / generate_handoff context. Default normal. |
assumption |
string | optional | Optional unverified assumption this decision rests on. Recorded with status 'unvalidated' and surfaced in get_planning_brief until validate_assumption confirms or invalidates it. |
Example:
pin_decision(project_id="abc-123", title="Use psycopg3", body="asyncpg has DLL issues on Windows", category="TECHNICAL")
update_decision¶
Patch a pinned decision. Pass new_title + new_body to atomically supersede (creates a new row, marks old as superseded). Otherwise patches in place.
| Parameter | Type | Required | Description |
|---|---|---|---|
decision_id |
string | required | |
new_title |
string | optional | |
new_body |
string | optional | |
title |
string | optional | |
body |
string | optional | |
category |
string | optional | |
priority |
string | optional | Change ordering/weight (urgent | normal | low). |
status |
string | optional | |
assumption |
string | optional | Set/replace the decision's underlying assumption text. |
assumption_status |
string | optional | Stamp the assumption's validation state. Usually set via the validate_assumption tool, which also fires HITL on invalidation. |
get_pinned_decisions¶
[SUPPORT] Read-only: List pinned decisions, highest priority first (urgent → normal → low, then newest-first). Active only by default. Each row includes its priority and a parsed edit_log array of prior bodies ({body, ts}) recorded on every in-place body edit.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
include_superseded |
boolean | optional |
Example:
Human-in-the-loop (HITL)¶
request_hitl¶
Surface a question to the human queue. Response includes chat_prompt (question + options formatted for inline display) and, when urgency='blocking', a poll_instruction. Dual-channel: filed in the dashboard AND shown in Claude Code chat — first answer wins. For blocking: display chat_prompt to the user, then poll get_hitl_request(request_id) every 30 s. If the user answers in chat, call answer_hitl(request_id, answer). normal/high land in the dashboard without blocking the session.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
question |
string | required | |
session_id |
string | optional | |
context |
string | optional | |
urgency |
string | optional | |
kind |
string | optional | question (default, auto-answerable) or correction (non-blocking mid-run human correction). |
assigned_to |
string | optional | |
options |
array | optional | Answer choices rendered as selectable buttons in the dashboard. |
recommended |
string | optional | The safe-default option — an option string or a 0-based index into options. Highlighted in the dashboard; Enter submits it; auto-answer prefers it. |
require_human |
boolean | optional | When true, the HITL can never be auto-answered — only an explicit human response unblocks it. Reserve for irreversible/destructive actions. |
Example:
get_hitl_request¶
Read-only: Poll a HITL request for the human's answer. Returns the row including status (pending/answered/dismissed) and answer text.
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | required |
Example:
answer_hitl¶
Answer a pending HITL request programmatically. Marks it answered so the waiting session can resume. Use when the human answers in Claude Code chat rather than the dashboard.
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | required | |
answer |
string | required | |
answered_by |
string | optional | Optional human_id of the answerer. |
dismiss_hitl¶
Dismiss a HITL request (won't-answer / no longer relevant).
| Parameter | Type | Required | Description |
|---|---|---|---|
request_id |
string | required |
Handoff & context¶
generate_handoff¶
Read-only: Generate a context handoff document. mode='full' writes the complete L0/L1/L2 handoff. mode='delta' returns a compact session summary with completed items, pending items, and the next /goal string.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
mode |
string | optional | |
session_id |
string | optional | Optional session id for auto-delta on repeated calls in the same session. |
force_include_ids |
array | optional | (45f519a0) Optional list of sprint-item ids to force-include in the pending list even when their deferred_until is in the future. This is a one-off visibility override for this handoff call only — deferred_until is NOT cleared, so claim_sprint_item's own deferral gate is unaffected. Use when a human wants a backburnered item back in scope for one planning run without permanently re-enabling claiming. |
skip_ai_summary |
boolean | optional | 65c8b426 — skip the optional AI (Haiku) narrative calls (session summaries, ai_summary blurb, sprint retrospective). Default true on the MCP path for fast, reliable handoffs. Pass false to include AI-generated narrative sugar when you have budget and time. |
Example:
get_context_block¶
Read-only: Return a compact project context block (north star, sprint, pending sprint items, recent tasks, recent decisions, active sessions) wrapped in a mode='full' to paste into a fresh Claude Code session; mode='chat' for a shorter paste into claude.ai. The HTTP route /projects/{id}/context-block returns the same content as unwrapped plain text.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
mode |
string | optional |
Example:
Planning tools¶
fan_out_sprint_items¶
Bulk-insert sprint items in one call — lets an orchestrator LLM decompose a goal into parallel work items without N sequential add_sprint_item calls. Pass a list of {title, description?, group?, version?} dicts; returns the list of new item IDs.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
items |
array | required | List of sprint item specs. Each must have at least a 'title'. |
Example:
fan_out_sprint_items(project_id="abc-123", items=[{"title": "Design DB schema", "group": "backend"}, {"title": "Build API endpoints", "group": "backend"}, {"title": "Wire up frontend", "group": "frontend"}])
get_planning_brief¶
Read-only: Return a compact planning context (sprint, north star, pending items, in-progress items, recent tasks, active sessions, recent decisions, pending HITLs). No session registration needed — designed for planning chat sessions that need to see project state without side effects.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
since |
string | optional | Optional ISO timestamp (a prior brief's generated_at). When given, new_handoff_available flags only handoffs filed after it. |
expand |
boolean | optional | Default false: collapse parent_id/item_group clusters in pending_items/in_progress into one summary row each. Pass true for the full ungrouped list. |
Example:
analyze_sprint¶
[MAINTENANCE] PLANNING: Read-only synthesis of the current sprint into one structured brief — parallelizability (conflict-free groups + max fan-out), dependency chains (depends_on walked to the root), resource/file conflicts (items sharing touches_resources), and stalls (stall_count>0). Returns {summary, recommended_strategy, parallelism, dependency_chains, longest_chain, file_conflicts, stalls, blocked, running}. Call in planning sessions instead of stitching together get_parallelizable_groups + manual dependency/conflict analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
version |
string | optional | Optional: only analyze items in this sprint-version bucket. |
reconcile_sprint_drift¶
Read-only: Cross-reference pending sprint items against recent git commits and return items that may already be done. confidence='high' means 3+ keywords overlap (safe to mark done via complete_sprint_item); confidence='medium' means 1–2 (verify first). Call during planning sessions to identify board drift.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
Example:
Rate limits¶
The hosted MCP surface (Bearer-token requests) is metered per tenant per minute by plan:
| Plan | Requests / minute |
|---|---|
free |
500 |
standard |
2000 |
pro |
unlimited |
Over-limit requests receive 429 Too Many Requests with a Retry-After header. Dashboard (cookie) traffic, /health, and /static are never metered, and self-hosted instances are unmetered. Polling get_sprint_progress between tasks stays well within these limits — the 10 s server-side cache keeps parallel polling cheap.
Workspace proposals¶
add_workspace_proposal¶
Capture a workspace-level flash of insight into the 'drawer of inspiration' — cross-project ideas that don't belong to any one project yet. NOT executor-claimable. status: raw → investigating → promoted|rejected. Use advance_proposal_status to move through the lifecycle; promote_proposal to convert one into a real sprint item.
| Parameter | Type | Required | Description |
|---|---|---|---|
title |
string | required | Short idea title. |
body |
string | required | Full description of the insight or idea. |
tags |
string | optional | Optional comma-separated tags. |
Example:
add_workspace_proposal(title="IDEA: expose auth as plugin", body="Could ship auth as a separate optional plugin so self-hosters can swap it out", tags="arch")
get_workspace_proposals¶
Read-only: List workspace proposals (human-authored flashes of insight), newest first. When status is omitted, defaults to 'live' proposals only (raw + investigating) — terminal proposals (promoted/rejected) are excluded. Pass status='all' for every status, or an explicit status (including promoted/rejected) to filter to just that one. Optional tag substring filter.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | optional | Filter to proposals in this status. Defaults to raw+investigating ('live') when omitted; use 'all' for every status. |
tag |
string | optional | Substring filter on tags. |
limit |
integer | optional | Maximum proposals to return (default 20, clamped to 1..100). |
offset |
integer | optional | Zero-based pagination offset (default 0). |
Example:
advance_proposal_status¶
Transition a workspace proposal through its lifecycle (raw → investigating|rejected; investigating → promoted|rejected|raw; rejected → raw). 'promoted' is a terminal status reachable only via promote_proposal.
| Parameter | Type | Required | Description |
|---|---|---|---|
proposal_id |
string | required | |
status |
string | required | Target status. 'promoted' is not allowed here — use promote_proposal instead. |
Example:
promote_proposal¶
Promote a workspace proposal into a real sprint item, creating the link between them. The proposal must be in 'raw' or 'investigating' state. Returns {proposal, sprint_item_id, sprint_item_title, project_id}.
| Parameter | Type | Required | Description |
|---|---|---|---|
proposal_id |
string | required | |
project_id |
string | optional | Project to create the sprint item under. |
project_name |
string | optional | Project name — alternative to project_id; resolved to the id internally. |
sprint_item_title |
string | optional | Override title for the sprint item; defaults to the proposal title. |
sprint_item_version |
string | optional | Sprint version for the new item; defaults to 'current'. |
Example:
promote_proposal(proposal_id="prop-uuid", project_id="proj-uuid", sprint_item_title="Expose auth as plugin")
Notes¶
add_note¶
Add a per-project wiki note. Use for setup instructions, gotchas, environment details, how-tos.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
title |
string | required | |
body |
string | required | |
tags |
string | optional | |
kind |
string | optional | |
priority |
string | optional | high-priority notes surface first in generate_handoff and planner context. |
file_path |
string | optional | Code anchor (kind='code'): repo-relative or absolute path this note warns about. Surfaced at claim_file/get_file_claims for the same path. |
symbol |
string | optional | Optional symbol (class/function/method) to scope the code anchor to. File-level anchors (no symbol) surface for any symbol in the file. |
source |
string | optional | Provenance: a URL or file path this note was ingested from. Stored on the note (used by kind='document'). |
category |
string | optional |
Example:
add_note(project_id="abc-123", title="Deploy note", body="Reminder: update env vars before deploy", tags="ops,deploy")
get_notes¶
Read-only: List project notes (newest first), LIGHTWEIGHT by default — id/slug/title/tags/kind/priority/timestamps with NO body, so the list can't overflow context. Pull model: scan the list, then read_note(project_id, slug) for one note's full body. Filter by tag substring or query full-text search. Pass bodies=true only when you truly need every body inline. Pass limit (default 100, max 500) and/or cursor for a {notes, has_more, next_cursor} page, then re-call with cursor=next_cursor.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
tag |
string | optional | |
query |
string | optional | Text search across note title and body (case-insensitive). |
bodies |
boolean | optional | Default false. true returns full note bodies inline (legacy behavior) — usually unnecessary; prefer read_note(slug). |
limit |
integer | optional | Page size (default 100, clamped 1..500). Passing limit or cursor switches the result to the {notes, has_more, next_cursor} pagination envelope. |
cursor |
integer | optional | Offset cursor from a prior page's next_cursor. Passing it switches the result to the {notes, has_more, next_cursor} envelope. |
sort |
string | optional | 98890df1 — 'relevance' ranks notes by reference_count/recency/decision-link (heavily cross-referenced notes surface, stale ones sink) and returns a bare list with a per-note 'relevance' score; default 'recency'. |
Example:
read_note¶
Read-only: Fetch one project note's full body by its per-project slug (the slug field from get_notes). The pull half of the list→read model.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
slug |
string | required | The note's slug (kebab-cased, unique per project) as returned by get_notes. |
Example:
delete_note¶
[MAINTENANCE] Hard-delete a project note by id.
| Parameter | Type | Required | Description |
|---|---|---|---|
note_id |
string | required |
Projects¶
create_project¶
[MAINTENANCE] Create a new Meridian project.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | required | |
execution_mode |
string | optional | Executor posture for sessions on this project. 'autonomous' (default) claims and runs sprint items immediately without asking; 'interactive' asks for direction first. Editable later in dashboard Settings. |
parent_project_id |
string | optional | Optional parent project id — makes this a subproject that inherits the parent's north_star when it has none of its own. Subprojects are one level deep: the parent must exist and must not itself be a subproject. |
Example:
merge_project¶
[MAINTENANCE] d6bd60e0 — merge a phantom-duplicate project INTO another. Re-parents EVERY child row of the source project (sprint items, tasks, decisions, insights, notes, HITL requests, sessions, handoffs, pointers, …) to the target project via pure UPDATEs — NO row is ever deleted. By default the now-empty source project is soft-archived (status='archived', name prefixed with '[merged] '), never hard-deleted; pass archive_source=false to leave it untouched. Returns {source_project_id, target_project_id, moved: {table: count}, source_archived}. Returns {error} if source==target or either project does not exist.
| Parameter | Type | Required | Description |
|---|---|---|---|
source_project_id |
string | required | The id of the project to merge FROM (its rows are re-parented; it is archived unless archive_source=false). |
target_project_id |
string | required | The id of the project to merge INTO (receives all of the source's rows). |
archive_source |
boolean | optional | Default true — soft-archive the emptied source project (status='archived', name prefixed '[merged] '). Set false to leave the source project row untouched. The source is NEVER hard-deleted either way. |
Example:
Legacy¶
register_session¶
Deprecated
Use start_session instead — it registers the session and returns goal + context in one call.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_id |
string | optional | |
project_name |
string | optional | Project name — an alternative to project_id; resolved to the id internally. project_id wins if both are given. |
session_name |
string | required | |
human_id |
string | optional | |
client |
string | optional |
Example: