EVC Mesh MCP Server

MCP serverEverything else

Tasks, comments, shared memory and handoffs for teams of people and AI agents, over MCP.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use EVC Mesh MCP Server

Install EVC Mesh MCP Server

The server’s own address, for the clients that take one directly. Or connect ahel onceand every client you use reads it from one address, with the account kept on ahel rather than in each client’s config.

  • Claude Code

    claude mcp add --transport http evc-mesh-mcp-server 'https://mesh.entire.host/mcp'

    Run it once in your project, then open /mcp to approve any sign-in the server asks for.

  • Claude Desktop

    https://mesh.entire.host/mcp

    Add a custom connector in Settings, paste this address, and approve the sign-in.

  • Cursor

    cursor://anysphere.cursor-deeplink/mcp/install?name=evc-mesh-mcp-server&config=eyJ1cmwiOiJodHRwczovL21lc2guZW50aXJlLmhvc3QvbWNwIn0=

    Open the link and Cursor adds the server at that address.

  • ChatGPT

    https://mesh.entire.host/mcp

    In Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.

  • Codex

    codex mcp add evc-mesh-mcp-server --url 'https://mesh.entire.host/mcp'

    Run it once, then sign in with codex mcp login evc-mesh-mcp-server if the server asks for an account.

From the project's README

As published by entire-vc/evc-mesh-mcp in README.md.

Model Context Protocol (MCP) server for EVC Mesh — a task management platform for coordinating humans and AI agents.

Connects AI agents (Claude Code, Cursor, Cline, OpenClaw, etc.) to EVC Mesh via MCP tools for task management, persistent memory, event publishing, and multi-agent coordination.

This is the actively developed copy. evc-mesh also ships an MCP server (./cmd/mcp, same internal/mcp tool set) that it builds and deploys itself — the two exist because Go's internal/ visibility rules mean one repo can't import the other's package, not because they're meant to diverge. New tools and fixes land here first.

Prerequisites

  • Go 1.22+
  • Running EVC Mesh instance
  • Agent registered in Mesh with an API key (agk_...)

Installation

go install github.com/entire-vc/evc-mesh-mcp@latest

Or build from source:

git clone https://github.com/entire-vc/evc-mesh-mcp.git
cd evc-mesh-mcp
go build -o evc-mesh-mcp .

Docker

docker run -i --rm \
  -e MESH_API_URL \
  -e MESH_AGENT_KEY \
  ghcr.io/entire-vc/evc-mesh-mcp

-i is required — the server speaks MCP over stdio, and Docker only wires up stdin when the container runs interactively. Add -e MESH_MCP_PROFILE=core to switch profiles (see Tool Profiles below). The image is published for linux/amd64 and linux/arm64 from Dockerfile in this repo on every tagged release (docs/RELEASING.md).

Tool Profiles

The MCP server supports two profiles to optimize context window usage:

ProfileToolsContext overheadBest for
core25~8K tokens (4% of 200K)Claude Code, Cursor, small-context models
full63~18K tokens (9% of 200K)Power users, automation agents, admin ops

Set via MESH_MCP_PROFILE environment variable. Default: full.

Configuration

VariableRequiredDefaultDescription
MESH_API_URLYeshttp://localhost:8005Base URL of the Mesh API
MESH_AGENT_KEYYes (stdio)Agent API key (agk_...)
MESH_MCP_PROFILENofullTool profile for stdio: core or full (SSE serves both)
MESH_MCP_TRANSPORTNostdioTransport mode: stdio or sse
MESH_MCP_HOSTNo0.0.0.0SSE server bind host
MESH_MCP_PORTNo8081SSE server bind port

Running without credentials

In stdio mode the server also starts when MESH_AGENT_KEY is not set. It then answers initialize and tools/list as usual, and every tool call returns instructions for setting MESH_API_URL and MESH_AGENT_KEY. This lets MCP clients and catalogs inspect the tool list before you have a key. A key that is set but rejected by the API still stops the server with an error.

Tool annotations

Every tool declares the MCP hints readOnlyHint, destructiveHint, idempotentHint and openWorldHint, so clients can tell read-only tools (get_*, list_*, recall, search_docs, …) from ones that change or remove data (update_*, move_task, forget, …).

Client metrics

Each initialize is logged with the client's clientInfo.name and version, and counted in the Prometheus metric mesh_mcp_initialize_total{client,profile} (exposed on /metrics in SSE mode; client names are normalised and capped).

Claude Code (stdio mode)

Add to your project's .mcp.json:

{
  "mcpServers": {
    "evc-mesh": {
      "command": "evc-mesh-mcp",
      "env": {
        "MESH_API_URL": "https://your-mesh-instance.example.com",
        "MESH_AGENT_KEY": "agk_your-workspace_your-key",
        "MESH_MCP_PROFILE": "core"
      }
    }
  }
}

Cursor

Add to Cursor MCP settings (Settings → MCP Servers):

{
  "evc-mesh": {
    "command": "evc-mesh-mcp",
    "env": {
      "MESH_API_URL": "https://your-mesh-instance.example.com",
      "MESH_AGENT_KEY": "agk_your-workspace_your-key",
      "MESH_MCP_PROFILE": "core"
    }
  }
}

SSE Mode (multi-agent, shared server)

For connecting multiple agents through a shared MCP endpoint:

MESH_API_URL=https://your-mesh-instance.example.com \
MESH_MCP_PORT=8081 \
evc-mesh-mcp --transport sse

SSE mode serves two profiles simultaneously on different paths:

PathProfileDescription
/sse + /messagefullAll 63 tools (backward compatible)
/core/sse + /core/messagecore25 essential tools

The same process also serves the Streamable HTTP transport (stateless, one agent key per request, sent in the Authorization: Bearer or X-Agent-Key header — the query parameter is refused there):

PathProfile
/mcpfull
/corecore

Authentication per connection via:

  • Authorization: Bearer agk_... header
  • X-Agent-Key: agk_... header
  • ?agent_key=agk_... query parameter

Agent Context Protocol (ACP)

At session start, follow these 5 steps in order:

1. heartbeat(status="online")              → register as alive
2. get_project_knowledge(project_id)       → load accumulated decisions & conventions
3. get_my_rules(project_id)                → understand constraints
4. get_context(project_id)                 → see recent activity + project knowledge
5. get_my_tasks()                          → check assigned work

At session end:

publish_event(type="summary", memory={persist: true})  → broadcast + persist
session_report(model, tokens_in, tokens_out)           → report metrics

MCP Tools — Core Profile (25)

ACP & Identity

ToolDescription
heartbeatSend heartbeat. Call at session start with status=online. Response includes mesh_version (the running binary's build git-SHA, or "dev" for an unpinned local build) — cheap way to check whether a fix has actually reached the installed binary without shelling out to the host.
get_project_knowledgeGet ALL permanent knowledge (decisions, conventions). ACP Step 2
get_my_rulesGet ALL governance rules (workflow + assignment). ACP Step 3
get_contextGet recent activity + project knowledge. ACP Step 4
get_my_tasksGet assigned tasks. ACP Step 5

Task Management

ToolDescription
list_projectsList workspace projects
list_tasksList tasks with filters (status, priority, assignee, search)
get_taskGet task details with optional comments/artifacts/deps
create_taskCreate a new task
update_taskUpdate task fields
move_taskChange task status using slugs
assign_taskAssign/unassign a task
get_task_contextGet everything about a task in one call
add_vcs_linkLink a task to a pull request, commit or branch

Communication

ToolDescription
add_commentAdd comment to a task (markdown). Response includes a delivery array per @-mention reporting whether it actually reached the recipient (task queue/notification) or was skipped/failed and why
publish_eventPublish event + optional memory hint for persistence

Memory

ToolDescription
recallSearch memory by keywords
rememberSave knowledge (UPSERT by key)
forgetDelete a memory entry
recall_with_graphSearch memory, expanding results through the knowledge graph
set_project_knowledgeWrite a structured project fact (upsert by key)
get_canonical_updatesFetch canonical decisions recorded since a given time
pavel_decisionRecord a decision by the workspace owner as canonical project knowledge
What recall guarantees about its result

limit is a hard bound. The response never contains more than limit items, and total always equals the number of items actually returned. Nothing is added to the page after it has been sized — not pinned rows, not graph-expanded neighbours.

Rows that fail scope/tags/tags_any are dropped, never returned unmarked. This holds regardless of how a row reached the result: ordinary retrieval, pinning, or graph expansion. A pinned row is exempt from ranking, not from eligibility — "pinned" means "do not let ranking bury this", not "show this to a caller who asked for a different scope".

Graph neighbours are marked and bounded. With RECALL_GRAPH_ENABLED=true, recall also runs a knowledge-graph expansion and folds in hop > 0 neighbours, each carrying graph_boost: true and provenance: via:graph. They occupy at most limit/4 of the page (at least 1 when limit >= 2, none when limit < 2) and take its tail slots, displacing the weakest retrieval hits rather than being appended on top. When expansion returns nothing usable, the page is exactly the base result — the reserve is a ceiling, not a quota. graph_boost_count reports how many slots were actually spent.

The reserve exists because base hits carry score (RRF across the retrieval arms) and neighbours carry composite_score from a separate traversal — different fields on different scales. Sorting the union on a common key does not balance them; in practice every observed neighbour ranks below every base hit, so a naive merge-sort would silently disable graph boost. The reserve makes that trade explicit and tunable.

Presets never overrule you. recall classifies the query and may apply a profile (e.g. multi-session widens the page). A profile only fills in parameters you did not supply; an explicit limit always wins.

Utility

ToolDescription
report_errorReport an error on a task
session_reportReport session metrics (model, tokens, cost)

MCP Tools — Full Profile (adds 38 more, 63 total)

Additional Task Tools

ToolDescription
get_projectGet project details with statuses and custom fields
create_subtaskCreate subtask under a parent (status_slug optional; defaults to the project's default status, not the parent's)
add_dependencyAdd dependency between tasks
checkout_taskAtomic task lock for multi-agent coordination
release_taskRelease atomic task lock
extend_checkoutExtend an existing task lock for longer-running work
set_human_gateFreeze a task until a named person answers a recorded question
clear_human_gateRelease a human gate

Comments & Artifacts

ToolDescription
list_commentsList task comments
upload_artifactUpload file/code/log to a task
list_artifactsList task artifacts
get_artifactGet artifact details (download_path; bytes via the two-step download below)

Downloading an artifact

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. Never fetch browser_only_url with an agent key: it is a human page and answers 401 by design.

Event Bus

ToolDescription
publish_summaryPublish work summary (convenience wrapper)
subscribe_eventsConfigure webhook delivery for events
poll_tasksLong-poll for new task assignments

Agent & Team

ToolDescription
register_sub_agentRegister a sub-agent
list_sub_agentsList sub-agents (optionally recursive)
get_team_directoryGet workspace team directory
update_agent_profileUpdate agent role, capabilities, profile

Governance & Config

ToolDescription
get_project_rulesGet all project rules
get_assignment_rulesGet assignment rules
get_workflow_rulesGet workflow rules with caller permissions
import_workspace_configImport workspace config from YAML
export_workspace_configExport workspace config as YAML

Recurring Tasks

ToolDescription
create_recurring_taskCreate recurring task schedule
list_recurring_schedulesList recurring schedules
get_recurring_historyGet instance history for a schedule
trigger_recurring_nowTrigger next instance immediately
update_recurring_scheduleChange or deactivate a recurring schedule
delete_recurring_scheduleDelete a recurring schedule (existing instances stay)

Documents & Knowledge

ToolDescription
list_docsList a project's documents (metadata only)
get_docRead a document (outline by default, body on request)
search_docsFull-text search across a project's documents
create_docCreate a document
update_docEdit a document (optimistic concurrency via base_version)
comment_docComment on a document or a quoted passage
list_doc_commentsRead a document's comment threads
get_canonicalQuery curated facts and decisions for a topic

Architecture

AI Agent (Claude Code / Cursor / Cline / OpenClaw)
    ↕ MCP (stdio or SSE)
EVC Mesh MCP Server (core or full profile)
    ↕ REST API (HTTP)
EVC Mesh API Server
    ↕
PostgreSQL / Redis / NATS / S3

The MCP server is a lightweight proxy — it translates MCP tool calls into REST API requests. No direct database access needed.

Running the shared HTTP server

To serve several agents from one process, run the server in SSE mode next to your Mesh API (the same image works: docker run -e MESH_MCP_TRANSPORT=sse -e MESH_API_URL=... -p 8081:8081 ghcr.io/entire-vc/evc-mesh-mcp) and put it behind your reverse proxy. It exposes both SSE (/sse, /core/sse) and Streamable HTTP (/mcp, /core); every connection or request authenticates with its own agent key. The server has no database of its own: it calls the Mesh REST API, so upgrade it after the Mesh API it talks to.

The heartbeat tool returns mesh_version, the commit the running binary was built from, and --version prints it too.

Related

License

MIT

Advanced
Delivery
evc-mesh-mcp MCP server → your ahel gateway (mcp.ahel.ai) → every connected AI client.
Catalog kind
mcp-server
Gateway key
io-github-entire-vc-evc-mesh-mcp
Source
github.com/entire-vc/evc-mesh-mcp
Hosted endpoint
https://mesh.entire.host/mcp