action-controller
Version, currently 8.14.0139 versions
- 9.4.3latestNov 6, 2026
- 9.4.2not indexedNov 6, 2026
- 9.4.1not indexedNov 6, 2026
- 9.4.0not indexedNov 6, 2026
- 9.3.3not indexedNov 6, 2026
- 9.3.2Nov 2, 2026
- 9.3.1not indexedNov 2, 2026
- 9.3.0Oct 20, 2026
- 9.2.0Oct 15, 2026
- 9.1.4Oct 14, 2026
- 9.1.3not indexedOct 14, 2026
- 9.1.2not indexedOct 14, 2026
- 9.1.1Oct 9, 2026
- 9.1.0not indexedOct 9, 2026
- 9.0.0not indexedOct 9, 2026
- 8.15.0not indexedOct 9, 2026
- 8.14.1not indexedOct 9, 2026
- 8.14.0not indexedOct 9, 2026
- 8.13.0not indexedOct 9, 2026
- 8.12.0not indexedOct 9, 2026
- 8.11.0not indexedOct 9, 2026
- 8.10.0not indexedOct 9, 2026
- 8.9.1not indexedOct 9, 2026
- 8.9.0not indexedOct 9, 2026
- 8.8.0not indexedOct 9, 2026
- 8.7.0not indexedOct 9, 2026
- 8.6.0not indexedOct 9, 2026
- 8.5.0not indexedOct 9, 2026
- 8.4.0not indexedOct 9, 2026
- 8.3.4not indexedOct 9, 2026
- 8.3.3Oct 2, 2026
- 8.3.2not indexedOct 2, 2026
- 8.3.1not indexedOct 2, 2026
- 8.3.0not indexedOct 2, 2026
- 8.2.1Sep 24, 2026
- 8.2.0Sep 23, 2026
- 8.1.2Aug 19, 2026
- 8.1.1Aug 13, 2026
- 8.1.0not indexedAug 13, 2026
- 8.0.0Jun 30, 2026
- 7.6.1not indexedJun 30, 2026
- 7.6.0not indexedJun 30, 2026
- 7.5.3not indexedJun 30, 2026
- 7.5.2not indexedJun 30, 2026
- 7.5.1not indexedJun 30, 2026
- 7.5.0not indexedJun 30, 2026
- 7.4.4not indexedJun 30, 2026
- 7.4.3not indexedJun 30, 2026
- 7.4.2not indexedJun 30, 2026
- 7.4.1not indexedJun 30, 2026
- 7.4.0not indexedJun 30, 2026
- 7.3.1not indexedJun 30, 2026
- 7.3.0not indexedJun 30, 2026
- 7.2.3not indexedJun 30, 2026
- 7.2.2not indexedJun 30, 2026
- 7.2.1not indexedJun 30, 2026
- 7.2.0not indexedJun 30, 2026
- 7.1.1not indexedJun 30, 2026
- 7.1.0not indexedJun 30, 2026
- 7.0.4not indexedJun 30, 2026
- 7.0.3not indexedJun 30, 2026
- 7.0.2not indexedJun 30, 2026
- 7.0.1not indexedJun 30, 2026
- 7.0.0not indexedJun 30, 2026
- 6.1.2not indexedJun 30, 2026
- 6.1.1not indexedJun 30, 2026
- 6.1.0not indexedJun 30, 2026
- 6.0.1not indexedJun 30, 2026
- 6.0.0not indexedJun 30, 2026
- 5.6.4not indexedJun 30, 2026
- 5.6.3not indexedJun 30, 2026
- 5.6.2not indexedJun 30, 2026
- 5.6.1not indexedJun 30, 2026
- 5.6.0not indexedJun 30, 2026
- 5.5.4not indexedJun 30, 2026
- 5.5.3not indexedJun 30, 2026
- 5.5.2not indexedJun 30, 2026
- 5.5.1not indexedJun 30, 2026
- 5.5.0not indexedJun 30, 2026
- 5.4.3not indexedJun 30, 2026
- 5.4.2not indexedJun 30, 2026
- 5.4.1not indexedJun 30, 2026
- 5.4.0not indexedJun 30, 2026
- 5.3.14not indexedJun 30, 2026
- 5.3.13not indexedJun 30, 2026
- 5.3.12not indexedJun 30, 2026
- 5.3.11not indexedJun 30, 2026
- 5.3.10not indexedJun 30, 2026
- 5.3.9not indexedJun 30, 2026
- 5.3.8not indexedJun 30, 2026
- 5.3.7not indexedJun 30, 2026
- 5.3.6not indexedJun 30, 2026
- 5.3.5not indexedJun 30, 2026
- 5.3.4not indexedJun 30, 2026
- 5.3.3not indexedJun 30, 2026
- 5.3.2not indexedJun 30, 2026
- 5.3.1not indexedJun 30, 2026
- 5.3.0not indexedJun 30, 2026
- 5.2.0not indexedJun 30, 2026
- 5.1.9not indexedJun 30, 2026
- 5.1.8not indexedJun 30, 2026
- 5.1.7not indexedJun 30, 2026
- 5.1.6not indexedJun 30, 2026
- 5.1.5not indexedJun 30, 2026
- 5.1.4not indexedJun 30, 2026
- 5.1.3not indexedJun 30, 2026
- 5.1.2not indexedJun 30, 2026
- 5.1.1not indexedJun 30, 2026
- 4.10.1not indexedJun 30, 2026
- 4.10.0not indexedJun 30, 2026
- 4.9.0not indexedJun 30, 2026
- 4.8.0not indexedJun 30, 2026
- 4.7.3not indexedJun 30, 2026
- 4.7.2not indexedJun 30, 2026
- 4.7.1not indexedJun 30, 2026
- 4.7.0not indexedJun 30, 2026
- 4.6.0not indexedJun 30, 2026
- 4.5.2not indexedJun 30, 2026
- 4.5.1not indexedJun 30, 2026
- 4.5.0not indexedJun 30, 2026
- 4.4.1not indexedJun 30, 2026
- 4.4.0not indexedJun 30, 2026
- 4.3.6not indexedJun 30, 2026
- 4.3.5not indexedJun 30, 2026
- 4.3.4not indexedJun 30, 2026
- 4.3.3not indexedJun 30, 2026
- 4.3.2not indexedJun 30, 2026
- 4.3.1not indexedJun 30, 2026
- 4.3.0not indexedJun 30, 2026
- 4.2.2not indexedJun 30, 2026
- 4.2.1not indexedJun 30, 2026
- 4.2.0not indexedJun 30, 2026
- 4.1.0not indexedJun 30, 2026
- 4.0.0not indexedJun 30, 2026
- 3.5.2not indexedJun 30, 2026
- 3.5.1not indexedJun 30, 2026
- 3.5.0not indexedJun 30, 2026
- 3.4.2not indexedJun 30, 2026
- 3.4.1not indexedJun 30, 2026
github.com/spider-gazelle/action-controller
A rails-esque controller framework for crystal lang
Nothing has been indexed for 8.14.0 yet. The tag is recorded, its shard.yml has not been read, so the manifest and dependency list below are empty because they are unknown rather than because they are absent.
Installation
# Add this to your shard.yml
dependencies:
action-controller:
github: spider-gazelle/action-controller
version: ~> 8.14.0Then run:
shards installshard.yml
No shard.yml has been indexed for 8.14.0. You can read it on the repository.
Dependencies
Unknown: the shard.yml for this version has not been read yet.
README
This README is the one indexed from the repository at its latest ref, not from the tag for this version.
Spider-Gazelle Action Controller
A fast, type-safe web framework for Crystal. Write a method with typed arguments and a return type, and Action Controller parses the request, renders the response, documents the route in OpenAPI and serves it to AI agents over MCP.
Read the guide at spider-gazelle.net.
Features
- Strong parameters: path, query, header, form and body values become typed arguments, and invalid input is rejected before your code runs.
- OpenAPI 3.1 generation: the document is built from your routes, types and doc comments, so it stays in step with the code.
- MCP server: your routes become tools that Claude, ChatGPT and other agents can call through your filters and authentication, with prompts, resources, subscriptions and UI cards.
- Content negotiation: JSON and YAML out of the box, plus your own parsers and responders. Binary types, such as BinData, are read and written as they are.
- Filters, exception handlers and WebSockets, declared with annotations and inherited by subclasses.
- Composable applications: mount controllers or whole apps under other paths, with one routing table, OpenAPI document and MCP server.
- Performance: routes compile into a single routing trie with direct dispatch, and heavy routes can run on their own execution contexts. See how it compares in the web frameworks benchmark.
Installation
Start from the application template,
which includes logging, specs, Docker, OpenAPI and MCP, or add the shard to shard.yml:
dependencies:
action-controller:
github: spider-gazelle/action-controller
See your first app for a walkthrough.
Strong parameters
Arguments are read from the path, query string, headers or body by name, and converted
to their type. A required argument that's missing, or a value that doesn't convert,
raises an error your controller can turn into a 400:
require "action-controller"
abstract class Application < ActionController::Base
@[AC::Route::Exception(AC::Route::Param::Error, status_code: HTTP::Status::BAD_REQUEST)]
def invalid_param(error) : NamedTuple(error: String?, parameter: String?)
{error: error.message, parameter: error.parameter}
end
end
# Manages the books in the library
class Books < Application
base "/books"
struct Book
include JSON::Serializable
getter title : String
getter year : Int32
def initialize(@title, @year)
end
end
enum Genre
Fiction
History
Science
end
# Searches the catalogue
# GET /books?genre=history&tag=war&tag=empire&limit=5
@[AC::Route::GET("/")]
def index(
genre : Genre? = nil,
tag : Array(String) = [] of String,
@[AC::Param::Info(description: "results per page")]
limit : Int32 = 20,
) : Array(Book)
[] of Book
end
# Fetches a book by its ID, in decimal or hex
# GET /books/42 or /books/2A/hex
@[AC::Route::GET("/:id")]
@[AC::Route::GET("/:id/hex", config: {id: {base: 16}})]
def show(id : UInt64) : Book
Book.new(title: "Dune", year: 1965)
end
# Adds a book
@[AC::Route::POST("/", body: :book, status_code: HTTP::Status::CREATED)]
def create(book : Book) : Book
book
end
end
Optional arguments take their default, enums parse by name or value, arrays and sets collect every repetition of a name, and custom converters handle anything else. See parameters and responses.
OpenAPI
The routes above describe themselves: paths, parameters, schemas for Book and
Genre, status codes, and the doc comments as summaries. Generate the document with the
template's --docs flag, or in code:
docs = ActionController::OpenAPI.generate_open_api_docs(title: "Library", version: "1.0.0")
File.write("openapi.yml", docs.to_yaml)
See OpenAPI.
MCP server
Mount the Model Context Protocol server and every annotated route is a tool, described by the same comments and types:
require "action-controller/server"
require "action-controller/mcp"
server = ActionController::Server.new
ActionController::MCPServer.mount(server, "/mcp")
server.run
Calls are dispatched through the router with the client's headers, so filters,
authentication and exception handlers apply as they do to any request. Controllers are
listed as toolboxes to keep the model's context small, and @[AC::MCP(...)] adds
prompts, resources and UI cards. See MCP.
More information
- The guide: routing, filters, errors, sessions, WebSockets, testing, composition and deployment
- API reference
- Execution contexts: run heavy routes on dedicated scheduler pools
- Web frameworks benchmark results, and the routing benchmarks in this repo
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This release
- Version
8.14.0- Tagged
- Oct 9, 2026
- Commit
f3985b8e3621- Indexed
- not yet
Dependents
- placeos-auth
- placeos-source
- build-api
- placeos-init
- placeos-build
- placeos-build
- spider-gazelle
- placeos-resource
- ai-support-agent
- placeos-driver
- placeos-driver
- placeos-triggers
and 29 more
Repository
github.com/spider-gazelle/action-controller
Metadata
- Created
- Aug 12, 2026
- Updated
- Nov 8, 2026
- Synced
- Nov 8, 2026
- Versions
- 139