effect-actions
Define an Effect action once and expose it over HTTP, MCP, native Toolkits, and CLIs.
Install / Use
claude mcp add gjermundgaraba -- npx -y github:gjermundgaraba/effect-actionsIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Development & EngineeringSupported Platforms
Tags
Our assessment of effect-actions
effect-actions scores 78/100 on our quality scale, 3644th of 4,594 Development & Engineering skills we index.
Its MCP Server is 8.6 KB long, well organised into 10 sections with 10 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so effect-actions is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 87/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-10-14. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
effect-actions compared with similar skills
All 4 of these similar skills score higher than effect-actions; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| effect-actions (this skill)by gjermundgaraba | 78 | 3 | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 97.1k | 5d ago | CLAUDE.md |
| taste-skillby Leonxlnx | 100 | 95.7k | today | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 75.3k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.4k | today | CLAUDE.md |
Frequently asked questions
- How do I install effect-actions?
- Run
claude mcp add gjermundgaraba -- npx -y github:gjermundgaraba/effect-actions. The install tabs above show the steps for each supported agent. - Which AI agents does effect-actions work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is effect-actions safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 87/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is effect-actions still maintained?
- The repository was last updated today, so effect-actions is actively maintained.
Skill content
View source on GitHubeffect-actions
Define an Effect action once. Serve it over HTTP, MCP and Effect RPC, hand it to a model as a native Toolkit, and run it from a CLI. Same schemas, same handler, Effect's own servers and clients underneath.
If you are a coding agent, start at docs/README.md, not here, and read one page per tool call, again alone if its output says it was truncated. It routes every task, protecting an action and limiting request bodies included, to its page and its example.
Looks like this
A contract says what an action takes and answers, and who may call it:
import { Schema } from "effect";
import * as Action from "@gjermundgaraba/effect-actions/Action";
// A contract: what the action takes and answers, whether it changes anything, and who may
// call it. It imports no server code, so any client can import it, a browser page included.
export const Greet = Action.make("greet", {
description: "Greet someone by name.",
input: { name: Schema.String },
success: Schema.String,
readOnly: true,
caller: Action.Anyone,
});
An implementation binds it to its handler:
import { Effect } from "effect";
import * as Action from "@gjermundgaraba/effect-actions/Action";
import { Greet } from "./Greeting.js";
// The implementation: the contract bound to its handler. Every surface takes this one value.
export const greeting = Action.implement(Greet, ({ name }) => Effect.succeed(`Hello, ${name}!`));
A binding gives it a route, for the server to serve and a client to call:
import * as ActionHttp from "@gjermundgaraba/effect-actions/ActionHttp";
import { Greet } from "./greeting/Greeting.js";
// The HTTP binding: `POST /api/greet`. The server serves it and the client calls it.
export const Http = ActionHttp.make([Greet]);
And the same implementation is served on every surface the host wants:
import { Layer } from "effect";
import * as ActionHttp from "@gjermundgaraba/effect-actions/ActionHttp";
import * as ActionMcp from "@gjermundgaraba/effect-actions/ActionMcp";
import { Http } from "./Api.js";
import { greeting } from "./greeting/handlers.js";
// One implementation, two surfaces: a JSON route and an MCP tool at `/mcp`.
export const routes = Layer.mergeAll(
ActionHttp.layer(Http, greeting),
ActionMcp.layerHttp(greeting, { name: "greetings", version: "1.0.0" }),
);
Serve routes with Effect's HttpRouter.serve and a platform server, as
examples/quickstart/src/server.ts does, and you have
POST /api/greet and an MCP tool named greet at /mcp. The same greeting
implementation is also:
const { toolkit, layer } = ActionToolkit.make(greeting); // native Effect AI Toolkit and its handler layer
const cli = ActionCli.make(greeting, { name: "greetings" }); // greetings greet --name Ada
const remote = ActionCli.remoteCommand(Http, Greet, { client: { baseUrl } }); // greet --name Ada, over HTTP
const local = Action.client(greeting); // the HTTP client's methods, in process
const rpc = ActionRpc.layer(ActionRpc.make([Greet]), greeting); // Effect RPC, on the protocol the host provides
And the client is Effect's own HttpApiClient, typed from the same contract, one method per action:
const greeting = Effect.gen(function* () {
const client = yield* ActionHttp.client(Http, { baseUrl });
return yield* client.greet({ name: "Ada" });
});
Why
- Input, success and errors are declared once. Routes, tools, CLI flags, clients and the OpenAPI document are derived from that declaration, so they cannot disagree.
- A handler can fail only with the errors its action declares and three built-in ones (400, 401, 403), and every client decodes them as typed values.
- Every contract states who may call it:
caller: Action.Anyone, or the identity service a caller must have. A surface authenticates a protected action's request before decoding its input, with the provider the application builds from its own token verifier. - Authorization is written once, on the implementation:
Action.implement(actions, handlers, { authorize }), required for protected actions. Every surface runs it before each handler, and the rule reads the contract'sreadOnlyinstead of a hand-maintained list of mutation names. - Public and protected routes share one binding, one OpenAPI document and one client, and a handler's startup services are built once per layer graph, however many surfaces serve it.
- The pieces are Effect's own: a native
HttpApi,McpServer,RpcServerandRpcClient, with no SDK runtime dependency, so OpenAPI, Swagger, Scalar andHttpApiClientwork unchanged. - Tests run in memory:
Action.clientcalls an implementation in process, andTesting.layer(routes)serves the routes and tools to typed clients without opening a port.
Install
pnpm add @gjermundgaraba/effect-actions effect@~4.0.4
It needs TypeScript 7 or newer and is ESM only
(docs/setup.md). Add @effect/platform-node@~4.0.4 to serve or run a CLI from Node. Every module is a
subpath import (.../Action, .../ActionHttp, ...); there is no package root, so a
contracts-only bundle never loads a server.
Examples
examples/ holds complete applications, each a directory you can run, with its own tests, laid out the way we recommend for an application: a folder per domain, the contract in one file a browser can import, one entrypoint per way of running it. They are type-checked and tested with the library and ship in the package.
- quickstart: the program above.
- notes-service: a service with bearer authentication, a JSON API and MCP tools from one implementation, a CLI and a browser client. Most applications are this.
- mcp-tools: an MCP server whose tools wrap an upstream HTTP API.
- assistant: no server, the same implementations as a model's tools and as local commands.
- live-rpc: Effect RPC over a WebSocket.
- kitchen-sink: every module and nearly every option in one application, with an index from each to the file that shows it.
Docs
docs/ is written for coding agents: one short page per module, organized by task, each linking to the example files that show the task working.
- docs/README.md: start here: which page answers which task, and which surface to use for which caller.
- docs/guarantees.md: what each case looks like on the wire, on every surface, and what the library leaves to the application.
- docs/CONTEXT.md: the vocabulary the docs and the code use.
For agents
The effect-actions skill puts the docs in front of a coding agent. With the
skills CLI, for any agent it supports:
npx skills add gjermundgaraba/effect-actions --skill effect-actions
As a Claude Code plugin:
/plugin marketplace add gjermundgaraba/effect-actions
/plugin install effect-actions@effect-actions-marketplace
As a Codex plugin:
codex plugin marketplace add gjermundgaraba/effect-actions
codex plugin add effect-actions@effect-actions-marketplace
The skill is generated from docs/ on the main branch, which can be ahead of the latest
release. Its links to the examples are paths into the installed package,
node_modules/@gjermundgaraba/effect-actions/examples, which an agent reads without a network;
the pages of the installed version are beside them, in
node_modules/@gjermundgaraba/effect-actions/docs.
Status
The effect peer admits the patches of the Effect release the package is tested against, since
the modules the surfaces build on may change in a minor release (see docs/setup.md). Actions are unary JSON over HTTP, MCP and Effect RPC, whose protocols speak JSON alone: no streaming or uploads.
Token verification and the authorization rule belong to the application; the library supplies the authentication descriptor and provider, runs the rule, and answers the refusals. See docs/guarantees.md.
Acknowledgements
A few ideas (like the native Toolkit and CLI projections) are inspired by the excellent rat-stack by Joel Hooks.
Contributing
The rules for changing the library are in AGENTS.md. MIT licensed.
Related Skills
Agent-Reach
97.1kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
taste-skill
95.7kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
headroom
75.3kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.4kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
