mcp

package
v0.91.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 8, 2026 License: Apache-2.0 Imports: 28 Imported by: 0

README

Endly MCP

Build go build -o endly-mcp ./endly. Run ./endly-mcp mcp for stdio, or ./endly-mcp mcp -transport=streamable -addr=127.0.0.1:4981 for HTTP /mcp. HTTP binds only to loopback. Start in the workflow directory when its init uses $WorkingDirectory. Workflow print output is redirected to stderr in stdio mode.

Every manager action has an endly_<action> tool, generated from the same request contract as the REST control API: open/close/list sessions; load/list/unload workflows; listTasks; runWorkflow/startWorkflow/runAction; get/list/stop operations; inspectContext; set/get logging; getDebugState and debugCommand.

Open a session, load run.yaml, list tasks, then start a workflow. Empty tasks runs all tasks (equivalent to endly in an e2e directory); tasks=test selects the test task (equivalent to endly -t=test). Operations are asynchronous: use getOperation to inspect status, result, errors and retained events. Shared state defaults to true, so reruns reuse the session context. Debug runs pause at boundaries; inspect their operation snapshot, then step/next/continue. A new run reruns actions; continue resumes the existing paused operation.

selectorMode: path enables dotted paths and executes comma-separated selections in supplied order, retaining ancestor lifecycle/state. Legacy mode is unchanged. Repeated selections rerun their ancestors. A path is within the current workflow; it does not cross a nested run action. tagIds selects exact generated template TagIDs. listTasks returns a tree of paths and actions, with instances grouped by TagID. The ordinary loader expands templates during workflow loading. Referenced run workflows use Endly's existing resource/default fallback when loaded.

Skills are embedded with the binary and exposed via native skills/list, skills/get, resources/list and resources/read. Tool-only clients can call endly_skill_list, endly_skill_get (metadata plus entrypoint text) and endly_resource_read (references). Native skills/list and its tool alias paginate: follow nextCursor. HTTP catalog: GET /v1/endly/skills and GET /v1/endly/skills/. The existing /v1/endly/sessions API shares the same runtime. It additionally exposes GET /v1/endly/sessions//workflows//tasks?path=.

Regenerate service skills with python3 tools/generate_skills.py when maintained service references change. General authoring, orchestration, testing methodology, project patterns and dsunit function skills are maintained separately. A skill provides instructions; reading one does not execute or authorize its actions.

Responses are concise by default. getOperation returns status/assertion counts; detail=true includes full results and retained events. endly_operation_events paginates by sequence (after, limit 1..200, optional types, detail). Event retention keeps the newest events and counts evictions. List sessions/workflows/operations with filter, offset and limit (default 20, max 100). endly_listInstances filters and pages exact IDs in the root's nested run context and exposes skip expressions. Use those IDs when running the root; IDs from a separately named workflow can differ. Path mode also filters unmatched template groups, while keeping ordinary setup. Assertion failures produce failed operations with passed/failed assertion counts. Enable -diagnostics for gops stack <pid>; shutdown is bounded to ten seconds.

Public skills use generic examples. Add project-specific skills only by explicitly passing repeatable -skill-dir /path/to/local-skill options; each directory contains SKILL.md and its own resources. Local skills are sealed and served at startup, and duplicate names fail registration. endly_service_info exposes live service IDs/actions/request schemas without example payloads.

Native service tools

Extended tools dispatch registered source actions directly through the session manager. Their request schemas come from Endly's live routes, without example payloads. Available families are endly_dsunit_<action>, endly_http_runner_<action>, endly_http_endpoint_<action>, endly_validator_<action> and endly_validator_log_<action>. Each takes sessionId, request, and optional timeoutMillis, and returns a concise asynchronous operation summary. Use getOperation, operation_events and inspectContext to observe it. This preserves shared state, source initialization and validation, cancellation and action authorization. Omitted services in a custom registry do not produce tools. The generic runAction dispatcher remains available for all other registered service actions.

Documentation

Overview

Package mcp exposes Endly's stateful control runtime and skill catalog via MCP.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewHandler

func NewHandler(ctx context.Context, runtime *manager.Service, factory manager.ManagerFactory, localSkills ...fs.FS) (*protocol.DefaultHandler, error)

NewHandler registers every control action using its actual request contract. Both MCP and the web API share the supplied runtime, sessions and operations.

func NewServer

func NewServer(ctx context.Context, runtime *manager.Service, factory manager.ManagerFactory, localSkills ...fs.FS) (*mcpserver.Server, error)

NewServer builds stdio/streamable MCP plus the existing REST control API.

func Run

func Run(args []string, factory manager.ManagerFactory) error

Types

type EventsRequest

type EventsRequest struct {
	SessionID   string   `json:"sessionId"`
	OperationID string   `json:"operationId"`
	After       int64    `json:"after,omitempty"`
	Limit       int      `json:"limit,omitempty"`
	Types       []string `json:"types,omitempty"`
	Detail      bool     `json:"detail,omitempty"`
}

type InstancesRequest

type InstancesRequest struct {
	SessionID string `json:"sessionId"`
	Workflow  string `json:"workflow"`
	Path      string `json:"path,omitempty"`
	Filter    string `json:"filter,omitempty"`
	Offset    int    `json:"offset,omitempty"`
	Limit     int    `json:"limit,omitempty"`
}

type ServiceInfoRequest

type ServiceInfoRequest struct {
	Service string `json:"service,omitempty"`
	Action  string `json:"action,omitempty"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL