Aller au contenu principal

MCP Server

The Ever Works MCP (Model Context Protocol) server exposes the Ever Works API as tools that AI assistants like Claude can call directly. This enables natural-language management of works — creating works, generating items, deploying websites, and more — all through conversation.

When to use this

Connect the MCP server to Claude Desktop, Claude Code, or any MCP-compatible client to manage your Ever Works works through AI-powered conversation instead of manual API calls.

Prerequisites

  • A running Ever Works API instance
  • An API key for authentication
  • Node.js 20 or later

Architecture

The MCP server is a standalone NestJS application in apps/mcp/ that:

  1. Fetches the Ever Works API's OpenAPI spec at startup
  2. Filters endpoints through a curated whitelist of 127 operations
  3. Converts OpenAPI schemas to MCP tool definitions automatically
  4. Proxies tool calls to the API using your API key

This means tool descriptions, parameter names, types, and validation rules are always in sync with the API — no manual tool definitions to maintain.

Setup

Environment Variables

VariableRequiredDefaultDescription
EVER_WORKS_API_KEYYesAPI key for authentication
EVER_WORKS_API_URLNohttp://localhost:3100Base URL of the Ever Works API
EVER_WORKS_MCP_PORTNo3200Port for HTTP transport mode
MCP_TRANSPORTNostdioTransport: stdio or streamable-http
EVER_WORKS_SCOPE_SLUGNo— (personal scope)Organization slug every tool call runs under, sent as x-scope-slug (or @personal)

Organization scope

Every whitelisted route is unprefixed, so without EVER_WORKS_SCOPE_SLUG each call runs in the caller's personal scope: lists show personal Tasks / Goals / Agents only, and the Organization-only tools (Fleet node affinity) answer 400. Set the variable to an Organization slug to run under that Organization; the API resolves and authorises the slug exactly as it does for the web client, so it selects a scope the caller already has and cannot widen one. In HTTP mode the value applies to every caller of the server.

Build

pnpm build --filter=ever-works-mcp

Running

Stdio mode (for Claude Desktop and Claude Code):

EVER_WORKS_API_KEY=ew_live_... pnpm --filter=ever-works-mcp start:stdio

HTTP mode (for remote clients):

EVER_WORKS_API_KEY=ew_live_... pnpm --filter=ever-works-mcp start:http

In HTTP mode, all requests to the /mcp endpoint require an Authorization: Bearer <API_KEY> header.

Claude Desktop Integration

Add the following to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
"mcpServers": {
"ever-works": {
"command": "node",
"args": ["<path-to-repo>/apps/mcp/dist/stdio.js"],
"env": {
"EVER_WORKS_API_URL": "http://localhost:3100",
"EVER_WORKS_API_KEY": "ew_live_your_key_here"
}
}
}
}

Claude Code Integration

Add the MCP server to your project's .mcp.json:

{
"mcpServers": {
"ever-works": {
"command": "node",
"args": ["<path-to-repo>/apps/mcp/dist/stdio.js"],
"env": {
"EVER_WORKS_API_URL": "http://localhost:3100",
"EVER_WORKS_API_KEY": "ew_live_your_key_here"
}
}
}
}

Available Tools

The MCP server exposes 127 tools organized by domain. Each tool's parameters and descriptions are auto-generated from the API's OpenAPI specification. The authoritative list is apps/mcp/src/openapi-tools/whitelist.ts; apps/mcp/test/whitelist-tasks-inbox-goals-fleet.spec.ts checks the counts on this page against it.

Human-in-the-loop gates are not tools

The API cannot tell an MCP caller holding the owner's key from the owner. A tool that answered a gate would therefore let an Agent bound to this server approve its own proposal, resolve its own escalation or sign off its own definition of done. So the answering verbs are deliberately not exposed: POST /api/inbox/{id}/reply, POST /api/tasks/{id}/escalations/{escalationId}/resolve, POST /api/me/goals/{id}/dod/approve, the force flag of transition_task (the approver-gate override), and the requireAllApprovers field of create_task / update_task (the approver policy: with it false the → done approver check never runs, so a machine caller could pre-disarm a Task or switch its gate off before moving it — a machine-created Task keeps the API default and a person changes the policy in the app). Asking stays: an agent can propose criteria, post to a Task's chat, list escalations and read the Inbox; a person answers in the app. For the same reason, never bind this server to an Agent with the owner's API key or JWT — that hands the Agent the owner's identity.

Works (12 tools)

ToolDescription
list_worksList all works accessible to the user
create_workCreate a new work
get_workGet a specific work by ID
update_workUpdate work settings and configuration
delete_workDelete a work and its repositories
get_work_configGet work configuration and metadata
get_work_itemsGet all items in a work
get_categories_tagsGet categories and tags for a work
get_work_historyGet generation history
regenerate_markdownRegenerate markdown files for all items
update_websiteTrigger a website rebuild
process_community_prsProcess community pull requests

Generation (4 tools)

ToolDescription
generate_itemsStart AI-powered item generation
update_itemsUpdate existing items using AI
generate_work_detailsAI-generate work details from a prompt
get_generator_formGet the dynamic generator form schema

Items (4 tools)

ToolDescription
submit_itemAdd a single item to a work
remove_itemRemove an item from a work
update_itemUpdate item metadata (featured, order)
extract_item_detailsExtract item details from a URL using AI

Deployment (4 tools)

ToolDescription
deploy_workDeploy a work to a hosting provider
list_domainsList custom domains for a work
list_deploy_providersList available deployment providers
check_deploy_capabilityCheck if deployment is available

Plugins (5 tools)

ToolDescription
list_pluginsList all available plugins
get_pluginGet plugin details and settings
enable_pluginEnable a plugin for the user
disable_pluginDisable a plugin
update_plugin_settingsUpdate plugin configuration

Scheduling (4 tools)

ToolDescription
get_scheduleGet scheduled update configuration
update_scheduleUpdate schedule (cadence, enable/disable)
cancel_scheduleCancel scheduled updates
run_scheduled_updateManually trigger a scheduled update

Comparisons (5 tools)

ToolDescription
list_comparisonsList all comparisons for a work
get_comparisonGet a comparison with markdown content
generate_comparisonAuto-generate the next comparison
generate_manual_comparisonGenerate comparison for two specific items
delete_comparisonDelete a comparison

Tasks (23 tools)

