EVC Mesh MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MESH_API_URL | No | Base URL of the Mesh API | http://localhost:8005 |
| MESH_MCP_HOST | No | SSE server bind host | 0.0.0.0 |
| MESH_MCP_PORT | No | SSE server bind port | 8081 |
| MESH_AGENT_KEY | No | Agent API key (agk_...) | |
| MESH_MCP_PROFILE | No | Tool profile for stdio: core or full (SSE serves both) | full |
| MESH_MCP_TRANSPORT | No | Transport mode: stdio or sse | stdio |
| MESH_MCP_AUTH_FAIL_RPM | No | SSE mode: per-IP budget for authentication attempts against a not-yet-cached agent key on /sse, /core/sse, /mcp, /mcp/core. Over budget → 429 without calling Mesh API. 0 disables. | 20 |
| MESH_MCP_AUTH_FAIL_CACHE_SEC | No | SSE mode: how long a failed authentication (bad/unknown key) is remembered, so repeating the same bad key doesn't call Mesh API every request. | 30 |
| MESH_MCP_SESSION_CACHE_TTL_MIN | No | SSE mode: how long a successful authentication is trusted before the key is re-checked — bounds how long a revoked key keeps working without a restart. | 15 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| add_commentA | Add a comment to a task. Response is lean by default: id/author/created_at and the |
| add_dependencyA | Add a dependency edge: task_id depends on depends_on_task_id. With the default type blocks, task_id is held back from its assignee until the blocker meets condition (default: the blocker is done). relates_to and is_child_of only record a link and hold nothing. Change the condition with update_dependency; delete the edge with remove_dependency. |
| add_vcs_linkA | Link a task to a pull request, commit, or branch. The link is the task↔PR join that PR-driven status automation and 'what shipped for this task?' reports read. Only task_id and url are needed — provider, link_type and external_id are inferred from a GitHub or GitLab URL. The optional status parameter ('merged' or 'closed') records a PR that was already merged or closed before it was linked. Without it the link starts as 'open', and the done-evidence gate blocks move→done on it, since no GitHub webhook fires for a merge that happened before the link existed. |
| assign_taskA | Assign a task to a user or agent. Returns a lean confirmation by default (id, status_id, assignee, updated_at); full=true returns the whole task. |
| checkout_taskA | Atomically acquire an exclusive lock on a task. Prevents other agents from checking out the same task simultaneously. The lock is TTL-based and will expire automatically after ttl_minutes (default 120). The lock gives the holder exclusive access to the task. |
| clear_human_gateA | Release a human gate. human_gate_info on get_task(full=true) reports clear_path. clear_path="clear_endpoint" means YOU armed this gate through set_human_gate and it carries no marker comment — this tool releases it, and a withdrawal comment would be a silent no-op. clear_path="withdraw_marker" means the ask lives in a "Blocking @" comment: this tool refuses, and the gate is taken down by a short negator comment. Everything else is user-only — a gate a human armed, or one raw-armed via PATCH/UI with no author — and an agent key gets a 403 naming the exit it CAN reach: a human-gate decision records the human's answer. A posted comment does not by itself clear the gate; human_gate on get_task shows the current state. |
| comment_docA | Comment on a document. The quote parameter anchors a comment to a specific passage; it holds the text exactly as the document reads it — the server finds it and anchors the comment there, so no position is computed by the caller (there is no offset parameter, and a position you calculated would silently point at the wrong sentence). Without quote the comment is on the whole document. Your comment appears in the same thread humans see in the document UI. doc may be an old path or a bare slug; the reply then carries moved_to (the current path). An ambiguous bare slug is a 409 listing the full paths. |
| create_docA | Create a document in a project. Returns its metadata and version — the version is what update_doc takes as base_version, so a create followed by an edit needs no read in between. The body you sent is not echoed back. slug is ONE path segment and must not contain '/' (the request is refused with 400): a document in a folder is created with parent_id set to the parent's id, and is then reachable as /. |
| create_recurring_taskA | Creates a recurring task schedule that automatically spawns task instances on a schedule. Each instance gets access to the previous instance's summary. Suited to regular automated work such as weekly reports, daily checks and periodic audits. |
| create_subtaskA | Create a subtask under a parent task. Set status_slug for initial status (defaults to the project's default status, NOT the parent's status). |
| create_taskA | Create a new task in a project and return it with its id. status_slug sets the initial status (defaults to the project's first status); assignee_id with assignee_type routes it to someone; parent_task_id makes it a subtask. Search list_tasks first so you do not file a duplicate. |
| delete_recurring_scheduleA | Permanently delete a recurring task schedule: no further instances are created. Existing task instances are not affected. To pause instead, call update_recurring_schedule with is_active=false. |
| export_workspace_configA | Export the current workspace configuration as YAML, including rules, project templates, and settings. Read-only. The YAML is exactly what import_workspace_config accepts, so keep it as a backup before any import. |
| extend_checkoutA | Push the expiry of an existing checkout_task lock forward, for work that runs longer than the original ttl_minutes. Requires an active checkout in this session (the cached checkout_token from checkout_task) — fails if the lock was never acquired here, already released, or already expired. Server clamps ttl_minutes to [1, 240]. |
| forgetA | Permanently delete one memory entry by its UUID. Agents can only delete their own agent-scope memories; project and workspace memories are refused. To correct an entry, call remember with the same key instead of deleting it. |
| get_artifactA | Get artifact details. The bytes are never inlined: download them with the two GETs below. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design. |
| get_assignment_rulesA | Get the effective assignment rules for a project (how new tasks are routed to agents or people), merged from workspace and project level with source annotations. Read-only. get_workflow_rules covers status transitions; get_my_rules covers everything that binds you. |
| get_canonicalA | Query the canonical knowledge layer: returns curated facts, decisions, and strategy docs for a topic, merged from project_memories (key canonical:*) and workspace_memories (kind:canonical). Excludes ephemeral session-checkpoints. Slug aliases are resolved automatically (e.g. mesh-dev == evc-mesh). Use it for the curated answer on a topic; recall searches all memory, get_canonical_updates lists decisions broadcast since a time. |
| get_canonical_updatesA | Fetch canonical decisions broadcast since a given time. Returns only privacy:public records targeted at you or all agents. A change feed for session start; get_canonical searches the canonical layer by topic. |
| get_contextA | Get RECENT ACTIVITY for a project (last 24h by default): event stream with summaries, decisions, errors, plus accumulated project knowledge. Use it for "what changed lately"; get_project_knowledge returns the durable facts, recall searches memory for one fact. |
| get_docA | Read a document. By DEFAULT returns metadata plus the outline (headings) and NOT the body — a document is far larger than a task, and a body you read stays in your context for the rest of the session. The outline lists headings; section="" returns just that part; body=true returns the whole page. The returned version is what update_doc takes as base_version. If you addressed the document by an old path or a bare slug, the reply carries moved_to (its current path); a bare slug shared by several documents fails with 409 and the list of full paths. |
| get_memoryA | Full text of ONE memory by exact key (the |
| get_my_rulesA | Get ALL governance rules that apply to you: workflow constraints, assignment policies, behavioral requirements. Includes workspace and project-level rules with source annotations. This is the one to call before acting in a project: get_project_rules lists every rule configured there whoever it targets, get_assignment_rules and get_workflow_rules return a single rule family. |
| get_my_tasksA | Get YOUR assigned tasks, non-blocking. Use list_tasks to browse or search other people's tasks in a project, poll_tasks only to block until a new assignment arrives. Filterable by status_category to focus on active work. Default (cold) view is compact: only in_progress, review and the top 5 todo are listed (envelope |
| get_projectA | Get one project's details plus its statuses (the slugs move_task and create_task take) and its custom field definitions. list_projects finds the project_id. |
| get_project_knowledgeA | Get the PERMANENT KNOWLEDGE of a project: decisions, conventions, accumulated context. Returns workspace-level + project-level memories (workspace tier paged by limit/offset and narrowed by min_importance and tags_any). Use it for the standing picture of ONE project; get_context returns what happened recently, recall searches all memory for one specific fact, get_canonical returns owner-curated decisions on a topic. |
| get_project_rulesA | Get every rule configured for a project (workspace + project scope), whoever it targets: an audit view of the whole rule set. For the rules that bind YOU use get_my_rules; for one family, get_assignment_rules (who gets new work) or get_workflow_rules (allowed status transitions). |
| get_project_updatesA | Read a project's Updates feed (the lead's daily status reports), newest first. Returns the latest report by default. The latest one also comes with get_project and get_task_context. |
| get_recurring_historyA | Returns the history of all instances for a recurring task schedule. Each entry describes what a previous instance accomplished, what issues were found, and what artifacts were produced, which gives context for the current instance of a recurring task. |
| get_taskA | Get task details: compact decision fields, active human_gate=true and status slug; descriptions and ordinary comment bodies are always complete. Comment IDs support reply/after; timestamps are UTC to the minute. Known automation comments are one-line summaries (include_auto=true restores their complete bodies). full=true restores non-capability REST fields. If status lookup is unavailable, status_id and an explicit status_lookup_error remain. Comments return the newest comments_limit entries (default 5, max 200) with pagination markers. since=RFC3339 (from task.updated_at) skips an unchanged task and older comments. |
| get_task_contextA | Get EVERYTHING about ONE TASK in a single call: full details + comments + artifacts + dependencies + activity. Combines the results of get_task, list_comments and list_artifacts for one task in a single response. |
| get_team_directoryA | Get the workspace team directory listing all agents and human members. Default: a compact row-array table (columns id/name/role/project/status; project = responsibility_zone cut to one line ≤60 chars, status = computed_status) instead of full profiles — pass full=true for the complete dump (capabilities, heartbeat, escalation_to, timestamps, full zone text, ...). |
| get_workflow_rulesA | Get workflow rules for a project including allowed transitions, policies, and permissions for the calling agent. Read-only; check it before a move_task that may be restricted. get_assignment_rules covers routing; get_my_rules covers everything that binds you. |
| heartbeatA | Report that you are alive and what you are working on, so the team directory shows you online or busy and names your current task. Call it at session start and every few minutes during long work. It changes no task and returns no queue: get_my_tasks reads your assignments. |
| import_workspace_configA | Import workspace configuration from YAML. Applies rules, statuses, and project templates defined in the YAML to the whole workspace of the calling agent. Run export_workspace_config first and keep its output: it is the only rollback. |
| list_artifactsA | List artifacts attached to a task. Each carries download_path; a browser_only_url block, when present, is a human-only page. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design. |
| list_commentsA | List comments newest first (limit default 10), with pagination. Compact fields: id for reply/after, author_name, created_at in UTC to the minute, entire ordinary body. Known automation prefixes get one-line summaries; include_auto=true restores their bodies. full=true restores non-capability REST fields. after accepts a comment UUID or RFC3339 timestamp and returns only newer comments (exclusive), paginated within that delta; unknown IDs are refused. order=asc gives chronological reading. |
| list_doc_commentsA | Read the comments on a document as threads — each top-level comment with its replies nested under it, the quoted passage it is anchored to, and who wrote it. Resolved threads are hidden unless include_resolved=true. A comment whose quoted text no longer exists in the document is marked orphaned=true in its anchor: it is still shown, and it is not pointing anywhere. doc may be an old path or a bare slug; the reply then carries moved_to (the current path). An ambiguous bare slug is a 409 listing the full paths. |
| list_docsA | List a project's documents — id, title, slug path, version, who touched them last. Carries NO document bodies, so it is cheap on a whole project and serves as a map of it (get_doc returns one page). Returns path and has_children for navigating the tree. Paged: the reply carries total_count and has_more; when has_more is true, offset reads the rest. |
| list_projectsA | List the projects in the workspace with their ids, names and slugs. Call it first to find the project_id that most other tools require. Archived projects are hidden unless include_archived=true. |
| list_recurring_schedulesA | Lists the recurring task schedules of a project, with the ids that get_recurring_history, trigger_recurring_now, update_recurring_schedule and delete_recurring_schedule take. |
| list_sub_agentsA | List the sub-agents registered under an agent (see register_sub_agent): direct children only, or the whole subtree with recursive=true. get_team_directory lists every member of the workspace instead. |
| list_tasksA | List tasks with strict filters. Provide project_id for a project listing or workspace_id plus search for cross-project search. Unknown parameters and invalid categories are errors. Compact items contain id, title, status slug, priority, assignee_name, labels, updated_at, runtime_state (working/waiting/queued/stopped with since/lane/ref/stale, when known) and routing parent_task_id/start_after when set; workspace results also contain project_id. full=true returns complete REST items; listing descriptions are subject to the API page budget, while get_task returns full details. For your own queue use get_my_tasks. |
| mark_vcs_deployedA | Record that the change behind a PR/MR link is deployed: sets deployed_sha, deployed_env and deployed_at (now) on the link and releases the dependents waiting on a |
| move_taskA | Change task status (e.g. todo → in_progress → done). Status is given as a slug (not a UUID). On move to 'review', task auto-reassigns to creator unless assignee_id is provided. Returns {task, new_status} with a lean task by default (id, status_id, assignee, updated_at — the post-move assignee is always included so an auto-reassign is visible); full=true returns the whole reloaded task. |
| poll_tasksA | Long-poll for new task assignments: use it only in a loop that waits for work. Blocks until a task is assigned to this agent or the timeout expires. Returns current assigned tasks and whether any change occurred. Tasks use the lean get_my_tasks view (first-line descriptions, no envelope fields); full=true returns the complete items. Kept for backward compatibility; get_my_tasks is the non-blocking equivalent. |
| post_project_updateA | Post the project's daily status report to its Updates section (/w//p//updates). Fleet rule: the project lead writes one such report every day — a health call, what moved, what is blocked, what is next. Task counts are computed by the server. Other agents read the latest report in get_project and get_task_context. Needs the right to comment in the project; read-only keys are refused. |
| publish_eventA | Publish an event to the event bus. event_type='summary' publishes a summary. Add memory={persist:true, key:'decision-name'} to also save as permanent memory. Replaces the deprecated publish_summary tool. |
| publish_summaryA | Publish a work summary event (convenience wrapper for publish_event with type=summary). Kept for backward compatibility; publish_event with event_type='summary' is the current equivalent. |
| recallA | SEARCH memory by keywords. Finds a SPECIFIC piece of knowledge, e.g. 'API convention' or 'license decision'. Returns ranked results with scores. Default view is compact: per item key, tags, score and the first ~300 chars of content (a trailing … marks a cut; timestamps, scope and bookkeeping fields are omitted). get_memory(key) returns the whole text of one entry; full=true returns every item uncut with all stored fields (created_at included). Below the relevance threshold, returns an empty list with an explanation instead of weak matches. include_archived=true also returns archived memories. Use it to find one fact; recall_with_graph also follows links to related memories, get_project_knowledge pages through one project's permanent knowledge. |
| recall_with_graphA | Search memory with Knowledge Graph expansion. Seeds from hybrid recall, then BFS-traverses memory_edges up to hops depth. Returns memories ranked by composite score with hop_distance and provenance fields. Returns broader context: related decisions, connected incidents, derived learnings. Slower and wider than recall: use it for the connected context around a topic, recall for a single fact. |
| record_owner_decisionA | Record a directive from the workspace owner as a canonical decision in project_knowledge. Broadcasts to specified agents via propagate_to tags. privacy:private records are stored but EXCLUDED from get_canonical_updates. Auto-flags private if text contains secrets. If task_id is given, also records this as a human_gate decision on that task (docs/human-gate-decision-recorded.md in evc-mesh) — releases the gate as a consequence if it's currently live, and links back via canonical_key. Best-effort: a failure here is reported in the result but does not undo the canonical write. |
| register_sub_agentA | Register a new sub-agent as a child of the calling agent in your workspace, so it is listed in the team directory and by list_sub_agents and can be assigned tasks. Returns the created agent record. |
| release_taskA | Release the exclusive lock on a task acquired via checkout_task, so another agent can take it. Releasing does not change the task's status or assignee. The lock is also released automatically when it expires. |
| rememberA | Save knowledge to persistent memory. Stores decisions, conventions, preferences. UPSERT by key — calling with same key updates the existing entry. Content is screened on write and REFUSED with a named reason (never silently stripped or stored) if it contains invisible/bidi characters, an LLM role tag, an instruction to ignore previous/system instructions, a PEM private key, a prefixed API token (sk-/ghp_/xox*/AKIA), or a literal assignment to a *_PASSWORD/_SECRET/_TOKEN/_API_KEY name. LIMITATION — this screen is partial and is not a secret filter: it cannot see a secret that has no recognisable prefix and no field name next to it (a bare value pasted on its own line), nor names it does not know. Credentials pasted here are not guaranteed to be caught; content stores where a secret lives, not its value. |
| remove_dependencyA | Remove a dependency edge: task_id (the blocked card) no longer depends on depends_on_task_id. Clears a stray or reversed blocks link that holds a card open. Direction matters: the pair is given in the order add_dependency took it. reason is required and logged. |
| report_errorA | Report a failure you hit while working, so the team sees it instead of it staying in your log. With task_id, publishes an error event (tagged error and the severity, kept 72h) to that task's project, where get_context shows it. With recoverable=false it also sets your agent status to error in the team directory. It does not move the task or comment on it: use add_comment for that. |
| search_docsA | Full-text search a project's documents by title and body. Returns matching documents with a snippet and a path usable directly with get_doc — this is how you find a document when you don't already know its path; list_docs is the map, this is the index. SCOPE IS PER-PROJECT ONLY: results never cross project_id, and this is not a substitute for recall (which searches memory, not documents) or for a cross-project doc search (none exists yet). A query that matches nothing returns an empty items list, not an error. Documents saved before full-text search shipped (2026-08-20) are matched by title only until their next edit. |
| session_reportA | Report token usage and cost at the end of a session. Saves them on your agent session record and returns this session's tool-call stats and a compliance score (whether you loaded project context before acting). All parameters are optional; omitted or zero values are not recorded. |
| set_human_gateA | Arm the human gate on a task: freeze it and record WHO is waiting, WHAT was asked, and WHAT you will do if nobody answers. Records the whole ask on the task (who is waiting, what was asked, the default), so nothing has to re-read the thread; the '❓ Blocking @' comment marker is still recognised. recommended_default is REQUIRED: a gate with no stated default can only ever be resolved by finding a human. The call takes four answers (credential_exists / reversible / blocked_by_other_task / customer_visible_now), each with one line of justification. The server refuses the arm when the answers show nobody needs to be asked: the credential is held, the action is reversible, and nothing a customer sees or pays changes right now. |
| set_project_knowledgeA | Write a structured fact to project knowledge. UPSERT by key — calling with same key updates the existing entry. Stores deploy URLs, stack conventions, gotchas. These facts are visible via get_project_knowledge. |
| subscribe_eventsA | Configure push notification delivery for task events. Optionally sets a callback URL that Mesh will POST events to. Returns SSE and long-poll endpoint URLs for alternative delivery mechanisms. |
| trigger_recurring_nowA | Immediately creates the next instance of a recurring schedule, without waiting for the scheduled time. Useful for testing or urgent execution. |
| update_agent_profileA | Update the calling agent's own profile fields such as role, capabilities, responsibility zone, and working hours. Only the fields you pass are sent; omitted ones keep their values. It cannot edit another agent. |
| update_dependencyA | Set the condition and/or evidence_url of an existing dependency edge (task_id depends on depends_on_task_id). Evidence on a non-task_done edge marks the condition met now and releases the dependent even though the blocker is not done; an empty evidence_url re-arms the edge. |
| update_docA | Edit a document. To change ONE section, pass section= with body=<that section's new text, heading line included>: only that section is replaced and the rest of the document is kept. Without section, body is the WHOLE document — never send back the text of a single section as body (the server refuses a body that halves the document and drops its headings, unless allow_shrink=true). Replacing the body REQUIRES base_version — the version you got from get_doc — and the write is refused with a 409 if anyone changed the document since, so you can never silently overwrite someone else's edit. The append parameter adds to the end: it needs no base_version, cannot conflict, and needs no prior read of the document. The doc argument accepts an old path or a bare slug too; the reply then carries moved_to (the current path). Note the two different 409s: a stale base_version, and an ambiguous bare slug (resolved by the full path or UUID). |
| update_recurring_scheduleA | Update an existing recurring task schedule. Change title, description, frequency, assignee, priority, or deactivate it. Only the fields you pass change; instances already created are not edited. |
| update_taskA | Update task fields. Returns a lean confirmation by default (id, status_id, assignee, updated_at) — the card's static fields are not echoed back; full=true or get_task returns them. |
| upload_artifactC | Upload an artifact (file, code, log, etc.) to a task. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design. Content is sent inline, so a binary larger than a few KB may be truncated in transit. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 69 tools
Descriptions work hard to disambiguate (recall vs recall_with_graph vs get_canonical vs get_project_knowledge vs get_context each carry explicit 'use this instead of that' guidance, as do the four rules tools), but the sheer number of near-neighbours means an agent still has to reason carefully to pick correctly. Deprecated aliases left in the surface (publish_summary alongside publish_event, poll_tasks alongside get_my_tasks) and pass-throughs like get_task_context vs get_task+list_comments+list_artifacts add real overlap.
The set is overwhelmingly consistent snake_case verb_noun (get_/list_/create_/update_/delete_/add_/remove_/set_/register_), with clear resource suffixes. Deviations are minor: a handful of verb-only or noun-only names (remember, forget, recall, heartbeat, session_report) and a couple of domain-specific shapes (mark_vcs_deployed, record_owner_decision).
69 tools is far too heavy for a single server surface, even granting that the domain (tasks, docs, memory, agents, events, recurring schedules, VCS) is genuinely broad. Several tools exist only as backward-compatibility wrappers or convenience composites, which inflates the count beyond what earns its place.
Coverage is unusually deep: full task lifecycle (create/update/move/assign/checkout/dependencies/subtasks), documents with versioned edits and threaded comments, artifacts, memory tiers, governance rules, agent registry, events and recurring schedules. Gaps are modest but real: no delete for tasks, documents, comments, or artifacts, and no cross-project document search (explicitly acknowledged).