Tasks are units of work an Agent executes (on the cloud runtime or on one of the owner's Fleet nodes); the Task's PR, diff, chat and spend are readable here.

ToolDescription
list_tasksList my Tasks (filter by status, priority, scope, label, search)
create_taskCreate a Task (no requireAllApprovers; see the gates note above)
get_taskGet one Task
update_taskUpdate Task fields (partial; no requireAllApprovers)
delete_taskDelete a Task
list_task_subtasksSubtasks of a Task
get_task_activityActivity rows (created / updated / transitioned / dispatched)
transition_taskMove a Task between statuses (no force; the approver gate applies)
get_task_run_candidatesAgents that could run this Task
run_taskDispatch a run of the Task to an Agent
run_tasks_batchDispatch several Tasks at once
get_task_pr_statusPull-request status of the Task's branch
get_task_diffDiff of the Task's branch (capped)
discard_task_branchThrow away the Task's pushed branch (irreversible)
reject_taskReject the Task's result with feedback
assign_taskAdd an assignee
add_task_reviewerAdd a reviewer
add_task_approverAdd an approver
add_task_relationRelate two Tasks (related, duplicates, follow-up)
list_task_escalationsEscalations raised on the Task (resolving one is a human gate)
get_task_chatPaginated chat thread
post_task_chat_messagePost a chat message on the Task
get_task_spendPer-Task spend rollup

Inbox (7 tools)

The Inbox is where agents ask humans for decisions and approvals. The tools read and triage it; answering an item (POST /api/inbox/{id}/reply) is the approval itself and is done by a person in the app.

ToolDescription
list_inboxList Inbox items (active view by default)
get_inbox_unread_countUnread count
get_inbox_itemGet one item with its question and options
mark_inbox_item_readMark read (or unread again)
archive_inbox_itemArchive an item
unarchive_inbox_itemBring an archived item back
delete_inbox_itemDelete an item

Goals (10 tools)

Goals are outcome-driven autopilot: the platform observes a metric and dispatches Tasks toward a definition of done. Approving proposed criteria (POST /api/me/goals/{id}/dod/approve) is a human gate and is not a tool.

ToolDescription
list_goalsList my Goals
create_goalCreate a Goal
get_goalGet one Goal
update_goalUpdate Goal fields (partial)
get_goal_samplesObservation history (newest first)
activate_goalActivate a Goal
pause_goalPause a Goal
evaluate_goal_nowEvaluate the Goal immediately
update_goal_limitsChange the Goal's spend / iteration limits
propose_goal_dodAppend proposed definition-of-done criteria for a person to approve (proposed criteria never count toward completion)

Fleet (8 tools)

The Fleet is the owner's own machines enrolled as nodes; node-facing routes (enroll, heartbeat, lease) and enrollment tokens are deliberately not exposed. The three node-affinity tools are Organization-scoped: they need EVER_WORKS_SCOPE_SLUG (see Organization scope) and answer 400 in the personal scope.

ToolDescription
list_fleet_nodesList enrolled nodes with status and capabilities
get_fleet_nodeOne node with its recent jobs
get_fleet_runner_statusIs a runner available right now
get_fleet_execution_preferencesWhere each job kind runs (local-wait / local-fallback / cloud)
get_agent_node_affinityWhich node an Agent is pinned to
set_agent_node_affinityPin an Agent to a node
clear_agent_node_affinityRemove the pin
drain_fleet_nodeDrain a node: disable it and requeue its in-flight claims at once (drain: false returns it to service)

Agents (9 tools)

Agents are the workers; runs are their executions.

ToolDescription
list_agentsList my Agents
get_agentGet one Agent
list_agent_runsRun history of an Agent
get_agent_runOne run with its step logs
run_agent_nowStart a run immediately
cancel_agent_runCancel a queued or running run
pause_agentPause an Agent
resume_agentResume a paused Agent
get_agent_budgetBudget and spend of an Agent

Agent Plugins (4 tools)

Read-only by design. Installing an Agent Plugins package installs skills — instructions the agent then follows — and this server is reachable by agents processing scraped web content and community-PR text, so an install tool would let a prompt-injected run acquire its own future instructions. Install, resync and the allowlist routes stay available to a human through the API, web UI and CLI; only the tool surface excludes them.

  • list_agent_plugin_packages — installed packages
  • list_agent_plugin_findings — validation findings recorded at install
  • list_agent_plugin_catalog_entries — skills contributed by packages
  • list_agent_plugin_updates — packages with a newer version available

Adding New Tools

To expose a new API endpoint as an MCP tool:

  1. Add Swagger decorators to the API endpoint — @ApiOperation, @ApiParam, @ApiResponse, and @ApiProperty on the DTO fields
  2. Add a whitelist entry in apps/mcp/src/openapi-tools/whitelist.ts:
{
method: 'POST',
path: '/api/your-endpoint',
toolName: 'your_tool_name',
annotations: { readOnlyHint: false }
}
  1. Rebuild and restart the MCP server

The tool's description, parameters, and validation are derived automatically from the OpenAPI spec.

Security

  • Response sanitization — sensitive fields (passwords, API keys, tokens, secrets) are automatically stripped from all API responses before being returned to the AI client
  • API key authentication — all requests are authenticated with your Ever Works API key
  • Whitelist filtering — only explicitly allowed endpoints are exposed as tools
  • Human gates stay human — the routes that answer an approval, resolve an escalation, approve a definition of done, force a Task past its approvers or switch its approver policy off (requireAllApprovers) are not tools, so an Agent bound to this server cannot approve its own work; never bind the server to an Agent with the owner's credentials
  • Scope selection, not wideningEVER_WORKS_SCOPE_SLUG is forwarded as x-scope-slug and the API authorises the caller against it the same way it does for the web client
  • Request timeout — API calls time out after 2 minutes

Use it from any Agent Plugins client

Ever Works publishes this server as an Agent Plugins v1.0.0 package descriptor, so a client that supports the open standard can install it as an ordinary package instead of following the configuration steps above by hand.

The descriptor declares one streamable-http server and nothing else — no skills, and deliberately no credentials. The specification treats package-configured headers as visible and non-secret, so a descriptor that embedded an API key would publish that key to everyone who installed it. Authentication stays where it belongs: your client supplies its own key, exactly as it does for the manual configuration above.

Generate the descriptor with:

ever-works plugins agent-plugins descriptor

This writes a directory you can install directly, or archive if your client wants one. Point it at a self-hosted deployment by overriding the URL. Nothing in this page's manual configuration changes — the descriptor is an additional way to consume the same server, not a replacement for it.

See the conformance statement for what Ever Works implements of the standard, including what it does not.